什么是函数中的“yield”声明?
可能重复:
解释了Python yield关键字
有人可以向我解释这段代码中的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)]
需要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
异常。