- 实现延迟计算,省内存
- 惰性机制 只要执行__next__() 才会执行并查找到一个yield,之后再返回yield对应的 值
- 不能反复,只能向下执行,是一次性取值
生成器的本质就是迭代器
表达式中多个for 循环套用
将列表中名字含有两个2的‘e’的提取出来
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
方案1
# gg = []
# for i in names:
# for b in i:
# if b.count('e') == 2:
# gg.append(b)
方案2:列表表达式完成上面的 东西
gg = [ b for i in names for b in i if b.count('e') ==2 ]
方案3: 生成器表达式
gg = (b for i in names for b in i if b.count('e') ==2 ) 结果是直接返回一个生成器
列表推导式
表达式 for循环 条件(条件满足的话,前面才会取值)
将列表推导式的[ ]更改为() 产生的就是生成器表达式
字典推导式
{key:value for循环 if条件判断}
集合推导式
{key for循环 if调价判断 }
python 中有两种不同的方式的生成器
- 生成器函数 常规定义函数,但是使用yield语句而不是return语句返回结果,在每个结果中间 挂起函数的状态,以便下次从她离开的地方继续执行
这种类型的函数在调用的时候不再是函数的执行,而是获取这个生成器,由于生成器的本质就是迭代器,所有可以通过执行一次__next__()方法来执行获取得到的生成器,执行这个方法之后就看到的效果就与平常使用return的函数一样 遇到yeid 就返回相应值,并结束函数,但是在第二次调用__next__()的时候就会从yeid下面的之前没有执行的代码,当剩下的都被执行完之后就显示StopIteration(如果有的话)
如果yield下面没有代码,由于迭代器是一次性的,所有也不会在执行,直接显示StopIteration
执行一次__next__() 查找一个yeild 并返回 yield 对应的内容
send和__next__()区别:
1. send和next()都是让生成器向下走一次
2. send可以给上一个yield的位置传递值,. 在第一次执行生成器代码的时候不能使⽤用send()
生成器表达式 生成器表达式可以直接获取到生成器对象. 生成器对象可以直接进行for循环. 生成器具有惰性机制,按需产生结果的一个对象,(生成器表达式与列表推导表示式一样,只是将[] 更换成() )
注意的是生成器只能遍历一次
大部分的内置函数也是使用迭代器协议访问对象的
yield from 一般用于在容器中迭代出所有的值
def gg():
lis = [‘潘’,‘振’,‘卫’]
yield from lis
具体的作用与下面的相同
def gg():
lis = [‘潘’,‘振’,‘卫’]
yield lis[0]
yield lis[1]
yield lis[2]
yield from是将列表中的每一个元素返回. 所以. 如果写两个yield from 并不会产生交替
的效果.