迭代器 和 生成器
什么是迭代器?
迭代器就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个元素, 所有实现了 iter 和 next 两个方法的对象,都是迭代器。
迭代器的优势
在构建迭代器时,不是将所有的元素一次性的加载,而是等调用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