shu*_*e87 5 python class generator python-3.x
我想使用一些生成器表达式作为一些昂贵的数据计算的属性.如果可能的话,我希望能够做到这样的事情:
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__()
Run Code Online (Sandbox Code Playgroud)
我希望看到这个打印输出,2 4 6 8但这没有输出.我在这里犯了一些简单的错误吗?
我想在这里做什么可能或我需要yield用来做这个?
虽然其他答案已正确诊断错误(您的evens生成器正在使用原始空data列表进行初始化),但我认为设置值的建议data仍然不会达到您想要的效果.
目前你只能迭代evens一次,然后你就会消耗它.我认为你想要的是evens始终可以作为当前data值具有的偶数值的生成器来访问.这样做的方法是使它成为property一个函数,每次调用它时返回生成器:
class Test:
def __init__(self):
self.data = []
@property
def evens(self):
return (i for i in self.data if i % 2 == 0)
Run Code Online (Sandbox Code Playgroud)
用法:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
如果你需要一个更复杂的生成器,你可以yield在函数中使用,而不是返回一个生成器对象,但生成器表达式可以很容易地获得偶数值.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |