python生成器
迭代器的好处是可以节省内存,如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。 python中提供的生成器
1.生成器函数 :常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式 :类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 生成器Generator:
本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
特点:惰性运算,开发者自定义 生成器函数
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。import time def genrator_fun1(): a = 1 print("现在定义了a变量") yield a b = 2 print("现在又定义了b变量") yield b g1 = genrator_fun1() # 不执行函数 得到一个生成器对象 print("g1 : ", g1) # 打印g1可以发现g1就是一个生成器 注意这里并没有执行函数 print("-" * 20) # 我是华丽的分割线 print(next(g1)) time.sleep(1) # sleep一秒看清执行过程 print(next(g1)) """ g1 : -------------------- 现在定义了a变量 1 现在又定义了b变量 2 """
生成器有什么好处呢?就是不会一下子在内存中生成太多数据
假如我想让工厂给学生做校服,生产2000000件衣服,我和工厂一说,工厂应该是先答应下来,然后再去生产,我可以一件一件的要,也可以根据学生一批一批的找工厂拿。
而不能是一说要生产2000000件衣服,工厂就先去做生产2000000件衣服,等回来做好了,学生都毕业了… def produce(): """生产衣服""" for i in range(2000000): yield "生产了第%s件衣服" % i product_g = produce() print(product_g.__next__()) # 要一件衣服 print(product_g.__next__()) # 再要一件衣服 print(product_g.__next__()) # 再要一件衣服 print("----------------分割线---------------------") num = 0 for i in product_g: # 要一批衣服,比如5件 print(i) num += 1 if num == 5: break """ 生产了第0件衣服 生产了第1件衣服 生产了第2件衣服 ----------------分割线--------------------- 生产了第3件衣服 生产了第4件衣服 生产了第5件衣服 生产了第6件衣服 生产了第7件衣服 """ # 到这里我们找工厂拿了8件衣服,我一共让我的生产函数(也就是produce生成器函数)生产2000000件衣服。 # 剩下的还有很多衣服,我们可以一直拿,也可以放着等想拿的时候再拿
读取文件 import time def tail(filename): f = open(filename) f.seek(0, 2) #从文件末尾算起 while True: line = f.readline() # 读取文件中新的文本行 if not line: time.sleep(0.1) continue yield line tail_g = tail("tmp") for line in tail_g: print(line)next() 和 send()
next()让包含yield的函数(Generator)执行
next()和send()在一定意义上作用是相似的,区别是send()可以传递值给yield表达式,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。
第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有yield语句来接收这个值。def x(): print("bai wei") m = yield 5 print(m) d = yield 12 print("reach here ") c = x() next(c) # 启动generator next(c) # 给yield表达式传一个None值 和 c.send(None) 等价 """ bai wei None """
send 传值def x(): print("bai wei") m = yield 5 # m的值就是send传的 hi print(m) d = yield 12 print("reach here ") c = x() next(c) # 启动generator c.send("hi") """ bai wei hi """
第一次调用时 不能使用send传一个非None的值def x(): print("bai wei") m = yield 5 print(m) d = yield 12 print("reach here ") c = x() c.send("hi") # 报错 """ Traceback (most recent call last): File "xx.py", line 10, in c.send("hi") TypeError: can"t send non-None value to a just-started generator """ send(msg) 与 next()的返回值
send(msg) 和 next()是有返回值的,它们的返回值很特殊,返回的是下一个yield表达式的参数。比如yield 5,则返回 5 def h(): print("Wen Chuan") m = yield 5 # m的值就是send传过来的 Fighting! print(m) d = yield 12 print("We are together!") c = h() # 不执行函数 得到一个生成器 m = next(c) # m 获取了yield 5 的参数值 5 d = c.send("Fighting!") # d 获取了yield 12 的参数值12 print("We will never forget the date", m, ".", d) """ Wen Chuan Fighting! We will never forget the date 5 . 12 """
人人都是老中医,左点砭石刮痧仪分享随着人们生活水平的提高,大家对自己的身体保养越来越重视。在众多养生之法中当属中医的刮痧和拔罐最为常见,笔者只接触过刮痧,那滋味不是一般的酸爽!传统的刮痧很讲究手法力度器材,一般人难
亚健康人的福音,左点小艾2智能无线艾灸盒现在社会生活工作压力大,很多年轻人或多或少患有些小毛病,比如说我,我是严重的湿热型体质,到了夏季尤为严重,四肢乏力大便次数多容易长痘微胖(吃的不多),已经严重影响到我的工作和生活,
女神有了它牙齿更健康,罗曼Smart1电动牙刷牙刷可以说是人人都需要的刚需品,每天早晚刷牙已经成为人们的生活习惯,但是你对牙刷的历史又了解多少呢?随着科技的不断进步,我们在选择牙刷又要注意什么呢?2000多年前,古人就懂得如何
OPPOK3和荣耀9X怎么选?大内存也重要7月荣耀9X的出现,再次让国产千元机市场掀起一阵热潮。该机主打真全面屏超长续航,售价1399元起看似具备着较高的性价比。而面对上半年热门机OPPOK3,晚发布的荣耀9X是否更值得入
红与黑恒大汽车募集260亿港元1月25日,恒大汽车(0708。HK)股价飙涨,涨幅一度超65。截至收盘时,恒大汽车涨幅49。83,报44。8港元股,市值涨至3998。32亿港元。就在50天前,即去年12月3日,
充电桩里面的大生意,全国充电桩总量达168。1万台1月13日,中国电动汽车充电基础设施促进联盟(以下简称充电联盟)发布2020年电动汽车充换电基础设施运行情况,2020年全年,充电基础设施增量为46。2万台,公共充电基础设施增量同
挑战不息吉利星瑞颠覆者行动在继续中国家轿的颠覆者,不止于一句口号。对于吉利来说,这个荣耀不属于拥有300万用户基数的帝豪,也不属于其旗舰轿车博瑞,而是基于CMA架构的全新车型星瑞PREFACE。正如其在新车上市时
CRV插混版上市本田中国混动升级登顶合资SUV销量王后,CRV迎来插电式混合动力车型2月2日,CRV锐混动e(插混版)正式上市,百公里综合油耗1。3L,较锐混动车型的4。9L实现跨越式提升。CRV锐混动e补贴后指
中国最畅销车型出炉,一起来看看都有谁?下下2020最新版的中国畅销车型榜揭晓,一起来看看都有哪些车型上榜?轿车轩逸夺冠随着新平台新车型的加入,轿车细分市场悄然发生变化。轩逸超过朗逸成为年度轿车类销量冠军。其中,轩逸的终
名爵领衔,中国汽车在澳洲焕发生机据澳洲联邦汽车工业商会(FCAI)公布的数据,今年1月中国品牌汽车在澳洲的新车销量为4,198辆,较去年同比增长156。在当地排名第四,首次超过超过德系的3078辆和美系的2056
威固品牌重塑之年,斩获金触点全球商业创新大奖等两项行业大奖近日,全球特种材料公司伊士曼旗下汽车膜品牌威固(VKOOL),凭借品牌战略重塑的不凡表现,夺得金触点2020全球商业创新大奖整合营销类铜奖。作为亚太地区具有权威性和影响力的商业与营