可能重复:
Python yield关键字解释
有人能向我解释一下收益率声明在这里的代码中的实际作用吗:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a+b
对于fibonacci()
中的数字:#将生成器用作迭代器;打印编号
到目前为止,我所理解的是,我们正在定义一个没有参数的函数finonacci()
?在函数中,我们将a
和b
定义为0和1,接下来,如果这是真的,我们将生成a
。这到底在做什么?此外,在产生a
?现在a
等于b
,而b
等于a + b
。
下一个问题,对于fibonacci()
中的数字,这对函数中的每个数字都意味着什么?我同样对收益率和"为了数字"的实际作用感到困惑。显然,我知道这意味着fibonacci()
打印编号中的每个编号。我真的在不知情的情况下定义数字吗?
谢谢,如果我不清楚,很抱歉。顺便说一句,这是为欧拉项目准备的,如果我知道如何很好地编程,这将是一件轻而易举的事,但我正在努力学习。
使用yield
使函数成为生成器。生成器将继续在每个循环中生成a
变量,直到调用生成器的next()
方法继续进行下一个循环迭代。
或者,直到您的return
或StopIteration
被提升。
略微修改以显示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
语句之后开始,影响b
到a
,a+b
到b
,然后转到while
语句的下一次迭代,再次到达yield
语句,并再次返回a
。