def func():print('哈哈哈')yield 1 # return 和 yield 都可以返回数据print('呵呵呵') gen = func() # 不会执行你的函数,拿到的是生成器 ret = gen.__next__() # 会执行到下一个yield print(ret) gen.__next__() # 继续执行函数到下一个yield
函数中如果有yield 这个函数就是生成器函数,生成器函数() 获取的是生成器,这个时候不执行函数
yield:相当于return,可以返回数据,但是yield不会彻底中断函数,分段执行函数
def order():for i in range(100000):yield '衣服'+ str(i) g = order() # 获取生成器 mingwei = g.__next__() print(mingwei) zhaoyinning = g.__next__() print(zhaoyinning)
send() 和 __next__()的区别:
1.send和next都是让生成器向下走一次
2.send可以给上一个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("胡辣汤") # a = 胡辣汤 print(ret2) # 大饼 ret3 = gen.send("狗粮") # b = 狗粮 print(ret3) # 韭菜盒子 ret4 = gen.send("猫粮") # c = 猫粮 print(ret4) # GAME OVER
推导式:用一句话生成一个列表
lst = ['python'+str(i) for i in range(1,16)] print(lst)
语法:[ 结果 for循环 判断]
lst = [i for i in range(100) if i%2 == 1] print(lst)
# 100 以内能被3整除的数的平方 lst = [i*i for i in range(100) if i%3==0] print(lst)
# 寻找名字中带有两个e的人的名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] # 不用推导式的方法 lst = [] for line in names:for name in line:if name.count('e') == 2:lst.append(name) print(lst)#推导式的方法 lst = [name for line in names for name in line if name.count('e') == 2] print(lst)
字典推导式
语法:{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))} print(dic)
# 键值对互换 dic = {'jj':'林俊杰','jay':'周杰伦','zs':'赵四','ln':'刘能'} dic2 = {v:k for k,v in dic.items()} print(dic2)
集合推导式(可以去重复)
lst = [1,1,4,6,7,4,2,2]
s = {el for el in lst}
print(s)
生成器表达式(由于惰性机制)
tu = (i for i in range(10)) # 没有元组推导式,生成器表达式 print(tu) # 生成器 print(tu.__next__())
def func():print(111)yield 222 g = func() g1 = (i for i in g) g2 = (i for i in g1)print(list(g)) # [222] 源头,从源头把数据拿走了 print(list(g1)) # [] 这里执行的时候,源头已经没有数据了 print(list(g2)) # [] 这里也没有值
def add(a,b):return a + b
# 生成器函数 # 0-3 def test():for j in range(4):yield j
# 0,1,2,3 g = test() # 获取生成器
# 懒 for n in [1,10,5]:g = (add(n,i) for i in g)
# 到最后往里面放数据就对了 print(list(g)) # [15,16,17,18]
print(list(g)) # []