目錄:
一、迭代器
二、課時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課後習題及答案
*******************************