課時48:魔法方法:迭代器

那是個好男孩發表於2018-08-26

目錄:

  一、迭代器

  二、課時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課後習題及答案

*******************************

 

相關文章