Python yield 使用浅析

来源:互联网 发布:js select 默认选中 编辑:程序博客网 时间:2024/05/06 18:11

继Python迭代器和生成器,使用了yield函数,简单分析分析。
首先,带有 yield 的函数在 Python 中被称之为 generator(生成器),那么什么是生成器?

通过一个编程实例来展示yield的概念

如何生成一个斐波那契数列

简单输出一个斐波那契数列:

# -*-coding:utf-8-*-def fb(max):    n, a, b = 0, 0, 1    while n < max:        print(b, end=" ")        a, b = b, a + b        n = n + 1fb(10)

执行程序,结果:

1 1 2 3 5 8 13 21 34 55 

程序结果没有问题,但是有经验的开发者指出,直接在 fab 函数中用 print 打印数字会导致该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列。
要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。

经过分析,输出斐波那契数列第二版:

# -*-coding:utf-8-*-def fb(max):    n, a, b = 0, 0, 1    L = []    while n < max:        L.append(b)        a, b = b, a + b        n = n + 1    return Lfor i in fb(10):    print(i, end=" ")

执行程序,打印fb函数返回的List结果:

1 1 2 3 5 8 13 21 34 55 

为了使代码简洁,同时又要获得 iterable 的效果,yield 就派上用场了:

# -*-coding:utf-8-*-def fb(max):    n, a, b = 0, 0, 1    while (n<max):        yield b        a, b = b, a+b        n = n + 1for n in fb(10):    print(n, end=" ")

输出结果一致

1 1 2 3 5 8 13 21 34 55

简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fb(10) 不会执行 fb 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fb 函数内部的代码,执行到 yield b 时,fb 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

结论:

一个带有yield的函数就是一个generator(生成器),它和普通函数不同,看起来像函数调用,但不会执行任何函数代码,直到对其调用next()才开始执行,for循环中会自动调用next(),虽然执行流程仍然按照函数的流程执行,但是每执行到一个yield语句就会中断,并返回一个迭代值,下次执行时从yield的下一个语句继续执行,看起来就好像一个函数在正常执行的过程中被yield中断了数次,每次中断都会通过yield返回当前的迭代值yield的好处显而易见,能够将一个函数改写为一个generator而获得迭代能力。
原创粉丝点击