1.生成器
a.概念1
生成器就是迭代器
b.概念2
调用一个带有 yield 关键字的函数就可以得到一个生成器
def func1():
print('+++')
print('---')
if 2 > 3:
yield
result = func1()
print('result:', result) # result: <generator object func1 at 0x000001A76E91BAC8>
2.生成器产生数据(生成器中的元素怎么产生)
生成器能生产多少数据就看执行生成器对应的函数的函数体会遇到几次 yield
yield 后面表达式的值就是生成器能够产生的数据
#示例一:创建一个生成器可以产生3个数据分别是:10,100,78
def create_gener1():
yield 10
yield 100
yield 78
gen1 = create_gener1()
print(list(gen1)) # [10, 100, 78]
3.生成器产生数据的原理
当获取生成器元素的时候,会自动调用生成器关联的函数。第一次从函数开始的地方开始执行,直到遇到 yield 位置,并且将 yield 后面的值作为获取到的数据,后面每次都是从上一次结束的位置开始执行,知道遇到 yield 如果从开始执行到函数结束都没遇到 yield 就不会产生数据(如果是用 next 去取的数据这个时候会报错)
def create_gener2():
for x in range(100, 150):
yield x
gen2 = create_gener2()
print(f'元素:{next(gen2)}') # 元素:100
可以不断产生数据
def creat_gener3():
num = 0
while True:
num += 1
yield num
gen3 = creat_gener3()
#print(next(gen3))
#练习:写一个产生4位验证码的生成器(验证码有随机的4位数字和字母组成)
from random import choices
def code_gener():
alp = 'abcdefghijklmnopqrstuvwxyz'
str1 = alp + alp.upper() + '0123456789'
while True:
yield ' '.join(choices(str1, k=4))
gen4 = code_gener()
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
2. 生成式
“”"
生成式就是生成器的简写
列表推导式的[]变成()就变成了生成式
“”"""
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()