所以我从列表中创建一个生成器,但是想在其上调用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))
Run Code Online (Sandbox Code Playgroud)
我将列表转换为生成器是有原因的,因为它是来自api调用的响应,并且想要动态返回列表中的下一个项目,并且如果它到达该列表的末尾则进行api调用.
每次打电话都会创建一个新的生成器.您应该将属性返回的生成器存储到变量中.然后你就可以next多次打电话了.更改
print(next(demo2.mygen))
print(next(demo2.mygen)) # calls next on a fresh generator
Run Code Online (Sandbox Code Playgroud)
至
gen = demo2.mygen
print(next(gen))
print(next(gen)) # calls next on the SAME generator
Run Code Online (Sandbox Code Playgroud)
正如其他人所指出的那样,这种行为应该让你重新考虑将其作为一个属性.眼见
demo2.mygen()
Run Code Online (Sandbox Code Playgroud)
更明显的是,有一些动态的东西正在发生,而
demo2.mygen
Run Code Online (Sandbox Code Playgroud)
给出了一个更静态的属性的印象,每次都产生相同的对象.你可以在这里找到更多详细说明 .
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |