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

  • 相关阅读:
    51nod 1494 选举拉票 | 线段树
    51nod 1295 XOR key | 可持久化Trie树
    Codeforces 438D (今日gg模拟第二题) | 线段树 考察时间复杂度的计算 -_-|||
    51nod 1563 坐标轴上的最大团(今日gg模拟第一题) | 线段覆盖 贪心 思维题
    良心的可持久化线段树教程
    51nod 1593 公园晨跑 | ST表(线段树?)思维题
    51nod 1595 回文度 | 马拉车Manacher DP
    51nod 1522 上下序列
    胡小兔的OI日志3 完结版
    51nod 1510 最小化序列 | DP 贪心
  • 原文地址:https://www.cnblogs.com/jiba/p/14047159.html
Copyright © 2011-2022 走看看