Python:迭代器 Iterator

 

  迭代在很多语言中都有存在,在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__()用来完成实际的迭代。

 

最后来看下迭代器的性能:

看来迭代器性能好于下标迭代。

posted @ 2017-03-15 17:36  爱吃土豆的男孩  阅读(1829)  评论(0编辑  收藏  举报