生成器 和 生成器表达式
迭代器
iter() 获取迭代器
next() 下一个
生成器
本质就是迭代器
两种方式写生成器
1. 生成器函数
2. 生成器表达式
一,生成器
什么是生成器. 生成器实质就是迭代器.
在python中有三种方式来获取生成器:
- 通过生成器函数
- 通过各种推导式来实现生成器
- 通过数据的转换也可以获取生成器
首先, 我们先看个很简单的函数:
def func():
print("aaa")
return bbb
ret = func()
print(ret)
结果是 aaa
bbb
将函数中的return换成yield就是生成器
def func():
print("aaa")
yield bbb
ret = func()
print(ret)
结果:
<generator object func at 0x10567ff68>
这里的ret = fun() 就不再是函数的执行了
. 而是获取这个生成器
例子二 生产器打印输出
def func():
print("aaa")
yield bbb
print("ccc")
yield ddd
print("eee")
yield fff
ret = func()
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
生成器的本质是迭代器. 所以. 我们可以直接执行__next__()来执行
有什么区别呢? yield是分段来执行一个
函数
那么我们可以看到, yield和return的效果是一样的.有什么区别呢?
yield是分段来执行一个函数.
return呢? 直接停止执行函数. 返回值
sen 的用法
def eat():
print("我吃什么啊")
a = yield "馒头"
print("a=",a)
b = yield "烧饼"
print("b=",b)
c = yield "韭菜"
print("c=",c)
yield "GAME OVER"
gen = eat() # 获取生成器
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)
send和__next__()区别:
- send和next()都是让生成器向下走一次
- send可以给上一个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生
成器代码的时候不能使用send()