Generator和Iterator

#列表生成式
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

原文地址:https://www.cnblogs.com/ywyin/p/9001081.html