假设我们具有此生成器功能:
def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1
现在,如果我想调用next()
函数,则必须将count_up_to
函数分配给一个变量,否则输出将始终为“ 1”。
下面的代码可以正常工作并遍历数字:
counter = count_up_to(10)
print(next(counter))
print(next(counter))
print(next(counter))
.
.
.
但是这个不起作用,并且继续打印“ 1”。
print(next(count_up_to(10)))
print(next(count_up_to(10)))
print(next(count_up_to(10)))
.
.
.
但是为什么呢? print(next(counter))
与print(next(count_up_to(10)))
有什么不同吗?!
答案 0 :(得分:3)
在最后一个代码段中,您总是制作一个新的生成器,这就是为什么它总是打印“ 1”的原因。
在第二个中,将count_up_to返回的生成器分配给变量count,而不是函数。每次调用next(count)时,您都告诉生成器产生下一个值。
我希望这会有所帮助:)
答案 1 :(得分:2)
这是完全预期的行为。让我描述一下原因。
每次调用count_up_to都会返回一个从1开始的新生成器。
在Python REPL中进行简单检查:
>>> count_up_to(100)
<generator object count_up_to at 0x10e28beb0>
>>> count_up_to(100)
<generator object count_up_to at 0x10e28bf00>
>>> count_up_to(100)
<generator object count_up_to at 0x10e28beb0>
>>> count_up_to(100)
<generator object count_up_to at 0x10e28bf00>
查看地址。总是不同的,内存中有4个不同的生成器。
因此,count_up_to函数本身不是生成器,但是在您调用它时会返回生成器。
当您将count_up_to调用的结果存储在变量中时,您将存储生成器。此外,您可以从生成器中获取值,并将其存储在变量中。