iter(self)
在定义一个类时,添加这个函数,其返回的类就是一个可迭代对象
和其一起使用的还有__next__(self)
其作用是在调用next函数时执行这个函数下的内容,并返回return后的内容
先来看一个示例:
class Test(object):
n = 0
def __iter__(self):
print('iter',self.n)
self.n+=1
return self
def __next__(self):
self.n+=1
print('next',self.n)
return self.n
a = Test()
for i in range(5):
print(next(a))
在上面的示例中首先实例化了一个Test对象
然后调用了5次的next函数,输出的结果如下:
next 1
1
next 2
2
next 3
3
next 4
4
next 5
5
可以看出并没有调用iter函数,那么在什么情况下会调用iteration呢?
还是上面的类的定义,换一种方式输出
a = Test()
print(list(a))
结果是:
iter 0
next 2
next 3
next 4
next 5
next 6
next 7
next 8
...
可以看到调用了一次iter然后就无限循环的调用next函数,不会停止的原因是没有 StopIteration 异常,for循环的原理也是如此,不断的调用__next__(self)函数,直到抛出异常表示没有下一个元素停止.我们尝试添加一个异常抛出
class Test(object):
n = 0
def __iter__(self):
print('iter',self.n)
self.n+=1
return self
def __next__(self):
if self.n>=5:
raise StopIteration
self.n+=1
print('next',self.n)
return self.n
a = Test()
print(list(a))
结果为:
iter 0
next 2
next 3
next 4
next 5
[2, 3, 4, 5]
问题依然存在,__iter__的作用究竟是什么
按照我的理解,这个__iter__的作用是在对实例对象进行迭代(for/list等操作)时,调用这个函数,并对其返回值调用next函数
尝试的示例如下
首先__iter__不返回任何东西即返回值为None
class Test(object):
n = 0
def __iter__(self):
print('iter',self.n)
self.n+=1
a = Test()
print(list(a))
#TypeError: iter() returned non-iterator of type 'NoneType'
#iter 0
会在输出时报错
其次是和前面的示例一样,直接将self返回出去,就会调用a的next方法获取值,就不演示了
最后一种就是返回一个其他的可迭代对象(yield),此时就不会再调用a的next而是直接使用返回的可迭代对象:
class Test(object):
n = 0
def __iter__(self):
for i in range(5):
print('iter',self.n)
self.n+=1
yield self.n
def __next__(self):
if self.n>=5:
raise StopIteration
self.n+=1
print('next',self.n)
return self.n
#输出
iter 0
iter 1
iter 2
iter 3
iter 4
[1, 2, 3, 4, 5]