迭代生成器功能的问题

时间:2020-04-28 20:28:40

标签: python iterator iteration generator

假设我们具有此生成器功能:

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)))有什么不同吗?!

2 个答案:

答案 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调用的结果存储在变量中时,您将存储生成器。此外,您可以从生成器中获取值,并将其存储在变量中。