类中的生成器表达式不会产生我期望的输出

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用来做这个?

Blc*_*ght 6

虽然其他答案已正确诊断错误(您的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在函数中使用,而不是返回一个生成器对象,但生成器表达式可以很容易地获得偶数值.