迭代在很多语言中都有存在,在c++中,大家更加推崇使用迭代而不是下标的方式来访问数据,下面我们来看看python中的迭代。
python中我们可以使用迭代来遍历list,dirc,甚至file,让我们先来以最简单的方式来认识下迭代:
list = [1,2,3]for i in list: #似乎和c++的 for(auto iter:vec){}很像 dosomething
在c++中我们可以对iterator进行加减操作,来移动迭代器,那python中是如何实现的呢?查阅python 文档:
可以看到,python 中有iterators,Reverse Iteration 和 Copyable Iterators
那么先来看看iterators:
iter()是实现迭代的很重要的函数,它用来调用类中的__iter__()函数来获得一个迭代器。
对迭代器,我们可以使用for,或next()来使用它。是否有其他函数呢?例如获取当前指向的元素?前一个元素?
答:没有,确实,在我们实际使用过程中,几乎没人会使用next(),或是其他获取元素的函数,绝大多数是用for来遍历。(文档中甚至用‘ugly‘来形容__next__(),python真的简洁~~)
iter() 的两种用法:iter(obj),iter(callable, sentinel)
让我们拿一个list 来试一下,iter()将list转为了listiterator,同样可以用for来遍历,使用过一次后,在使用next获取下一个元素显示StopIteration(迭代器已到最后)
那我们如何使自己定义的类来实现iterator,让他也可以实现用for来遍历呢?
文档中这样说:
### Classes can define how they are iterated over by defining an __iter__() method; this should take no additional arguments and return a valid iterator object. A class that wants to be an iterator should implement two methods: a next() method that behaves as described above, and an __iter__() method that returns self. ###
想要定义的类实现迭代需要定义__next__()和__iter__()两个方法,__iter__()用来返回一个特殊的迭代器对象,__next__()用来完成实际的迭代。
最后来看下迭代器的性能:
看来迭代器性能好于下标迭代。