zoukankan      html  css  js  c++  java
  • Python: 生成器与迭代 generators and iteration

    https://eastlakeside.gitbooks.io/interpy-zh/content/Generators/

    文章不是非常好

    1,三个概念

    可迭代对象 iterable, 迭代器 iterator, 迭代 iteration.

    可迭代对象就是能提供迭代器的任意对象。Python中的任意对象,只要它定义了能返回迭代器的 __iter__ 方法,或者定义了支持下标索引的 __getitem__ 方法它就是一个可迭代对象。

    按照文章的说法,只要定义了 __next__ 方法的对象,它就是迭代器。

    -- 这样乍一看,可迭代对象和迭代器岂非是同一个的东西?其实不然。请看下面例子。

    my_string = "Yasoob"
    next(my_string)
    # Output: Traceback (most recent call last):
    #      File "<stdin>", line 1, in <module>
    #    TypeError: str object is not an iterator
    以上异常说明,str 不是迭代器;虽然它是可迭代对象,但它不是迭代器。也就是说,它支持迭代,但是不能直接对其进行迭代操作。
    这时候应该使用内置函数 iter, 它根据一个可迭代对象返回一个迭代器对象。
    my_string = "Yasoob"
    my_iter = iter(my_string)
    next(my_iter)
    # Output: 'Y'
    可以认为,迭代器是可迭代对象的方法的结果;可迭代对象通过方法得到迭代器;只有迭代器才是可以进行迭代操作的。
     
    2,生成器 generator
    generator是一个函数,但是它的行为想迭代器,它可以放在for..loop中。
    generator的特点是:
    1)运行时生成值;
    2)可以用for遍历;
    3)以函数形式实现,但是不返回值,而是yield一个值。
     
    3,generator 和 function 的区别
    先看如下例子:
    >>> def myGen(n):
    ...     yield n
    ...     yield n + 1
    ... 
    >>> g = myGen(6)
    >>> next(g)
    6
    >>> next(g)
    7
    >>> next(g)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    可见,生成器的对象仅生成一次,但是其代码不一定会一次性全部跑一遍。代码在调用next的时候开始跑,但是也可能只跑一部分,代码在执行到yield的时候即停下来了;在下次调用next的时候,代码会在上次暂停的地方重新开始跑。
    函数的做法是,从头跑到尾,碰到return之后返回并把前面的中间状态抛弃掉。
     
    4,generator 相对于 function的优点
    在运行中生成值,不需要像函数那样先构造很大的List,更有效利用内存。
     
    参考如下链接体会generator的用法:
    https://docs.python.org/3/library/itertools.html
     
    一下这段话来自于 廖雪峰 。
    List,Dict,Str都是iterable,但都不是iterator。
    为什呢?因为Python的迭代器对象表示的是一个数据流,迭代器对象可以被next函数调用并不断返回下一个数据,知道没有数据是抛出StopIteration错误。我们可以把数据流堪称一个有序序列,但我们却没法提前知道序列的长度,只能通过next函数实时按需计算下一个数据,所以说iterator的计算是惰性的,只有在需要返回下一个数据时才会计算。
    Iterator甚至可以表示一个无限大的数据流,例如全体自然数,而是用List显然是不可能做到的。
  • 相关阅读:
    selenium修改cookie
    unittest同时支持参数化和生成html报告
    webdriver API
    selenium中CSS选择器定位
    VirtualBox中安装CentOS 7_Linux
    Selenium常见问题
    RFS常见问题
    RFS--RequestLibrary
    Fiddler抓取HTTPS请求配置
    Redis
  • 原文地址:https://www.cnblogs.com/freshair_cnblog/p/10104463.html
Copyright © 2011-2022 走看看