課時48 魔法方法 迭代器

2022-08-04 11:09:11 字數 2854 閱讀 4025

目錄:

一、迭代器

二、課時48課後習題及答案

一、迭代器

迭代的意思類似於迴圈,每一次重複的過程被稱為一次迭代的過程,而每一次迭代得到的結果會被用來作為下一次迭代的初始值。提供迭代方法的容器稱為迭代器,通常接觸的迭代器有序列(列表、元組、字串)還有字典也是迭代器,都支援迭代的此操作。

舉個例子,通常使用for語句來進行迭代:

>>> for i in

"fishc":

print

(i) fishc

字串就是乙個容器,同時也是乙個迭代器,for語句的作用就是觸發這個迭代器的迭代功能,每次從容器裡依次拿出乙個資料,這就是迭代操作。

字典和檔案也是支援迭代操作的:

>>> links = 

>>> for each in

links:

print('

%s->%s

'%(each,links[each]))

1->111111

2->222222

3->333333

4->444444

關於迭代,python提供了兩個bif:

對於乙個容器物件呼叫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

"", line 1, in

next(it)

stopiteration

所以利用這兩個bif,可以分析出for語句其實是這樣工作的:

>>> string = "

fishc

">>> it =iter(string)

>>> while

true:

try:

each =next(it)

except

stopiteration:

break

print

(each)

fish

c

那麼關於實現迭代器的魔法方法有兩個:

乙個容器如果是迭代器,那就必須實現__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

112358

13

好了,這個迭代器的唯一亮點就是沒有終點,所以如果沒有跳出迴圈,它會不斷迭代下去。那可不可以加乙個引數,用於控制迭代的範圍呢?

>>> fibs =fibs()

>>> for each in

fibs:

print

(each)

112358

13

>>> fibs = fibs(10)

>>> for each in

fibs:

print

(each)

1123

58

是不是很容易呢?就是那麼回事的啦。

二、課時48課後習題及答案

魔法方法 迭代器

讀書筆記 iterator 是迭代器。迭代器有兩種方法 iter 可迭代的物件 返回乙個迭代器 next 迭代器 返回迭代器的下乙個元素,若果迭代器為空,將引發stopiteration 演示 string zss041962 iter string at0x0000000002f53b38 ite...

Python入門學習筆記( 魔法方法 迭代器)

for i in fishc print i f ishc links 你好 syntaxerror invalid character in identifier links 你好 我好 for each in links print s s each,links each 你好 我好 迭代器 i...

python 魔法方法 定製序列 迭代器

容器型別的協議 如果說你希望定製的容器是不可變的話,你只需要定義 len 和 getitem 方法。如元組 字串 如果你希望定製的容器是可變的話,除了 len 和 getitem 方法,你還需要定義 setitem 和 delitem 兩個方法。容器型別的魔法方法如下 編寫乙個不可改變的自定義列表,...