一.生成器
1生成器的定义
生成器的本质是迭代器
生成器一般由生成器函数或者生成器表达式来创建
生成器是手写的迭代器
2.生成器的特点
生成器的特点和迭代器一样.
(1)惰性机制
(2)节省内存
(3)只向下进行
3.生成器的取值方式
生成取值方式和迭代器一样
(1)__next__()
(2)send():给上一个yield传值.
二.生成器函数
1.和普通的函数没有什么区别.里面有yield的函数就是生成器函数.
def func(): print("哈哈") yield 1 gen = func() #不会执行函数,拿到的是生成器
2.生成器函数在执行的时候.默认不会执行函数体,而会形成生成器,通过生成器的__next__()分段执行这个函数
def order(): for i in range(10000): yield "衣服"+str(i) g = order() # 获取生成器 mingwei = g.__next__() print(mingwei) zhaoyining = g.__next__() print(zhaoyining)
3.send()给上一个yield传值,不能开头(没有上一个yield),最后一个yield也不可以用send()
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)
for i in func(): # for的内部一定有__next__() print(i) print(list(func())) # 内部都有__next__()
三.推导式
1.列表推导式 [结果 for循环 条件筛选]
lst = [] for i in range(1, 16): lst.append("python"+str(i)) print(lst)
lst = ["python"+str(j) for j in range(1,16)] print(lst)
lst = ["pytjon"+str(j) for j in range(1,6)] print(lst)
lst = [i for i in range(1000) if i%2==1] print(lst)
lst = [i*i for i in range(100) if i%3==0] print(lst)
#寻找名字中带两个e的人的名字 name = [["Tom","Billy","Jefferson","Andrew","Wesley","Steven","Joe"], ["Alice","Jill","Ana","Wendy","Jennifer","Sherry"]] lst = [name for line in names for name in line if type(name)==str and name.count("e")==2] print(lst)
2.字典推导式 {K:v for循环 条件筛选}
#[11,22,33,44] =>{0:11, 1:22, 2:33, 3:44} lst = [11,22,33,44] dic = {i:lst[i] for i in range(len(lst)) if i < 2} print(dic) dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"} d = {v : k for k,v in dic.items()} print(d)
3.集合推导式 {k for循环 条件筛选}
s = {i for i in range(100)} # 可去除重复 print(s)
四.生成器表达式
(结果 for循环 条件)
特点:
1. 惰性机制
2. 只能向前
3. 节省内存(鸡蛋)
#生成器函数 def func(): print(111) yield 222 yield 333 g = func #获取生成器 g1 = (i for i in g)#生成器 g2 = (i for i in g1) #生成器 print(list(g)) #[222,333] 源头,从源头把数据拿走了 print(list(g1)) #[] 这里执行的时候,源头已经没有数据了 print(list(g2)) #[] 这里也没有值了
# 求和 def add(a, b): return a + b # 生成器函数 # 0-3 def test(): for r_i in range(4): yield r_i # 0,1,2,3 g = test() # 获取生成器 for n in [2, 10]: g = (add(n, i) for i in g) print(g) # 到最后往里面放数据就对了 # print(list(g)) # print(list(g)) # []
当生成器没执行的时候,无论生成器里的值,还是别的值都不拿