最近练习Python,碰到了yield关键字,网上找信息看了一堆,感觉云里雾里,举的例子也是一点不明了。所以用自己的理解来举例子。
含有yield关键字的函数返回一个生成器,这个生成器一次性的,可迭代的。可以按需取用其中元素。
含有关键字yield的函数的执行方式
函数的执行也是每次调用函数的时候执行到yield关键字,下此调用的时候再从上次中断的地方继续往后执行。如:
def create_generator():
print('来到函数')
for i in range(10):
print(f'来到循环, i的值为{i}')
yield i**2
print(f'回到循环, i的值为{i}')
print('-'*10)
mygenerator = create_generator()
for k in range(4):
print(next(mygenerator))
print(f'回到调用, k的值为{k}')
输出结果是
来到函数
来到循环, i的值为0
0
回到调用, k的值为0
回到循环, i的值为0
----------
来到循环, i的值为1
1
回到调用, k的值为1
回到循环, i的值为1
----------
来到循环, i的值为2
4
回到调用, k的值为2
回到循环, i的值为2
----------
来到循环, i的值为3
9
回到调用, k的值为3
使用yield生成器可以产生含有10个元素的可迭代对象,通过next()
逐个取用,我只取了其中4个。通过i的取值以及打印的内容可以看到函数中断执行的地方。最后一次调用的时候,因为没有下一次了,生成器中yield后面两个print语句没有执行。
与return比较:
- return返回是一个int,无法使用
next()
,会出现错误TypeError: 'int' object is not an iterator
。故:
def create_generator():
for i in range(10):
return i**2
mygenerator = create_generator()
for i in range(4):
print(mygenerator)
输出:
0
0
0
0
- 同一个循环块中return后面的语句是不执行的
def create_generator():
print('来到函数')
for i in range(10):
print(f'来到循环, i的值为{i}')
return i**2
print(f'回到循环, i的值为{i}') # 此行和下一行语句在解释器里面是灰色的
print('-'*10)
mygenerator = create_generator()
for i in range(4):
print(mygenerator)
输出:
来到函数
来到循环, i的值为0
0
0
0
0