- 1.生成器
- 生成器的本质就是迭代器
- 生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(),)。
- send():的作用是给上一个yield传值
- 生成器一般由生成器函数或者生成器表达式来创建
- 其实就是手写的迭代器
- 生成器函数
- 和普通函数写法没有区别,里面有yield的函数就是生成器函数。
- 生成器函数在执行的时候,默认不会执行函数体,而是返回生成器,
- 通过生成器的__next__()分段执行这个函数
- send():的作用是给上一个yield传值,不能在开头使用,因为没有上一个yield,最后一个yield也不可以用send,因为会报错停止生成器。
yield
yield:相当于return,可以返回数据。但是yield不会彻底中断函数。分段执行
函数中如果有yield,这个函数就是生成器函数。
生成器函数名() 获取的是生成器。这个时候不执行函数。
def func(): print('执行到第一yield,下面是返回值')
yield 1 # return和yield都可以返回数据
print('执行第一个yield不会打印这个条,再次使用gen.__next__()调用才会打印,下面是返回值')
yield 2
gen = func() # 拿到生成器,不会执行函数
gen.__next__() # 执行函数,执行到下一个yield
gen.__next__() # 再次执行函数,执行到上一个yield之后的下一个yield
-------------------------------------------------------------------------
执行到第一yield,下面是返回值
1
执行第一个yield不会打印这个条,再次使用gen.__next__()调用才会打印,下面是返回值
2
=========================================================
def order():
lst = []
for i in range(10000):
lst.append('衣服'+str(i))
return lst
l1 = order() # 直接调拥lst内全部元素,大量消耗内存
def order(): for i in range(10000): yield '衣服'+str(i)
g = order() # 获取生成器
mingwei = g.__next__()
print(mingwei)
zhaoyining = g.__next__()
print(zhaoyining
-----------------------------------------------------
衣服0
衣服1
========================================================
send()和__next__()是一样的。可以执行到下一个yield,但是可以给上一个yield传值
def func():
print('我是第一段')
a = yield 123 #send赋值a为煎饼果子
print(a) #此时a没有值,因为按顺序执行到=右边yield 123 就已经停止,=赋值操作没有执行
print('可心是第二段')
b = yield 456
print('一宁是第三段')
c = yield 789
print('刘伟是最后一段')
d = yield 79 #生成器收尾必须是yield,且不能send传值不然会报错StopIteration;
g = func() #获取生成器
print(g.__next__()) #这里没有上一个yield所以不能直接使用send
print(g.send('煎饼果子')) # send给上一个执行完的yield位置赋值,所以将a赋值为煎饼果子
print(g.send('锅包肉')) #从第二个yield后开始执行(把锅包肉赋值给b开始,=左侧第二个yield没有执
行)
-------------------------------------------------------------
我是第一段
123
None #None是第二个print(g.__next__())调用打印a的值,说明第一次调用时=的赋值没有执行
执行到yield直接停止,第二次调用时从第一次调用yield的下一行开始执行
============================================================
def func():
yield 1
yield 11
for i in func(): # for的内部一定有__next__()
print(i)
print(list(func())) #内部一定有__next__()