什么是函数中的“yield”声明?

可能重复:
解释了Python yield关键字

有人可以向我解释这段代码中的yield语句实际做了什么:

 def fibonacci():
     a, b = 0, 1
     while True:
         yield a
         a, b = b, a+b

对于fibonacci() :#使用生成器作为迭代器; 打印号码

到目前为止我所了解的是,我们正在定义一个函数finonacci() ,但没有参数? 在函数内部,我们定义ab等于0和1,接下来,虽然这是真的,但我们正在产生a 。 这究竟是在做什么? 此外,当产生aa现在等于b ,而b现在等于a + b

下一个问题,对于fibonacci() ,这是否意味着函数中的每个数字或什么? 我同样难以确定收益率和'数字'在实际上在做什么。 很明显,我知道这意味着每个数字在fibonacci()打印号码。 我是否真的在不知道的情况下定义数字?

谢谢,抱歉,如果我不清楚。 顺便说一下,这是欧拉项目,如果我知道如何编程好这将是一件轻而易举的事,但我试图在飞行中学习这一点。


使用yield可以使函数成为一个生成器。 生成器将继续在每个循环中生成a变量,直到调用生成器的next()方法继续进行下一个循环迭代。

或者,直到您returnStopIteration被提出。

稍作修改以显示StopIteration使用:

>>> def fib():
...     a = 0
...     b = 1
...     while True:
...         yield a
...         a = b
...         b += a
...         if a > 100:
...             raise StopIteration
...
>>>
>>> for value in fib():
...     print value
...
0
1
2
4
8
16
32
64
>>>

>>> # assign the resulting object to 'generator'
>>> generator = fib()
>>> generator.next()
0
>>> generator.next()
1
>>> for value in generator:
...     print value
...
2
4
8
16
32
64
>>>

生成器具有特殊的属性,可以作为迭代器使用,不会为其值存储内存。

他们通过计算新值来实现这一点,当迭代时需要它。

def f():
    a = 2
    yield a
    a += 1

for ele in f():
    print ele

会打印

 2

所以你正在使用一个函数作为一个持续返回值的迭代器。 这在您需要大量内存使用时尤其有用,因此您无法使用列表理解功能

li = [ele*10 for ele in range(10)]

需要10个内存空间作为列表

但如果你简单地想迭代它,不要单独访问它

这将是非常有效的内存使用

def f():
    i=0
    while i<10
        yield i*10
        i += 1

这将使用1个内存空间,因为我一直在重复使用

这是一个捷径

ge = (i*10 for i in range(10))

您可以执行以下任何操作

for ele in f():

for ele in li:

for ele in ge:

以获得相同的结果


当代码调用fibonacci时,会创建一个特殊的生成器对象。 请注意,没有代码被执行 - 只有一个生成器对象被返回。 当您稍后调用其next方法时,该函数将执行,直至遇到yield语句为止。 提供给yield的对象返回。 当再次调用next方法时,该函数将再次执行,直至遇到yield 。 当没有更多的yield语句并且达到函数结束时,将引发StopIteration异常。

请注意,函数内部的对象在next调用之间保留。 这意味着,当代码在下一个循环中继续执行时,调用yield的作用域中的所有对象都具有来自上next调用返回的值的值。

关于生成器的很酷的事情是它们允许for循环方便地迭代。 for循环从fibonacci调用的结果中获得一个生成器,然后使用生成器对象的next方法执行循环检索元素,直到遇到StopIteration异常。

链接地址: http://www.djcxy.com/p/1541.html

上一篇: What is a "yield" statement in a function?

下一篇: for x in y(): how does this work?