生成器 1. 调用的时候才生成
2.只能调用一个函数 __next__() ,只记住当前位置,只能一个一个取值
3.不知道数据的长度
1.最简单的生成器
ListGener = [i*2 for i in range(1,8)] #列表生成式 print(ListGener) Gener = (i*2 for i in range(1,8)) #变成一个生成器 print(type(Gener))
for i in Gener:
print(i)
2.只能调用一个函数 __next__() ,只记住当前位置
Value = Gener.__next__() print(Value) print(Gener.__next__())
3. 有yield 的函数是一个生成器,return 返回的值是一个异常
def GenerFun(Count):
i = 0
n = 1
while i < Count:
yield n
n = n * ( i + 2)
i +=1
return "errer" #用next方法时,若超过长度,则抛出异常
gen = GenerFun(10)
print(type(gen))
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
for i in gen:
print(i)
打印结果:
<class 'generator'>
1
2
6
24
120
720
5040
40320
362880
3628800
4. 可以通过yield 实现单线程下的实际并发运行的效果
yield :函数执行到yield时会被中断,等待下次被唤醒(send()或__next__()函数)
send()方法,唤醒生成器方法,并给yield传值
next方法只是调用生成器方法
import time File = open("debug.txt","a",encoding="utf-8") def consumer(name): print("%s write data to file!" %name) while True: strMSG = yield File.write(strMSG + "from %s " %name) print("写入[%s],被[%s]!" %(strMSG,name)) # c = consumer("writeFile") # c.__next__() # b1= "string message" # c.send(b1) # c.__next__() def producer(name): c = consumer('writer1') #形成一个生成器,相当于初始化一样,不是函数调用 c2 = consumer('writer2') c.__next__() #这儿才开始调用生成器 c2.__next__() print("producer beging...") for i in range(10): time.sleep(1) strmsg = str(i) +"woshidi" c.send(strmsg) c2.send(strmsg) producer("yes")