生成器、迭代器

# _*_ coding:utf-8 _*_
import time
#列表生成式,直接生成列表
a=[i*2 for i in range(0,10)]
print(a)
#将列表生成式变成迭代器,两者只是[]和()的区别。列表生成式只能构造简单逻辑的迭代器
b=(i*2 for i in range(0,10))
c=(i*2 for i in range(0,10))
print(b)
#生成器只有再被调用到对应迭代步骤时候才会产生对应步骤的数据,for 循环可以遍历整个迭代器;迭代器只有for和一个next方法遍历数据
for j in b:
    print(j)
#next方法只能往后走不能往前走,只记录当前迭代位置信息。
print(c.__next__())
print(c.__next__())

#想构造复杂逻辑的迭代器需要使用函数来构造
#标准的函数,斐波那契生成函数
def fib(max):
    n,a,b = 0,0,1
    while n < max:
        a,b=b,a+b
        n+=1
        print(b)
fib(10)
#将print b更换为yield b就将函数变成一个生成器了,生成器内容就是b的值。
def fib1(max):
    n,a,b = 0,0,1
    while n < max:
        a,b=b,a+b
        n+=1
        yield b
d = fib1(10)
print(d.__next__())
print(d.__next__())

#生产者消费者模型,生成器并行运算例子
def consumer(name):
    print("%s 准备吃包子了"%name)
    while True:
        baozi = yield #外面使用send方将将值传给yield,生成器总是遇到yield就停止到此处状态,然后返回带调用函数
        print('包子%s来了,被%s吃了'%(baozi,name))


def producer(name):
    c1 =consumer('zsq')
    c2 = consumer('wurui')
    print('%s准备开始做包子了'%name)
    c1.__next__()
    c2.__next__()
    for i in ['韭菜','白菜','大肉']:
        time.sleep(1)
        print('%s包子做好了'%i)
        c1.send(i)
        c2.send(i)  #next只是唤醒迭代器,进行下一次迭代。  send是唤醒生成器,并将值传给生成器用于此次迭代
producer('zhangshengqi')

猜你喜欢

转载自www.cnblogs.com/flags-blog/p/9418072.html