什么是函数中的"yield"语句?

  • 本文关键字:yield 语句 函数 python
  • 更新时间 :
  • 英文 :


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

有人能向我解释一下收益率声明在这里的代码中的实际作用吗:

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

对于fibonacci()中的数字:#将生成器用作迭代器;打印编号

到目前为止,我所理解的是,我们正在定义一个没有参数的函数finonacci()?在函数中,我们将ab定义为0和1,接下来,如果这是真的,我们将生成a。这到底在做什么?此外,在产生a?现在a等于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)]

将int的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调用的结果中获得生成器,然后使用generator对象的next方法执行循环检索元素,直到遇到StopIteration异常。

这个答案是对yield语句以及迭代器和生成器的一个很好的解释。

具体来说,对fibonaci()的第一次调用将a初始化为0,b初始化为1,进入while循环并返回a。任何下一个调用都将在yield语句之后开始,影响baa+bb,然后转到while语句的下一次迭代,再次到达yield语句,并再次返回a

最新更新