Python 中的 yield 用法

yield 和 generator

yield

yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator

generator

如果列表元素可以按照某种算法推算出来,从而在循环的过程中不断推算出后续的元素。在Python中,这种一边循环一边计算的机制,称为生成器:generator

yield的用法

yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器

1
2
3
4
5
6
7
8
9
10
def createGenerator() :
mylist = range(3)
for i in mylist :
yield i*i

mygenerator = createGenerator() # create a generator
print(mygenerator) # mygenerator is an object!

for i in mygenerator:
print(i)

Results:

1
2
3
4
5
object createGenerator at 0xb7555c34>

0
1
4

带有yield的函数,下次迭代时代码从yield的下一跳语句开始执行

1
2
3
4
5
6
7
8
9
10
def yield_test(n):
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)

for i in yield_test(5):
print(i,",")

Results:

1
2
3
4
5
6
step 1
1 ,
step 2
3 ,
step 3
5 ,

另一个例子,执行到yield后中断,跳出函数,然后下次从下一跳开始,函数内的for循环没有重复执行

1
2
3
4
5
6
7
8
9
10
11
12
13
def yield_test(n):  
for i in range(n):
yield call(i)
print("i=",i)

print("do something.")
print("end.")

def call(i):
return i*2

for i in yield_test(5):
print(i,",")

Results:

1
2
3
4
5
6
7
8
9
10
11
12
0 ,  
i= 0
2 ,
i= 1
4 ,
i= 2
6 ,
i= 3
8 ,
i= 4
do something.
end.