所以我从列表中创建一个生成器,但是想在其上调用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调用那份清单。
答案 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找到更多详细信息。