yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。
例子:转自https://blog.csdn.net/appleml/article/details/54097690
def yield_test(n): for j in range(n): yield call(j) print("j=",j) print("do something.") print("end.") def call(k): return k * 2 for i in yield_test(5): print('----------') print("i=",i)
执行顺序:
for i in yield_test(5):调用yield函数,把结果返给i
def yield_test(n):进入yield_test.n=5
for j in range(n):进入yield_test的for循环,从0开始.n=5,j=0
yield call(j):调用call函数.j=0
def call(k):进入def call(k).k=0
return k * 2:返回k*2的结果.k=0
for i in yield_test(5):将结果返回给i.i=0
print('----------') 打印一串-
print("i=",i) 打印i的值.i=0
print("j=",j) 打印j的结果.j=0
for j in range(n):循环第二次.j=1,n=5
yield call(j):调用call函数.j=1
def call(k):进入def call(k).k=1
return k * 2:返回k*2的结果.k=1
for i in yield_test(5):将结果返回给i.i=2
print('----------') 打印一串-
print("i=",i) 打印i的值.i=2
print("j=",j) 打印j的结果.j=1
进入下一次yield_test里的循环,以此类推
结果:
----------
i= 0
j= 0
----------
i= 2
j= 1
----------
i= 4
j= 2
----------
i= 6
j= 3
----------
i= 8
j= 4
do something.
end.