什么“为我在发电机():”做什么?

时间:2015-05-24 10:09:24

标签: python for-loop generator

有人可以解释一下这里的每一步吗?

我从来没有见过“for in 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)

4 个答案:

答案 0 :(得分:2)

for只是表达式的范围。如果表达式调用一个函数,那么它的值是函数返回的值,因此for函数的结果范围就是。

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

答案 1 :(得分:2)

任何包含yield的函数都会返回generator。 for循环运行该生成器一次返回一个值。

当你跑步时:

for i in fib():
    print(i)

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

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

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

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

答案 2 :(得分:1)

如果您像上面一样使用它,

for loop会生成一次性变量。例如,list object在循环中一次又一次地使用,但一次性迭代器在使用后会自动删除。

yieldreturn这样的术语,用于函数中。它给出了一个结果并在循环中再次使用它。 您的代码为您提供了称为斐波纳契的数字。

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.

答案 3 :(得分:0)

要理解这一点,您必须了解fib()关键字的作用。请看一下:reference

现在你知道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

由于{{1}}永远不会获得错误值。它一直在运行。