概述
生成器
生成器:自己定义一些函数 惰性机制 本质就是迭代器
迭代器:使用自己写好的数据结构元素
yield 产生生成器
def foo(): print(1) yield 4 #yield 返回值 记录执行到哪,停止,不往下执行 print(2) yield 5 g = foo() print(g.__next__()) #触发启动生成器
yield要和next个数一一对应,最后一个yield下边的代码不运行
生成器定义:函数体中存在yield就是生成器,函数名()就产生生成器
def foo(): print(1) yield 4 print(2) yield 5 g = foo() #产生生成器 g.__next__() #调用yield的返回值 返回给g.__next__()
生成器的好处:节省空间
send()
相当于__next__ + 传值 在外界向生成器传递参数
def func(): print(44) l = yield 5 print(22) print(l) yield 66 g = func() print(g.__next__()) print(g.send(55)) #传值给上一个yield 赋给l,然后向下运行 结果: 44 5 22 55 66
send不能在第一次使用.如果想把send在第一次使用,找不到上一个yield去赋值,会报错.但是可以send(None),就可以继续向下运行
第一次启动生成器的时候,使用生成器.__next__ 或 生成器.send(None)
yield from
实现循环 必须是可迭代数据 只能使用__next__
def func(): lst = [1,2,3,4] yield from lst #相当于 for i in lst: g = func() #yield i print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) 结果: 1 2 3 4
推导式
1.列表推导式
li = [i for i in range(10)] #[结果 语句] 不能加:和, print(li) li = [i for i in range(10) if i % 2 == 0] #if语句 [结果 语句 条件] print(li) li = [i for i in range(10) if i > 3 if i%2 ==0] #if嵌套 print(li) 结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 2, 4, 6, 8] [4, 6, 8] #只能走一条线 不能用elif
2.集合推导式
print({i for i in range(10) if i>4}) dic = {'1':2,'2':3} d = {i for i in dic.items()} print(d) 结果: {5, 6, 7, 8, 9} {('1', 2), ('2', 3)}
3.字典推导式
lst1 = ['1','2'] lst2 = [2,3] d = {lst1[i]:lst2[i] for i in range(2)} print(d) dic = {'1':2,'2':3} print({k:v for k,v in dic.items()}) 结果: {'1': 2, '2': 3} {'1': 2, '2': 3}
4.生成器推导式
长的像元祖推导式,但是需要记住,元祖没有推导式
l = (i for i in range(100) if i%3 ==0) for i in range(10): print(l.__next__())
展开:
def l(): for i in range(100): if i > 3: yield i g = l() for i in range(10): print(g.__next__())
筛选:
l = (i for i in range(10) if i > 3) for i in range(10): print(l.__next__())
转载于:https://www.cnblogs.com/sandy-123/p/10260329.html
最后
以上就是单薄吐司为你收集整理的生成器-推导式的全部内容,希望文章能够帮你解决生成器-推导式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复