gpt4 book ai didi

python - 类中的生成器表达式未产生我期望的输出

转载 作者:太空狗 更新时间:2023-10-30 00:33:00 24 4
gpt4 key购买 nike

我想使用一些生成器表达式作为一些昂贵的数据计算的属性。如果可能的话,我希望能够做这样的事情:

class Test:
def __init__(self):
self.data = []
self.evens = (i for i in self.data if i % 2 == 0)

def __main__():
t = Test()
t.data = [1,2,3,4,5,6,7,8]

for item in t.evens:
print(item)

if __name__ == '__main__':
__main__()

我希望看到打印出 2 4 6 8 但这没有输出。我在这里犯了一些简单的错误吗?

我在这里尝试做的事情是可能的还是我需要使用 yield 来做这件事?

最佳答案

虽然其他答案已正确诊断出错误(您的 evens 生成器正在使用原始的空 data 列表进行初始化),但我认为建议设置一个值对于 data 仍然不会执行您想要的操作。

目前你只能遍历evens一次,并且在你这样做之后它就会被消耗掉。我认为您想要的是 evens 始终可以作为当前 data 值具有的偶数值的生成器访问。这样做的方法是使它成为一个属性,并带有一个函数,该函数在每次调用时返回生成器:

class Test:
def __init__(self):
self.data = []

@property
def evens(self):
return (i for i in self.data if i % 2 == 0)

用法:

>>> t = Test()
>>> t.data = [1, 2, 3, 4, 5, 6]
>>> list(t.evens)
[2, 4, 6]
>>> list(t.evens) # works more than once
[2, 4, 5]
>>> t.data = [10, 15, 20, 25, 30]
>>> list(t.evens)
[10, 20, 30]

如果您需要一个更复杂的生成器,您可以在函数中使用 yield,而不是返回一个生成器对象,但是生成器表达式很容易获得偶数值。

关于python - 类中的生成器表达式未产生我期望的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18293178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com