迭代器 和 生成器

什么是迭代器?

迭代器就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个元素, 所有实现了 iternext 两个方法的对象,都是迭代器。

迭代器的优势

在构建迭代器时,不是将所有的元素一次性的加载,而是等调用next方法时返回元素,所以不需要考虑内存的问题。

迭代器应用场景

  • 数列的数据规模巨大
  • 数列有规律,但是不能使用列表推导式描述。

迭代器示例

In [5]: x = [1, 2, 3]

In [6]: y = iter(x)

In [7]: type(y)
Out[7]: list_iterator

In [8]: y.__iter__
Out[8]: <method-wrapper '__iter__' of list_iterator object at 0x109ee0eb8>

In [9]: y.__iter__()
Out[9]: <list_iterator at 0x109ee0eb8>

In [10]: y.__next__()
Out[10]: 1

In [11]: y.__next__()
Out[11]: 2

In [12]: y.__next__()
Out[12]: 3

In [13]: y.__next__()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-13-2c928e09acf4> in <module>()
----> 1 y.__next__()

StopIteration:

In [14]:

生成器

生成器是一种高级迭代器,使得需要返回一系列元素的函数所需的代码更加的简单和高效。一边循环一边计算的机制,称为生成器。

生成器示例

# 示例1:将列表表达式改装成生成器
In [20]: a_list = [x**2 for x in range(5)]
In [21]: a_list
Out[21]: [0, 1, 4, 9, 16]

In [22]: a_generator = (x**2 for x in range(5))

In [23]: a_generator
Out[23]: <generator object <genexpr> at 0x109e95830>
# 示例2:通过 yield
In [33]: def gen_by_yiels():
    ...:     yield "first"
    ...:     yield "second"
    ...:     yield "third"
    ...:
    
In [34]: gen_by_yiels
Out[34]: <function __main__.gen_by_yiels()>

In [35]: gen_by_yiels()
Out[35]: <generator object gen_by_yiels at 0x109f2bf68>

In [36]: for x in gen_by_yiels():
    ...:     print(x)
    ...:
    ...:
    ...:
first
second
third

参考资料:https://www.zhihu.com/question/20829330

posted @ 2018-10-24 17:57  深圳-随风  阅读(125)  评论(0编辑  收藏  举报