#列表生成式
print([i*2 for i in range(10)])
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
#生成器只有在调用时才会生成相应的数据
#只有一个方法 __next__(),只记得当前的位置
#利用函数做生成器 def fib(max): n,a,b = 0,0,1 while n<max: yield b a,b = b,a+b n =n+1 # return 1 f= fib(10) g = fib(8) while True: try: x = next(g) print("g:",x) except StopIteration as e: print("Generator return Value:",e.value) break
#__next__() #唤醒
#send(值)#唤醒之后传值
#单线程下的并行任务案例 import time def consumer(name): print("%s 准备做咖啡啦!" %name) while True: cof = yield #没有返回值为空 print("咖啡[%s]来了,被[%s]喝了!" %(cof,name)) c = consumer("yyw") c.__next__() #next只是唤醒 b1 ="拿铁" c.send(b1) #send可以给yield传值 b2 ="曼特宁" c.send(b2) b3 ="已经唤醒" c.send(b3) def producer(name): c = consumer('A') c2 = consumer('B') c.__next__() c2.__next__() print("老子开始准备做咖啡啦!") for i in range(10): time.sleep(1) print("做了2杯咖啡!") c.send(i) #send可以给yield传值 c2.send(i) producer("yyw")
### 迭代器 ###
可以被next()函数调用并且不断返回下一个值得对象叫迭代器
生成器肯定是迭代器!
#可迭代对象
1) list,tuple,dict,set,str
2)generator
isinstance([], Iterable]
通过Iter()函数把list,dict,str等Iterable变成Iterator