一、何为生成器
- 生成器就是迭代器
- 调用一个带有
yield关键字的函数就可以得到一个生成器
def func1():
print('++++')
print('----')
yield
result = func1()
print('result:', result)
二、生成器如何产生数据
- 生成器能生产多少数据就看执行生成器对应的函数的函数体会遇到几次 yield ;
- yield 后面表达式的值就是生成器能够产生的数据。
#示例一:创建一个生成器可以产生3个数据分别是:10, 100, 78
def create_gender1():
yield 10
yield 100
yield 78
gen1 = create_gender1()
print(list(gen1)) #[10, 100, 78]
三、生成器产生数据的原理
- 当获取生成器元素的时候,会自动调用生成器关联的函数。第一次从函数开始的地方开始执行,直到遇到 yield 为止,并且将 yield 后面的值作为获取到的数据;
- 后面每次都是从上一次结束的位置开始执行,直到遇到 yield。如果从开始执行到函数结束都没有遇到 yield 就不会产生数据(如果是用 next 去取的数据这个时候会报错)
def create_gender2():
print('函数开始')
yield 10
print('++++++')
yield 98
print('========')
yield 100
print('函数结束')
gen2 = create_gender2()
print('========第1次========')
print(f'元素: {next(gen2)}')
print('========第2次========')
print(f'元素: {next(gen2)}')
print('========第3次========')
print(f'元素: {next(gen2)}')
print('========第4次========')
# print(f'元素: {next(gen2)}') # 报错:StopIteration
# 可以不断产生数据
def create_gender3():
num = 0
while True:
num += 1
yield num
gen3 = create_gender3()
print(next(gen3))
# 练习:写一个产生4位验证码的生成器(验证码有随机的4位数字和字母组成)
from random import choices
def code_gender4():
alp = 'abcdefghijklmnopqrstuvwxyz'
str1 = alp + alp.upper() + '0123456789'
while True:
yield ''.join(choices(str1, k=4))
gen4 = code_gender4()
print(next(gen4))
print(next(gen4))
# 注意:每次调用函数都是在创建一个新的生成器对象
def create_gender5():
for x in range(5):
yield x
print(next(create_gender5())) # 0
print(next(create_gender5())) # 0
gen5 = create_gender5()
print(next(gen5)) # 0
print(next(gen5)) # 1
四、 生成式
- 生成式就是生成器的简写
- 列表推导式的[]变成()就变成了生成式
list1 = [x*2 for x in range(5)]
print(list1) # [0, 2, 4, 6, 8]
gen1 = (x*2 for x in range(5))
print(gen1) # <generator object <genexpr> at 0x103dba050>
print(next(gen1)) # 0
print(next(gen1)) # 2
# gen1 = (x*2 for x in range(5)) 相当于:
def func():
for x in range(5):
yield x*2
gen1 = func()