1.4 理解Python中使用yield进行迭代
yield
从字面意思来看,就是生产的意思,在python
中它与return
一样是一个关键字,也与return
一样会返回值。但是不同于return
的是:
yield
关键字必须要配合迭代使用,一般使用for ... in ...
来进行n次迭代.如果函数
fun()
里调用了yield
关键字则可以看成fun()
函数return
了n个(取决于迭代次数)返回值,返回值为yield
后面的值.由于
fun()
函数是有n个返回值,所以必须使用迭代获取该函数的返回值,每迭代一次遇到yield
时就返回yield
后面(右边)的值,且很关键的是下一次迭代时从上一次迭代遇到的yield
后面的代码(下一行)开始执行。
总结一句话理解
yield
就是:yield
就是return
返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
举个栗子说明:
def yiled_test(n):
for i in range(n):
yield i*2
# 下一次迭代时,从下面的print('i=',i)开始执行
print('i in the yield_test',i)
print('Finish at the end of yiled_test')
if __name__ == '__main__':
# 必须使用迭代来获取yield_test()函数返回值
for i in yiled_test(5):
print('i in the main',i)
上面的代码运行先后顺序为:
进入main中执行
yiled_test(5)
,将5
作为形参传递给yield_test
函数,开始执行该函数开始执行
for i in range(5)
循环迭代,第一次返回0*2
给main
中的循环for i in yiled_test(5)
main
中的i
获值为第一次返回值0*2
, 执行print
函数print('i in the main',i)
继续第二次迭代,跳回
yield
代码的下一行开始执行,即print('i in the yield_test',i)
,然后开始继续本次的迭代yield i*2
,即返回1*2
给main
中的循环for i in yiled_test(5)
,此时i
获值为2
依次循环迭代,直至5次迭代完成。
运行结果为:
$ python yield_test.py
i in the main 0
i in the yield_test 0
i in the main 2
i in the yield_test 1
i in the main 4
i in the yield_test 2
i in the main 6
i in the yield_test 3
i in the main 8
i in the yield_test 4
Finish at the end of yiled_test
Last updated