zoukankan      html  css  js  c++  java
  • Python_生成器和迭代器的区别

    迭代器和生成器的区别是什么?这个问题面试的时候经常作为灵魂拷问。今天一起从概念到代码梳理一遍,作为总结和记录。

    区别是:

    • 生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。

    基础概念

    1. 迭代:当创建的对象可以被一个接一个读取里面的值,叫迭代。
      列表、元组、字典、字符串都是可迭代对象。数字、布尔值是不可迭代的对象。
    2. 迭代器协议:对象需要提供next()方法,通过它返回迭代中的下一项,直到返回终止抛出StopIteration异常。
    3. 可迭代对象:实现了迭代器协议对象。list、tuple、dict都是可迭代对象(Iterable),但不是迭代器对象(Iterator)。
      需要使用内建函数iter(),把这些都变成可迭代器对象(Iterable)。
    4. for item in Iterable:循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法,
      来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

    操作一下

    • 迭代器:Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。
    >>> list = [1,2,3]
    >>> lt = iter(list)
    >>> print(next(lt))
    1
    >>> print(next(lt))
    2
    >>> print(next(lt))
    3
    >>> print(next(lt))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    
    
    • 生成器:本质上是动态生成迭代的值,使用完直接丢弃,可以有效节省内存空间,但这些值只能被迭代一次。
    >>> def g():
    ...     for i in range(3):
    ...         yield i
    ... 
    >>> g = g()
    >>> next(g)
    0
    >>> next(g)
    1
    >>> next(g)
    2
    >>> next(g)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    
    

    yield语句与return语句一样,都起到返回的作用。但yield与return不同,如果执行return语句,直接返回return后面表达式的值。但执行yield语句,返回的是一个生成器对象,而且这个生成器对象的当前值,就是yield语句后面跟的表达式的值。调用yield语句后,当前函数就会返回一个迭代器,而且函数会暂停执行,直到对该函数进行下一次迭代。

    生成器是一种惰性的序列,如果我们需要创建一个 0~xxxxxxxxx 的序列,这样大的序列创建出来会占用内存,生成器就解决这样的问题 。

    参考链接:
    http://dwz.date/daG5
    http://dwz.date/daG6

  • 相关阅读:
    Fidder4 顶部提示 “The system proxy was changed,click to reenable fiddler capture”。
    redis 哨兵 sentinel master slave 连接建立过程
    虚拟点赞浏览功能的大数据量测试
    python基础练习题(题目 字母识词)
    python基础练习题(题目 回文数)
    python基础练习题(题目 递归求等差数列)
    python基础练习题(题目 递归输出)
    python基础练习题(题目 递归求阶乘)
    python基础练习题(题目 阶乘求和)
    python基础练习题(题目 斐波那契数列II)
  • 原文地址:https://www.cnblogs.com/jiba/p/14047159.html
Copyright © 2011-2022 走看看