【问题标题】: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 值,根据需要计算单个项目和子范围)。"

标签: python python-3.x generator


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-02-13
    • 2018-01-14
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2014-12-12
    • 2019-12-28
    • 2022-07-05
    • 2016-10-05
    相关资源
    最近更新 更多