Python 迭代器、生成器
迭代器是一个可以记住遍历位置的对象。
迭代器从集合的第一个元素开始访问,直到所有的元素被访问完。迭代器只能往前不会后退。
迭代器两个基本方法: iter() 和 next()。
1. 迭代器 VS 可迭代对象(Iterable)
列表、元组、字典、集合都是可迭代对象。它们是迭代的容器,可从容器中获取迭代器(Iterator)。
实例:
从元组返回一个迭代器
mytuple = ("apple", "banana", "cherry") myit = iter(mytuple) # 创建迭代器对象 print(next(myit)) # 输出迭代器的下一个元素 print(next(myit)) print(next(myit))
输出:
apple
banana
cherry
字符串也是可迭代对象。
mystr = "banana" myit = iter(mystr) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit)) print(next(myit))
输出:
b
a
n
a
n
a
2. 遍历迭代器
mytuple = ("apple", "banana", "cherry") for x in mytuple: print(x)
输出:
apple
banana
cherry
提示:for 循环实际上创建了一个迭代器对象,并为每个循环执行 next() 方法。
3. 创建迭代器
把一个类作为一个迭代器需要在类中实现 __iter__() 和 __next__() 方法。
__iter__() 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
__next__() 方法返回下一个迭代器对象。
实例:
创建一个返回数字的迭代器,初始值 1,逐步递增 1。
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))
输出:
1 2 3 4 5
StopIteration
结束迭代,防止出现无限循环。
class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 10: x = self.a self.a += 1 return x else: raise StopIteration myclass = MyNumbers() myiter = iter(myclass) for x in myiter: print(x)
输出:
1 2 3 4 5 6 7 8 9 10