码迷,mamicode.com
首页 > 编程语言 > 详细

python迭代器和生成器

时间:2017-12-30 20:03:17      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:效果   不能   producer   class   出现   python迭代器   例子   money   __name__   

迭代器:

可以直接作用于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")

 

python迭代器和生成器

标签:效果   不能   producer   class   出现   python迭代器   例子   money   __name__   

原文地址:https://www.cnblogs.com/654wangzai321/p/8150890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!