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")
  • 相关阅读:
    批处理显示系统信息与硬件信息
    批处理获取操作系统版本信息
    k2 4.6.9安装记录-够复杂了
    NAT路由器打洞原理
    function与感叹号
    leetcode 83. Remove Duplicates from Sorted List
    leetcode 53. Maximum Subarray
    leetcode 101. Symmetric Tree
    leetcode 191. Number of 1 Bits
    胜利的欲望不会给你胜利
  • 原文地址:https://www.cnblogs.com/654wangzai321/p/8150890.html
Copyright © 2011-2022 走看看