生成器
- 包含yield语句。函数使用yield而不是return返回结果。yield一次生成一个值后,函数停止执行,处于挂起状态,被重新激活后,从停止处继续执行。
- 本质是迭代器,实现了迭代器的功能。
- 优点:不会一次性在内存中生成太多数据,根据需要生成。
- 获取生成值的方法:__next__()或者send(参数),但是send(参数)不能用在首次获取生成值的时候。
- yield from 等价 for 循环 yield
def gen1():
x = 1
yield x
print('***' ,x)
y = 2
yield y
print('*****' ,y)
ge1 = gen1()
print(ge1.__next__()) # 1
print(ge1.send('')) # *** 1 此处send(参数)作用与__next__()一致
# 2
def gen2():
x = 1
con1 = yield x
print('***' ,con1)
y = 2
yield y
ge2 = gen2()
print(ge2.__next__()) # 1
print(ge2.send('hi')) # *** hi 此处send(参数)的作用是在获取下一个yield值的时候,给上一个yield处的变量传递一个值
# 2
# yield from <==> for 循环 yield
def gen3():
yield from 'abc'
print(list(gen3())) # ['a', 'b', 'c']
def gen4():
for i in 'abc':
yield i
print(list(gen4())) # ['a', 'b', 'c']
列表推导式与生成器表达式
- 列表推导式[],生成器表达式()
# 列表推导式与生成器表达式
lis = [i for i in range(10)] # 列表推导式
gen = (i for i in range(10)) # 生成器表达式,gen是个生成器表达式类型的生成器
print(lis) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(next(gen)) # 0
- 生成器表达式几乎不占内存,在数据量大的时候不会导致服务器卡死