【问题标题】:What does "for i in generator():" do? [duplicate]“for i in generator():”有什么作用? [复制]
【发布时间】:2015-08-05 23:42:18
【问题描述】:

有人能解释一下其中的每个步骤是做什么的吗?

我从未见过“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)

【问题讨论】:

标签: python for-loop generator


【解决方案1】:

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.

【讨论】:

    【解决方案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 的来源:-)

    【讨论】:

      【解决方案3】:

      要理解这一点,您必须了解 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 永远不会得到错误值。它一直在运行。

      【讨论】:

        【解决方案4】:

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

        请注意,虽然fib 不是函数,但它是一个生成器。它依次产生每个步骤的值。

        【讨论】:

        • 我不知道函数不是生成器。是否有一个链接可以指向我来解释它们之间的区别?
        • 快速谷歌搜索显示thisthis。不过,这更像是一个附属点:如果 fib 是一个返回 [1, 2, 3, 4] 的普通函数,那么代码也可以正常工作,for 仍然会遍历它。
        • fib 仍然是一个函数。 type(fib) = <type 'function'>.
        猜你喜欢
        • 2021-12-21
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2015-09-09
        • 2017-05-17
        相关资源
        最近更新 更多