# _*_ 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
今日推荐
周排行