python迭代器和生成器

迭代器:

可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

特点:

1.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容

2.不能随机访问集合中的某个值 ,只能从头到尾依次访问

3.访问到一半时不能往回退

4.便于循环比较大的数据集合,节省内存

 

生成器:

一个函数调用时返回一个迭代器,那这个函数就为生成器,如果函数中包含yield语法,那这个函数就变成生成器,生成器是一种特殊的迭代器。

特点:

1. 不会一次生成所有的结果,一次只返回一个结果

2. 不用准备好整个迭代过程中所有的元素,减少内存使用

3. 只能遍历一次

例子:

1. 通过for循环外面添加(),使其变成生成器

g = (x * x for x in range(10)) 
通过next(g)来获取每一个值,获取最后一个元素之后,再调用会出现StopIteration的错误,可以通过捕捉来处理,更好的方法是使用for循环,因为generator也是可迭代对象,不需要关心StopIteration的错误。

2. 使用yield来实现斐波拉契数列

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield a, b                   ## 生成器
        a, b = b, a + b
        n += 1
    return "---done---"
def main():
    g = fib(6)
    for i in g:
        print(i[0],i[1])

if __name__ == '__main__':
    main()

3. 使用生成器实现协程并行效果

import time

def consumer(name):
    print("%s 准备抢红包" % name)
    while True:
        money = yield
        print("红包[%s]来了, 被[%s]抢到了" % (money, name))

def producer(name):
    c1 = consumer('A')
    c2 = consumer('B')
    c1.__next__()
    c2.__next__()
    print("开始准备发红包")
    for i in range(10,15):
        time.sleep(1)
        print("发了一个红包,分两个")
        c1.send(i)
        c2.send(i)

if __name__ == "__main__":
    producer("wangzai")

 

posted @ 2017-12-30 19:19  wang_zai  阅读(225)  评论(0编辑  收藏  举报