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

  • 相关阅读:
    简单canvas五子棋
    javascript高级程序第三版学习笔记【执行环境、作用域】
    Error对象
    表单元素input、按钮、文字完美垂直居中对齐方法
    Firebug控制台详解
    JavaScript,JScript,ECMAScript及对应浏览器的版本
    valueOf和toString
    javascript高级程序第三版学习笔记【基本类型和引用类型】
    图的实现(邻接链表C#)
    基本排序算法(C)
  • 原文地址:https://www.cnblogs.com/jiba/p/14047159.html
Copyright © 2011-2022 走看看