关于"收益"和"下一步"行为的问题

Rex*_*zle 2 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))
Run Code Online (Sandbox Code Playgroud)

我将列表转换为生成器是有原因的,因为它是来自api调用的响应,并且想要动态返回列表中的下一个项目,并且如果它到达该列表的末尾则进行api调用.

sch*_*ggl 7

每次打电话都会创建一个新的生成器.您应该将属性返回的生成器存储到变量中.然后你就可以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)

给出了一个更静态的属性的印象,每次都产生相同的对象.你可以在这里找到更多详细说明 .