zoukankan      html  css  js  c++  java
  • Python学习之--迭代器、生成器

    迭代器

    迭代器是访问集合元素的一种方式。从对象第一个元素开始访问,直到所有的元素被访问结束。迭代器只能往前,不能往后退。迭代器与普通Python对象的区别是迭代器有一个__next__()方法,每次调用该方法可以返回一个元素。
    迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。适合遍历一些巨大的或是无限的集合。

    特点:
    1 访问者不需要关心迭代器内部的结构,仅需要通过next()方法去获取下一个内容
    2 不能随机访问集合中的某个值,只能从头到尾访问
    3 访问到一半时不能回退
    4 便于循环比较大的数据集合,省内存

    l=iter([1,2,3])
    >>> l=iter([1,2,3])
    >>> l
    <list_iterator object at 0x007FB530>
    >>> print(l.__next__())
    1
    >>> print(l.__next__())
    2
    >>> print(l.__next__())
    3
    >>> print(l.__next__())
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

     读文件的时候,采用for line in file:的形式,是按照迭代器的方式进行读,比较节省内存。

    生成器


    一个函数调用时返回一个迭代器,那么这个函数就叫做生成器。如果函数中包含
    yield语法,那么这个函数会变成生成器

    def cash_amount(amount):
        while amount>0:
            amount -=100:
            yield 100
            print("又来取钱啦")
    atm=cash_amount(500)
    print(type(atm))
    sample

    生成器的好处可以让你在执行函数的时候不必等到函数执行完毕。

    实例、使用yield实现单线程中的异步并发效果
    应用-生产者消费者模型

    def consumer(name):
        print("%s 准备吃包子啦!" %name)
        while True:
            baozi=yield
            print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
    
    def producer(name):
        c=consumer('A')
        c2=consumer('B')
        c.__next__()
        c2.__next__()
        for i in range(10):
            print("%s 做好了2个包子!" %name)
            c.send(i)
            c2.send(i)
    
    producer('chef')
    Code
  • 相关阅读:
    ACM的算法分类 2015-04-16 14:25 22人阅读 评论(0) 收藏
    初学Larevel 2014-08-21 11:24 90人阅读 评论(0) 收藏
    初学PHP&MySQL 2014-05-31 12:40 92人阅读 评论(0) 收藏
    codeforces 570 E. Pig and Palindromes (dp)
    codeforces 570 D. Tree Requests (dfs序)
    poj 2157 Maze (bfs)
    cf 570 C. Replacement (暴力)
    cf 570B B. Simple Game(构造)
    cf 570 A. Elections
    hdu 1429胜利大逃亡(续) (bfs+状态压缩)
  • 原文地址:https://www.cnblogs.com/cedrelaliu/p/5198466.html
Copyright © 2011-2022 走看看