一、生成器
生成器的实质就是迭代器
以下有三种获取生成器
1.通过生成器函数
2.通过推导式来实现生成器
3.通过数据的转换获取生成器
def func(): print("111") return 222 ret = func() print(ret) # 结果: # 111 # 222
把return换成yield就是一个生成器
def func(): print("111") yield 222 ret = func() print(ret)
结果是:<generator object func at 0x0000000001DF0D00>
生成器的本质就是迭代器,通过_next_()来执行生成器。
def func(): print("111") yield 222 ret = func() wn = ret.__next__() print(wn) # 结果: # 111 # 222
这时,return 和 yield 的作用是一样的,都是返回数据
def func(): print("111") yield 222 print("333") yield 444 ret = func() ret1 = ret.__next__() print(ret1) ret2 = ret.__next__() print(ret2) ret3 = ret.__next__() print(ret3) # 结果: # 111 # 222 # 333 # 444 # Traceback (most recent call last): # File "E:/python15期/生成器 推导式/lianxi.py", line 28, in <module> # ret3 = ret.__next__() # StopIteration
当程序执行完最后一个yield,后面继续执行_next_()程序会报错。而且,return是直接终止函数,而yield是分段执行函数
send方法 和_next_()一样都执行下一个yield
def eat(): print("你吃什么啊") a = yield "馒头" print(a) b = yield "面条" print(b) c = yield "米饭" print(c) yield "over" ret = eat() # 拿到生成器 food = ret.__next__() print(food) food1 = ret.send("咸菜") print(food1) food2 = ret.send("红烧肉") print(food2) food3 = ret.send("白菜") food4 = ret.send("猫粮") print(food4)
send 和 _next_() 的区别:
1.都是让生成器向下走一次
2.send 可以给上一个yield位置传值,不能给最后一个yield发送值。在第一次执行生成器代码的时候,不能使用send(),send()括号里必须有元素。
二、推导式
列表推导式:[结果 for循环 条件判断]
字典推导式: {k:v for循环 条件筛选}
集合推导式: {k for循环 条件}
三、生成器表达式
(结果 for循环 条件)
特点:
1. 惰性机制
2. 只能向前
3. 节省内存(鸡蛋)