美文网首页python
迭代器和生成器 (Iterator & Generato

迭代器和生成器 (Iterator & Generato

作者: catHeart | 来源:发表于2015-05-31 22:52 被阅读1714次

    迭代器

    迭代器是一种支持next()操作的对象。它包含一组元素,当执行next()操作时,返回其中一个元素;当所有元素都被返回后,生成一个StopIteration异常。

    >>>a=[1,2,3]
    >>>ia=iter(a)
    >>>next(ia)
    1
    >>>next(ia)
    2
    >>>next(ia)
    3
    >>>next(ia)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    ite()可以接受多种Python对象为参数,比如list,tuple, dict, set等,并将其转化为迭代器。迭代器可以用于for语句或in语句中。很多常用操作也是支持迭代器的,比如sum(), max()等。

    >>> b=[4,5,6]
    >>> ib=iter(b)
    >>> for x in ib:
    ...     print(x)
    ...
    4
    5
    6
    >>> ic=iter(b)
    >>> sum(ic)
    15
    >>> id=iter(b)
    >>> max(ic)
    6
    

    生成器

    生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和多个返回值;对生成器执行next()操作,进行生成器的入口开始执行代码,yield操作向调用者返回一个值,并将函数挂起;挂起时,函数执行的环境和参数被保存下来;对生成器执行另一个next()操作时,参数从挂起状态被重新调用,进入上次挂起的执行环境继续下面的操作,到下一个yield操作时重复上面的过程。Python的循环操作与C语言的实现不同,如果使用List等数据结构需要耗费大量的内容;循环操作中使用生成器只需要在内存中实例化一个对象,可以减少内存占用,提高循环操作的执行速度。

    >>>def myG():
    ...    yield 1
    ...    yield 2
    ...    yield 3
    ...
    >>>g=myG()
    >>>next(g)
    1
    >>>next(g)
    2
    >>>next(g)
    3
    >>>next(g)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>>g2=myG()
    >>>for i in g2:
    ...    print(i)
    1
    2
    3
    

    生成器表达式

    for...[if]...语句可以简洁的构建一个List,同时也可以用来构建生成器。

    >>>a=[7,8,9]
    >>>b=[i**2 for i in a]
    >>>b
    [49, 64, 81]
    >>>ib=(i**2 for i in a)
    >>>ib
    <generator object <genexpr> at 0x7f72291217e0>
    >>>next(ib)
    49
    >>>next(ib)
    64
    >>>next(ib)
    81
    >>>next(ib)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    参考文献

    Functional Programming HOWTO
    Python Practice Book

    相关文章

      网友评论

      • 孙文研:如果我希望循环后生成一个列表,是不是用迭代器和生成器内存上没有太大差别?
        孙文研:啊, 不好意思, 一回复,缩进都没有了
        孙文研:是这样, 正在看effective python, 第16条, 没太看懂,所以来看到你的文章,举一下书里的两个例子:
        ```
        def index_words(text):
        result =[]
        if text:
        result.append(0)
        for index, letter in enumerate(text):
        if letter == ' ':
        result.append(index+1)
        return result

        address = 'Four score and seven years ago...'
        result = index_words(address)
        ```
        第二个例子是生成器
        ```
        def index_words_iter(text):
        if text:
        yield 0
        for index, letter in enumerate(text):
        if letter ==' ':
        yield index+1

        result = list(index_words_iter(address))
        ```
        第二种写法,运行时内存占用会小一些吗?
        catHeart: @wendysun0315 迭代器就是一种生成器,将函数转化为生成器。所以,我没太明白你的问题。可以给个最小代码示例,说明你的问题。

      本文标题:迭代器和生成器 (Iterator & Generato

      本文链接:https://www.haomeiwen.com/subject/irqdqttx.html