迭代器是指实现了迭代器协议的对象,那么什么是迭代器协议?

迭代器协议:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代.

来举个例子,python提供了一个iter函数用来生成迭代器:

In [1]:
alist = [1, 2, 3, 4]
it = iter(alist)

it
Out[1]:
<list_iterator at 0x7fccb43c0d30>

迭代器都有一个next方法,调用next方法迭代指针会指向下一个元素的位置。若下一个元素没有了,则会抛出StopIteration异常。

In [2]:
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
1
2
3
4
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-2-ac45f6a7afa1> in <module>
      3 print(it.__next__())
      4 print(it.__next__())
----> 5 print(it.__next__())

StopIteration: 

一些数据结构listtupledictsetstr等作用于for循环的时候,首先对循环对象实现迭代器包装,返回一个迭代器对象,然后每循环一步,就调用迭代器对象的next方法,循环结束的时候,自动处理了 StopIteration这个异常。举个例子:

In [3]:
for x in [1, 2, 3, 4, 5]:
    pass

完全等价与:

In [4]:
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

假设你有一个特定的数据结构,比如说某种图或树结构,需要以一定的技巧获取下一个值,这时你可以实现一个迭代器,将复杂的逻辑都放到next()函数中,这样其他人就可以直接使用for循环来遍历你的数据结构,无需关系你的结构是如何工作的.

可见,迭代器的作用是为所有的数据结构提供统一的接口,只要实现了迭代器协议,无论是2叉树3叉树N叉树集合、还是链表,都可以使用next()来获取下一个值,使用for循环来遍历.

In [ ]:
 
posted @ 2019-01-26 16:57:49
评论加载中...

发表评论