1.4 理解Python中使用yield进行迭代

yield从字面意思来看,就是生产的意思,在python中它与return一样是一个关键字,也与return一样会返回值。但是不同于return的是:

  1. yield关键字必须要配合迭代使用,一般使用 for ... in ...来进行n次迭代.

  2. 如果函数fun()里调用了yield关键字则可以看成fun()函数return了n个(取决于迭代次数)返回值,返回值为yield后面的值.

  3. 由于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)

上面的代码运行先后顺序为:

  1. 进入main中执行yiled_test(5),将5作为形参传递给yield_test函数,开始执行该函数

  2. 开始执行for i in range(5)循环迭代,第一次返回0*2main中的循环for i in yiled_test(5)

  3. main中的i获值为第一次返回值0*2, 执行print函数print('i in the main',i)

  4. 继续第二次迭代,跳回yield代码的下一行开始执行,即print('i in the yield_test',i),然后开始继续本次的迭代yield i*2,即返回1*2main中的循环for i in yiled_test(5),此时i获值为2

  5. 依次循环迭代,直至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