魚c筆記 Python魔法方法六 迭代器

2021-08-15 09:57:54 字數 2175 閱讀 1864

迭代類似於迴圈,每一次重複的過程被成為一次迭代的過程,每一次迭代得出的結果會被用作下一迭代的初始值。

提供迭代方法的容器我們成為迭代器。

通常我們接觸到的迭代器有序列,字典。

我們通常使用for語句來進行迭代。

>>> for i in "harry potter":

print(i, end = ' ')

h a r r y p o t t e r

for語句的作用就是觸發這個迭代器的迭代功能,每次從容器中拿出乙個資料,這就是迭代操作。

關於迭代操作,python提供了兩個bif:iter() 和 next()

對乙個容器物件呼叫iter() ,就得到它的迭代器,呼叫next,迭代器就會返回下乙個值。如果迭代器沒有值可以返回了,python就會丟擲乙個stopiteration的異常。

>>> string = 'me'

>>> it = iter(string) #it就是乙個迭代器了

>>> next(it)

'm'>>> next(it)

'e'>>> next(it)

traceback (most recent call last):

file "", line 1, in next(it)

stopiteration

for語句是用來自動呼叫迭代器的,有了iter() 和next() 這兩個方法,我們就可以大概分析出for語句的工作方式了。

>>> string = "harry"

>>> for each in string:

print(each, end = " ")

h a r r y

#用上述兩個bif模擬for語句

>>> it = iter(string)

>>> while true:

try:

each = next(it)

except stopiteration:

break

print(each, end = " ")

h a r r y

關於迭代器的魔法方法有兩個:__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 #相當於self.a0=self.a self.a=self.b self.b=self.a0+self.b

return self.a #得到下乙個菲波那切數列序列的值

>>> fibs = fibs()

>>> for each in fibs:

if each < 20:

print(each, end=" ")

else:

break

1 1 2 3 5 8 13

class fibs:

def __init__(self, n=10): #為了控制迭代的範圍,設定乙個引數n

self.a = 0

self.b = 1

self.n = n

def __iter__(self):

return self

def __next__(self):

self.a, self.b = self.b, self.a + self.b

if self.a > self.n: #當超過設定的範圍時

raise stopiteration

return self.a

>>> fibs = fibs()

>>> for each in fibs:

print(each, end=" ")

1 1 2 3 5 8

魚c筆記 Python魔法方法五 定製序列

想要成功的定製容器,我們首先要了解什麼是協議。協議 protocols 與其他程式語言中的介面很相似,它規定你哪些方法必須要定義。然而,在python中的協議就顯得不那麼正式。事實上,在python中,協議更像是一種指南 建議。容器型別的協議 如果說你想定製的容器是不可變的話,你只需要定義 len ...

Python筆記 魔法方法

1.不需要手動呼叫,會在合適的時機自動呼叫 2.這些方法都是以 開始,以 結束 3.方法名都是系統規定的,在合適的時機自己呼叫 class person object def init self,name,age 在建立物件時會自動呼叫這個方法 print init 方法被呼叫了 self.name...

Python魔法方法 基本的魔法方法

new cls 1.new 是在乙個物件例項化時候所呼叫的第乙個方法 2.他的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法 3.new 決定是否使用該 init 方法,因為.new 可以直接呼叫其他類的構造方法,或者返回別的例項物件來作為本類的例項,如果 new 沒有返回例項物件,...