为啥生成器函数不适用于下一次调用? [复制]
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 "范围类型优于常规列表或元组的优点是范围对象将始终占用相同(少量)的内存,无论它表示的范围大小如何(因为它只存储 start
、stop
和 step
值,根据需要计算单个项目和子范围)。"
【参考方案1】:
每次调用getPositiveCount()
都会创建一个全新的生成器。你在想这个:
gen = getPositiveCount()
print(next(gen))
print(next(gen))
print(next(gen))
【讨论】:
以上是关于为啥生成器函数不适用于下一次调用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 viewPager 的 setCurrentItem() 适用于下一页而不适用于上一页?
调用`async for in`后如何获得异步生成器的下一次迭代