python_生成器

生成器  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")
View Code
原文地址:https://www.cnblogs.com/gongfuxiaozhen/p/8653952.html