第48讲:魔方方法——迭代器
一 迭代器的相关概念
- 迭代:每一次重复的过程被称作一次迭代,每一次迭代得到的结果,将会作为下一次迭代的初始值。
- 迭代器:提供迭代方法的容器。我们通常接触的迭代器有列表、元组、字符串和字典,他们都支持迭代操作。
- 举例:
-
1 >>> for i in "FishC": 2 ... print(i) 3 ... 4 F 5 i 6 s 7 h 8 C
例子中字符串就是一个容器,同时也是一个迭代器;for语句的作用就是触发这个迭代器的迭代功能,每次从容器里面一次拿出一个数据就是迭代操作。
- 内置函数:
- iter()
- 功能:用来生成迭代器。
- 语法:iter(object[, sentinel])
- 参数:
- bject -- 支持迭代的集合对象。
- sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。
- 返回值:迭代器对象。
- next()
- 功能:next() 返回迭代器的下一个项目,下一个项目不存在会抛出StopIteration的异常。next() 函数要和生成迭代器的iter() 函数一起使用。
-
语法:next(iterable[, default])
-
- iterable -- 可迭代对象
- default -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
- 返回值:返回对象帮助信息。
- 举例:
-
1 >>> next(it) 2 Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4 StopIteration 5 >>> string = "FishC" 6 >>> it = iter(string) 7 >>> next(it) 8 'F' 9 >>> while True: 10 ... try: 11 ... each = next(it) 12 ... except StopIteration: 13 ... break 14 ... print(each) 15 ... 16 i 17 s 18 h 19 C 20 >>>
- iter()
- 对应的魔法方法:
- __iter__()
- __next__()
- 举例:
-
1 >>> class Fibs: 2 ... def __init__(self): 3 ... self.a = 0 4 ... self.b = 1 5 ... def __iter__(self): 6 ... return self 7 ... def __next__(self): 8 ... self.a,self.b = self.b,self.a + self.b 9 ... return self.a 10 ... 11 >>> fibs = Fibs() 12 >>> for each in fibs: 13 ... if each < 20: 14 ... print(each) 15 ... else: 16 ... break 17 ... 18 1 19 1 20 2 21 3 22 5 23 8 24 13
- 可以手动控制输出的斐波那契数列范围的代码:
-
1 >>> class Fibs: 2 ... def __init__(self,n = 10): 3 ... self.a = 0 4 ... self.b = 1 5 ... self.n = n 6 ... def __iter__(self): 7 ... return self 8 ... def __next__(self): 9 ... self.a,self.b = self.b,self.a+self.b 10 ... if self.a > self.n: 11 ... raise StopIteration 12 ... return self.a 13 ... 14 >>> fibs = Fibs() 15 >>> for each in fibs: 16 ... print(each) 17 ... 18 1 19 1 20 2 21 3 22 5 23 8 24 >>> fibs = Fibs(100) 25 >>> for each in fibs: 26 ... print(each) 27 ... 28 1 29 1 30 2 31 3 32 5 33 8 34 13 35 21 36 34 37 55 38 89 39 >>>