为啥生成器函数不适用于下一次调用? [复制]

Posted

技术标签:

【中文标题】为啥生成器函数不适用于下一次调用? [复制]【英文标题】:Why generator function does not work with the next call? [duplicate]为什么生成器函数不适用于下一次调用? [复制] 【发布时间】:2021-12-29 21:37:46 【问题描述】:

生成器函数:

def getPositiveCount():
    n = 0
    while n<100:
        yield n
        n+=1

上面的生成器函数在next(..) 方法中调用时没有达到预期的效果。为什么下一个调用总是返回 0?

print(next(getPositiveCount())) # prints 0
print(next(getPositiveCount())) # prints 0; should've printed 1
print(next(getPositiveCount())) # prints 0; should've printed 2

但是,如果我在循环中设置它就可以了:

for i in getPositiveCount():
    print(i)

# prints 0,1,2 ... 99
    

这同样让我问,生成器函数是否与生成器表达式相同(通常使用范围、xrange 或类似的内置函数)?例如生成器表达式中的 next 调用完美运行:

squares = (n** 2 for n in range(5))
print(next(squares)) # 0
print(next(squares)) # 1
print(next(squares)) # 4

【问题讨论】:

旁注:做起来更简单for n in range(100): yield n range(100) 不占内存? @wjandrea 它没有。你可能在想of Python 2。 @wjandrea 有什么办法可以看出它在python3中不占用内存,例如使用反射? 您可以阅读文档:Ranges "范围类型优于常规列表或元组的优点是范围对象将始终占用相同(少量)的内存,无论它表示的范围大小如何(因为它只存储 startstopstep 值,根据需要计算单个项目和子范围)。" 【参考方案1】:

每次调用getPositiveCount() 都会创建一个全新的生成器。你在想这个:

gen = getPositiveCount()
print(next(gen))
print(next(gen))
print(next(gen))

【讨论】:

以上是关于为啥生成器函数不适用于下一次调用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 viewPager 的 setCurrentItem() 适用于下一页而不适用于上一页?

调用`async for in`后如何获得异步生成器的下一次迭代

python-day5-生成器迭代器及递归调用

为啥数据表不适用于gridview? [复制]

使用官方cli生成项目时,tailwind样式不适用于下一个js

为啥百分比高度不适用于我的 div? [复制]