1、迭代器基于下面两个个方法:
(1)__next__
返回容器的下一个项目
(2)__iter__
返回迭代器本身
2、当序列遍历完时,将抛出StopIteration异常,所以通过捕获这个异常来停止循环
下面是自定义迭代器的示例代码:
class MyIterator(object):
def __init__(self, step):
self.step = step
def __next__(self):
if self.step == 0:
raise StopIteration
self.step -= 1
return self.step
def __iter__(self):
return self
for i in MyIterator(6):
print(i)
运行结果:
5
4
3
2
1
0
用户定义的迭代器
如今,Python中所有的迭代坏境都会先尝试_iter_
二方法,再尝试_getite_
也就是说,它们宁愿使角第13章所学到的迭代协议,然后才是重复对对象进行索弓l运算。如果对象不支持迭代协议,就会尝试索引运算。从技术角度来讲,迭代环境是通过调用内置函数iter去尝试寻找iter方法来实现的,而这种方法应该返回一个迭代器对象。如果已经提供了,Python就会重复调用这个迭代器对象的next方法,直到发生stop工teration异常。如果没找到这类__iter__
方法,Python会改用__getitem__
机制,就像之前那样通过偏移量重复索引,直到引发
IndexError异常。
下面的文件iters.py定义了用户定义的迭代器类来生成平方值。
class Squares:
def __init__(self, start, stop):
self.value = start - 1
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.value == self.stop:
raise StopIteration
self.value += 1
return self.value **2
#Python小白学习交流群:711312441
for i in Squares(1, 5):
print(i)
运行结果:
1
4
9
16
25
用生成器函数编写
def gsquares(start, stop):
for i in range(start, stop+1):
yield i ** 2
for i in gsquares(1, 5):
print(i, end=" ")
运行结果:
1 4 9 16 25