课时48:魔法方法:迭代器
目录:
一、迭代器
二、课时48课后习题及答案
*************
一、迭代器
*************
迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。提供迭代方法的容器称为迭代器,通常接触的迭代器有序列(列表、元组、字符串)还有字典也是迭代器,都支持迭代的此操作。
举个例子,通常使用for语句来进行迭代:
>>> for i in "FishC": print(i) F i s h C
字符串就是一个容器,同时也是一个迭代器,for语句的作用就是触发这个迭代器的迭代功能,每次从容器里依次拿出一个数据,这就是迭代操作。
字典和文件也是支持迭代操作的:
>>> links = {'1':'111111',\ '2':'222222',\ '3':'333333',\ '4':'444444'} >>> for each in links: print('%s->%s'%(each,links[each])) 1->111111 2->222222 3->333333 4->444444
关于迭代,Python提供了两个BIF:
- iter()
- next()
对于一个容器对象调用iter()就得到它的迭代器,调用next()迭代器就会返回下一个值,然后怎么结束呢?如果迭代器没有值可以返回了,Python会抛出一个StopIteration的异常:
>>> string = "FishC" >>> it = iter(string) >>> next(it) 'F' >>> next(it) 'i' >>> next(it) 's' >>> next(it) 'h' >>> next(it) 'C' >>> next(it) Traceback (most recent call last): File "<pyshell#19>", line 1, in <module> next(it) StopIteration
所以利用这两个BIF,可以分析出for语句其实是这样工作的:
>>> string = "FishC" >>> it = iter(string) >>> while True: try: each = next(it) except StopIteration: break print(each) F i s h C
那么关于实现迭代器的魔法方法有两个:
- __iter__()
- __next__()
一个容器如果是迭代器,那就必须实现__iter__()魔法方法,这个方法实际上就是返回迭代器本身。接下来重点是要实现的是__next__()魔法方法,因为它决定了迭代的规则。简单举个例子:
class Fibs: def __init__(self): self.a = 0 self.b = 1 def __iter__(self): return self def __next__(self): self.a, self.b = self.b, self.a + self.b return self.a
>>> fibs = Fibs() >>> for each in fibs: if each < 20: print(each) else: break 1 1 2 3 5 8 13
好了,这个迭代器的唯一亮点就是没有终点,所以如果没有跳出循环,它会不断迭代下去。那可不可以加一个参数,用于控制迭代的范围呢?
>>> fibs = Fibs() >>> for each in fibs: print(each) 1 1 2 3 5 8 13
>>> fibs = Fibs(10) >>> for each in fibs: print(each) 1 1 2 3 5 8
是不是很容易呢?就是那么回事的啦。
*******************************
二、课时48课后习题及答案
*******************************
爱笑的男孩运气都不会差