"for i in generator():" 是做什么的?

What does "for i in generator():" do?

谁能解释一下每一步的作用?

我从未见过 "for i in X:" 在 X 是生成器的地方使用过,而且我无法理解如果 i 没有插入 () 之间,它是如何与函数交互的。

def fib():
    a, b = 0,1
    while True:
        yield b
        a,b = b, a + b
for i in fib():
    print(i)

for 刚好超过表达式的值。如果表达式调用一个函数,那么它的值就是函数返回的任何值,因此 for 范围超过该函数的结果。

注意,这里的fib虽然不是一个函数,但它是一个生成器。它连续产生每个步骤的值。

任何包含 yield will return a generator 的函数。生成器 return 的 for 循环 运行 一次一个值。

当你运行:

for i in fib():
    print(i)

运行发电机的实际机制是:

_iterator = iter(fib())
while True:
    try:
        i = next(_iterator)
    except StopIteration:
        break
    print(i)

如你所见,i 变量被赋值为在生成器上调用 next() 以获取下一个值的结果.

希望能说明 i 的来源:-)

要理解这一点,您必须了解 yield 关键字的作用。请看这个:What yield does?

现在您知道 fib() 不是函数,而是生成器。 所以在代码中:

def fib():
    a, b = 0,1
    while True:
        yield b    #from here value of b gets returned to the for statement
        a,b = b, a + b
for i in fib():
    print(i)

因为 While 永远不会得到错误的值。它保持 运行.

for loop 如果你像上面那样使用它会生成一次性变量。例如,一个 list object 在循环中被反复使用,但一次性迭代器在使用后自动删除。

yield 是类似 return 的术语,用于函数中。它给出一个结果并在循环中再次使用它。 您的代码为您提供了称为斐波那契的数字。

def fib():
    a, b = 0,1 #initially a=0 and b=1
    while True: #infinite loop term.
        yield b #generate b and use it again.
        a,b = b, a + b #a and b are now own their new values.

for i in fib(): #generate i using fib() function. i equals to b also thanks to yield term.
    print(i) #i think you known this
    if i>100:
        break #we have to stop loop because of yield.