zoukankan      html  css  js  c++  java
  • python 生成器&迭代器

    1.什么是生成器:  

         通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

     1 #创建生成器方法1
     2 #要创建一个生成器,有很多种方法。第一种方法很简单,只要把一个列表生推导式的 [ ] 改成 ( )
     3 
     4 In [19]: list1 = [x*2 for x in range(5)]
     5 
     6 In [20]: list1
     7 Out[20]: [0, 2, 4, 6, 8]
     8 
     9 In [21]: generator=(x*2 for x in range(5))
    10 
    11 In [22]: generator
    12 Out[22]: <generator object <genexpr> at 0x2f47910>
    13 
    14 #创建 list1和 generator 的区别仅在于最外层的 [ ] 和 ( ) , list1 是一个列表,而 generator 是一个生成器。我们可以直接打印出list1的每一个元素,但我们怎么打印出genertor的每一个元素呢?如果要一个一个打印出来,可以通过 next() 函数获得生成器的下一个返回值:当生成器的最后一个元素被取完之后会抛出一个异常,StopIteration: 
    15 In [23]: next(generator)
    16 Out[23]: 0
    17 
    18 In [24]: next(generator)
    19 Out[24]: 2
    20 
    21 In [25]: next(generator)
    22 Out[25]: 4
    23 
    24 In [26]: next(generator)
    25 Out[26]: 6
    26 
    27 In [27]: next(generator)
    28 Out[27]: 8
    29 
    30 In [28]: next(generator)
    31 ---------------------------------------------------------------------------
    32 StopIteration                             Traceback (most recent call last)
    33 <ipython-input-28-1d0a8ea12077> in <module>()
    34 ----> 1 next(generator)
    35 
    36 StopIteration: 
    37 
    38 此时也可以借助for 循环进行取generator的元素,并且不需要关心 StopIteration 异常
    39 In [39]: generator=(x*2 for x in range(5))
    40 
    41 In [40]: for item in generator:
    42     print item
    43    ....:     
    44 0
    45 2
    46 4
    47 6
    48 8

      

  • 相关阅读:
    LAMP企业架构读写分离
    docker技术入门(2)
    docker技术入门(1)
    终极实验
    java——并查集 UnionFind
    java——字典树 Trie
    java——线段树 SegmentTree
    java——最大堆 MaxHeap
    java——链表映射 LinkedListMap
    java——数据结构
  • 原文地址:https://www.cnblogs.com/simple001/p/7724350.html
Copyright © 2011-2022 走看看