关于"来自"的收益的问题和" next"行为

时间:2017-12-20 17:31:14

标签: python

所以我从列表中创建一个生成器,但是想在其上调用next,它应该只返回列表中的下一个项目,但是它返回相同的对象,即整个代码段再次运行刚刚返回产量部分。下面的示例显示循环遍历列表时的预期行为,但接下来返回1两次,而我希望第二次调用next返回2.

class demo:
    @property
    def mygen(self):
        a = [1,2,3,4,5]
        b = [6,7,8,9,10]
        yield from a
        yield from b

if __name__=='__main__':
    demo1 = demo()
    print([_ for _ in demo1.mygen])
    demo2 = demo()
    print(next(demo2.mygen))
    print(next(demo2.mygen))

有一个原因我正在将列表转换为生成器,因为它是来自api调用的响应,并且想要动态返回列表中的下一个项目并且如果它到达结束时进行api调用那份清单。

1 个答案:

答案 0 :(得分:7)

每次调用该属性都会创建一个新的生成器。您应该将属性返回的生成器存储到变量中。然后,您就可以多次拨打next。变化

print(next(demo2.mygen))
print(next(demo2.mygen))  # calls next on a fresh generator

gen = demo2.mygen
print(next(gen))
print(next(gen))  # calls next on the SAME generator

正如其他人所指出的那样,这种行为应该让你重新考虑将这个属性作为一个属性。看到

demo2.mygen()

更明显的是,有一些动态的东西正在进行,而

demo2.mygen

给人的印象是每次生成相同对象的更静态属性。您可以在here找到更多详细信息。