标签:ext 接收 形式 pen 位置 beijing range imp cer
今日所学:
一、生成器
生成器函数:yield的好处
1、yield可返回值,与return相比可返回多次
2、yield可保存状态,可以基于上次next的位置再进行下一次的yield返回操作,接着往下走。
import time def delivery(): print("开始生孩子啦") yield "我" time.sleep(4) print("开始生儿子啊") yield "儿子" time.sleep(4) print("开始生孙子啦") yield "孙子" li=delivery() print(li.__next__()) print(li.__next__()) print(li.__next__())
def pro_li(): for i in range(1,20): print("正在生产包子") print("正在卖包子") yield "一屉包子%s"%i a=pro_li() print(a.__next__()) print(a.__next__())
yield的优点:
1、延迟计算,一次返回一个结果
2、还能有效地提高代码可读性
def jidan(): for i in range(1,15): yield "鸡蛋%s"%i a=jidan() res=a.__next__() print("happy取走了",res) res=a.__next__() print("happy取走了",res)
举例:
tell内容: {"city":"beijing","population":1322432} {"city":"shanxi","population":1320000} {"city":"anhui","population":1536752} {"city":"hunan","population":906836455}
人口普查取和
def popu(): with open("tell","r",encoding="utf-8") as f: for i in f: yield i popu_li=popu() res=0 for i in popu_li: a=eval(i) --->注意:文件所有的记录都是以字符串形式的,要使用eval()函数把字符串中的字典形式提取出来 print(a["population"]) --->把字典中的population中的V值提取出来 res+=a["population"] --->求人口总和 print(res)
生产者消费者模型
def consumer(name): print("我是[%s],我准备开始吃包子了"%name) while True: baozi=yield --->到这里终止 print("%s 很开心地把[%s]吃掉了"%(name,baozi)) def prodecer(): c1 = consumer("happy") --->调用执行consumer()函数 c2 = consumer("banana") c1.__next__() c2.__next__() for i in range(1,15): c1.send("包子%s"%i) c2.send("包子%s" % i) prodecer()
#可使两个程序重复交替进行
二、触发生成器函数的运行
1、_next_()
2、.next()
3、.send(self,value)
yield 3相当于return,控制的是函数的返回值
x=yield的另外一个特性,接收send传过来的值,赋值给x
def a(): for i in range(1,10): yield "鸡蛋%s"%i b=a() print(b.__next__()) print(b.__next__()) print(b.__next__()) print(b.__next__()) print(b.send(None)) print(b.send(None)) print(b.send(None)) print(b.send(None))
>>>
鸡蛋1
鸡蛋2
鸡蛋3
鸡蛋4
鸡蛋5
鸡蛋6
鸡蛋7
鸡蛋8
以上。
标签:ext 接收 形式 pen 位置 beijing range imp cer
原文地址:https://www.cnblogs.com/211293dlam/p/12491933.html