十四. __iter__ 和 __next__
十四. __iter__ 和 __next__
前面迭代器那一章节我们讲解了可迭代对象和迭代器对象的特点以及 For 循环的原理 :
- 可迭代对象 (iterable) : 在python中,但凡内置有
__iter__
方法的对象,都是可迭代的对象 - 迭代器对象 (iterator) : 内置有
__next__
和__iter__
方法的对象, 就是迭代器对象, 可迭代对象执行__iter__
得到的返回值就是迭代器对象 - For 循环原理请到上面链接查看 (重点)
接下来我们来给一个类重写 __iter__
以及 __next__
方法, 让其可以迭代, 也可以被 for 循环
class Foo:
def __init__(self,start,end):
self.__start = start-1
self.__end=end
def __iter__(self):
return self
def __next__(self):
self.__start+=1
if self.__start>=self.__end:
raise StopIteration('超出值') # 抛出一个异常,For循环会检测异常自动结束循环
return self.__start
for i in Foo(1,10):
print(i) # 1 2 3 4 5 6 7 8 9
在函数学习的那一章节, 我们通过函数实现了 MyRange, 现在我们试试使用类来实现
class MyRange:
def __init__(self,start,stop,step=1):
self.__start = start-1
self.__stop = stop
self.__step = step
def __iter__(self):
return self
def __next__(self):
self.__start += self.__step
if self.__start >= self.__stop:
raise StopIteration("超出值") # 抛出异常
return self.__start
for i in MyRange(0,10,2):
print(i) # 1 3 5 7 9
应用小示例 : 产生一个小于某值的斐波那契数列
class Fib:
def __init__(self,count):
self.__start = 0
self.__stop = 1
self.__count = count
def __iter__(self):
return self
def __next__(self):
self.__start,self.__stop = self.__stop,self.__start+self.__stop
if self.__start >= self.__count:
raise StopIteration("超出") # 抛出异常
return self.__start
for i in Fib(50):
print(i) # 1 1 2 3 5 8 13 21 34