写在前面:(如果我的博文对你有帮助,请免费点个赞)
关于Yield,我们需要明白它是什么,有什么用。以下链接提供了明确的英文解释,如果感觉繁琐,也可以看我以下笔记。
Python yield | Understand 5 Examples of Python Yield Statement
Yield作用:
- 使用yield创建一个可迭代的函数,即生成器函数
- 函数的连续调用时,它都会从最后一个yield语句本身开始执行,因此节约执行时间
- 用于函数多个值的返回。(yield语句的返回值将数据存储在本地状态,这样就可以节省内存分配,并在每次返回不同的值时如何分配。由此,连内存也被保存了下来。)
为了便于理解,我们可以将Yield看成是Return的加强版, 不同在于:
* return
的函数直接返回所有结果,程序终止不再运行,并销毁局部变量;
* yield
会暂停并保存当前所有的运行信息(保留局部变量),返回yield
的值, 并在下一次执行next()
方法时从当前位置继续运行,直到生成器被全部遍历完。
通过以下例子说明:
# 有Yield关键字的函数表示是一个生成器函数
def func():
print(">>> yield1")
yield 1 #第一次loop调用next()函数走到这里并返回了值1,断点此里设在这里,因此打印至yield = 1
#第二次loop调用next(),程序继续从断点开始走起~ 开始打印 >>> yield2
print(">>> yield2")
yield 2
return 0
genarator_object = func()
i = 1
for j in genarator_object:
print('loop %s: yield = %s'%(i,j) )
i+= 1
#Results
>>> yield1
loop 1: yield = 1
>>> yield2
loop 2: yield = 2
从以上例子可以明确看出Yield起到的三个作用。
下面看下Yield的实际应用,以经典的斐波那契数列为例:
#斐波那契数列特性:数列从第3项开始,每一项都等于前两项之和
def fibonacci_Generator(max):
n, before, after = 0, 0, 1
while n < max:
yield after
before, after = after, before + after #关于赋值,请看之前博文
n += 1
g = fibonacci_Generator(6)
fibonacci_list = []
while True:
try:
fibonacci_list.append(next(g))
except StopIteration as e:
print('Generator return value', e.value)
break
print(fibonacci_list)
#Result:
Generator return value None
[1, 1, 2, 3, 5, 8]
是不是感觉代码很简洁明了呢?Python的宗旨就是使代码更加简洁清晰呵~
简单来讲:Yield的作用为:
- 用于创建一个名叫生成器的特殊函数,它和普通函数不同,虽然看起来像函数调用,但不会执行任何函数代码。
- 利用循环中的next()函数进行真正的执行,且每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。