1. 迭代器
迭代是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter()
和next()
。 可迭代对象Iterable
包括: - 列表、元组、字典、集合(set)、字符串
- 生成器(generator)
>>> from collections import Iterable>>> isinstance([], Iterable) # 判断一个对象是否可迭代True>>> isinstance({}, Iterable)True>>> isinstance('abc', Iterable)True>>> isinstance(100, Iterable)False
>>>list=[1,2,3,4]>>> it = iter(list) # 创建迭代器对象>>> print (next(it)) # 输出迭代器的下一个元素1>>> print (next(it))2
迭代器对象可以使用常规for
语句进行遍历。
list=[1,2,3,4]it = iter(list) # 创建迭代器对象for x in it: print (x, end=" ") # 1 2 3 4
把一个类作为一个迭代器使用需要在类中实现两个方法__iter__()
与__next__()
。
class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 5: 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
StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()
方法中我们可以设置在完成指定循环次数后触发StopIteration异常来结束迭代。
2. 生成器
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
2.1 创建生成器的简单方法
>>> L = [x * x for x in range(6)]>>> L[0, 1, 4, 9, 16, 25]>>> g = (x * x for x in range(6)) # 创建生成器>>> gat 0x00000231F9699308>
>>> g = (x * x for x in range(6)) # 创建生成器>>> next(g)0>>> next(g)1>>> next(g)4>>> next(g)9>>> next(g)16>>> next(g)25>>> next(g)Traceback (most recent call last): File "", line 1, in next(g)StopIteration
因为生成器(generator)是一个可迭代对象,所以可以使用for
循环。
>>> g = (x * x for x in range(6)) # 创建生成器>>> for n in g: print(n) 01491625
2.2 使用函数来实现生成器
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b # 相当于依次执行 a = b 和 b = a + b n = n + 1 return 'done' for n in fib(6): print(n)# 1# 1# 2# 3# 5# 8
通过捕获StopIteration错误,在StopIteration的value中拿到生成器的返回值。
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done' g = fib(6)while True: try: x = next(g) print(x) except StopIteration as e: print('Generator return value:', e.value) break# 1# 1# 2# 3# 5# 8# Generator return value: done
参考资料: