Python - Yield 详析

写在前面:(如果我的博文对你有帮助,请免费点个赞)

关于Yield,我们需要明白它是什么,有什么用。以下链接提供了明确的英文解释,如果感觉繁琐,也可以看我以下笔记。

Python yield | Understand 5 Examples of Python Yield Statement

Yield作用:

  1. 使用yield创建一个可迭代的函数,即生成器函数
  2. 函数的连续调用时,它都会从最后一个yield语句本身开始执行,因此节约执行时间
  3. 用于函数多个值的返回。(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 的下一个语句继续执行。
上一篇:Python Asyncio与多线程/多进程那些事


下一篇:js执行机制(event loop)