Python 迭代器(Iterator)
迭代器是一个包含有限数量值的对象。
迭代器是一个可以被迭代的对象,可以遍历迭代器中的所有值。
从技术上讲,在Python中,迭代器是实现迭代器协议的对象,该协议由方法__iter__()
和__next__()
组成。
可迭代的数据类型
列表、元组、字典和集合都是可迭代的对象,可以从其中获得迭代器。
所有这些对象都可用iter()
方法获取迭代器:
示例
从元组中获取一个迭代器,遍历并打印每个值:
mytuple = ("自行车", "汽车", "高铁")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
字符串也是可迭代对象,可以从中获取迭代器:
示例
使用迭代器遍历字符串:
mystr = "自行车"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
for循环迭代
我们也可以使用for循环来遍历一个迭代器:
示例
迭代元组的值:
mytuple = ("自行车", "汽车", "高铁")
for x in mytuple:
print(x)
示例
迭代字符串的字符:
mystr = "自行车"
for x in mystr:
print(x)
for
循环内部实际上进行了迭代器的获取,及next()
方法的调用。
创建迭代器
一个对象要创建迭代器,变成可迭代的,必须实现方法:__iter__()
和__next__()
。
__iter__()
方法必须始终返回迭代器对象本身。
__next__()
方法必须返回序列中的下一项。
示例
创建一个返回数字的迭代器,从1开始,每个序列项递增1(返回1、2、3、4、5等):
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
StopIteration
上面示例next()
调用将永远继续,我们可以使用StopIteration
语句停止迭代。
在__next__()
方法中,我们可以根据迭代次数添加终止条件来引发错误:
示例
迭代20次后停止:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)