zoukankan      html  css  js  c++  java
  • 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")
  • 相关阅读:
    ECharts之柱状图 饼状图 折线图
    Vue自定义指令(directive)
    HDU 1231 最大连续子序列
    POJ 2533 Longest Ordered Subsequence
    HDU 1163 Eddy's digital Roots
    HDU 2317 Nasty Hacks
    HDU 2571 命运
    HDU 4224 Enumeration?
    HDU 1257 最少拦截系统
    HDU 2740 Root of the Problem
  • 原文地址:https://www.cnblogs.com/654wangzai321/p/8150890.html
Copyright © 2011-2022 走看看