Python高階主題教程1 Iterators

2021-09-26 22:26:03 字數 3356 閱讀 9696

iterators是可以向上迭代的物件。在這篇部落格中,我們會學習到iterator如何工作,以及如何使用__iter__和__next__方法(即class中的函式)定義你自己的iterator。

iterators在python隨處可見,for迴圈,comprehensions,generator等等都是用它來實現的,只是表面你看不見。

在python中,iterator僅僅就是個可以迭代的物件(object),乙個可以返回資料的物件,每次返回乙個元素。

從技術上來說,pythoniterator object必須要實現兩個方法:__iter__ () 和 __next__() ,統稱為iterator protocal

如果我們得到了乙個iterator object,我們就把這個物件稱之為iterable。絕大多數內建的container都是可迭代的(iterable):list,tuple,string等等。

使用iter() 函式可以給我們返回乙個iterator。

我們使用 next() 函式手動迭代出乙個iterator中所有的項,當到最後乙個項時不會再有元素返回,它將引發 stopiteration ,看下面例子。

# define a list

my_list =[4

,7,0

,3]# get an iterator using iter()

my_iter =

iter

(my_list)

## iterate through it using next()

#prints 4

print

(next

(my_iter)

)#prints 7

print

(next

(my_iter)

)## next(obj) is same as obj.__next__()

#prints 0

print

(my_iter.__next__())

#prints 3

print

(my_iter.__next__())

## this will raise error, no items left

next

(my_iter)

乙個更棒的自動迭代方法你是使用for loop。如此一來,我們就可以對任何能返回iterator的物件進行迭代。比如說 list,string,file等。

>>

>

for element in my_list:..

.print

(element)..

.470

3

在上面的例子中,for迴圈能自動在list中迭代。實際上,for迴圈可以在任何可迭代的物件上進行迭代。讓我們深入看看for迴圈內部怎麼實現的:

for element in iterable:

# do something with element

實際上實現是這樣的:

# create an iterator object from that iterable

iter_obj =

iter

(iterable)

# infinite loop

while

true

:try

:# get the next item

element =

next

(iter_obj)

# do something with element

except stopiteration:

# if stopiteration is raised, break from loop

break

所以在內部,for 迴圈建立乙個iterator物件,是呼叫 iter() 函式完成的。有意思的是,for迴圈實際上乙個有限的while迴圈。

在迴圈內部,它呼叫next()得到下乙個元素,然後用這個元素執行for迴圈中的主體**。當iterator中元素迭代完時,stopiteration會被觸發,迴圈結束。需要注意的是,任何其他的異常都會被通過。

在python中從頭構建iterator很容易,只需要實現兩個方法:__iter()和__next()

iter()方法會返回它本身的迭代器。如若需要,可以完成初始化。

next()方法必須依序返回下乙個元素,直到最後乙個物件,如果此時再呼叫__next()__則會引發stopiterator。

class

powtwo

:"""class to implement an iterator

of powers of two"""

def__init__

(self,

max=0)

: self.

max=

maxdef

__iter__

(self)

: self.n =

0return self

def__next__

(self)

:if self.n <= self.

max:

result =

2** self.n

self.n +=

1return result

else

:raise stopiteration

下面我們建立乙個迭代器,如下迭代:

>>

> a = powtwo(4)

>>

> i =

iter

(a)>>

>

next

(i)1

>>

>

next

(i)2

>>

>

next

(i)4

>>

>

next

(i)8

>>

>

next

(i)16

>>

>

next

(i)traceback (most recent call last):.

..stopiteration

python教程閉包 python高階教程之閉包

閉包 1.函式引用 def test1 print in test1 func 呼叫函式 test1 引用函式 ret test1 print id ret print id test1 通過引用呼叫函式 ret 執行結果 in test1 func in test1 func 2.什麼是閉包 定義...

MYSQL的高階高階教程 1 編碼設定

博主曰 一杯茶,一包煙,乙個小姐姐看一天。資料庫儲存中文亂碼是常見的小問題,對於新手或者沒有自己裝過資料庫的人來說可能沒有遇到過資料庫亂碼問題。還有的人只知其然,卻不知其所以然。今天我們就來徹底乾掉這個知識點。其實亂碼問題解決起來非常簡單 只需要配置檔案裡修改資料庫編碼就可以了,我們首先來學習一些基...

python高階 pandas教程(二)

pandas資料結構 dataframe dataframe是乙個 型的資料結構,它含有一組有序的列,每列可以是不同的值型別 數值 字串 布林值 dataframe既有行索引也有列索引,可被看作是有series組成的字典。1 建立dataframe import pandas as pd impor...