python里面有很多的以__
开始和结尾的函数,利用它们可以完成很多复杂的逻辑代码,而且提高了代码的简洁性,本文主要总结了迭代器用到的魔术方法,并且主要以代码例子进行解释。
__iter__
和 __next__
其实这里需要引入一个概念,叫迭代器,常见的就是我们在使用for
语句的时候,python内部其实是把for
后面的对象上使用了内建函数iter
,比如:
a = [1, 2, 3]
for i in a:
do_something()
其实在python内部进行了类似如下的转换:
a = [1, 2, 3]
for i in iter(a):
do_something()
那么iter
返回的是什么呢,就是一个迭代对象,它主要映射到了类里面的__iter__
函数,此函数返回的是一个实现了__next__
的对象。注意理解这句话,比如:
class B(object):
def __next__(self):
raise StopIteration
class A(object):
def __iter__(self):
return B()
我们可以看见,A
这个类实现了一个__iter__
函数,返回的是B()
的实例对象,其中B
里面实现了__next__
这个函数。
下面引入几个概念:
Iterable
: 有迭代能力的对象,一个类,实现了__iter__
,那么就认为它有迭代能力,通常此函数必须返回一个实现了__next__
的对象,如果自己实现了,你可以返回self
,当然这个返回值不是必须的;
Iterator
: 迭代器(当然也是Iterable
),同时实现了__iter__
和__next__
的对象,缺少任何一个都不算是Iterator
,比如上面例子中,A()
可以是一个Iterable
,但是A()
和B()
都不能算是和Iterator
,因为A
只实现了__iter__
,而B
只实现了__next__
()。
我们可以使用collections
里面的类型来进行验证:
clas