python中迭代器的基本方法 Python迭代器

2021-10-21 04:25:27 字數 3744 閱讀 6976

迭代器是可以迭代的物件。 在本教程中,您將了解迭代器的工作原理,以及如何使用__iter__和__next__方法構建自己的迭代器。

迭代器在python中無處不在。 它們優雅地實現在迴圈,推導,生成器等中,但隱藏在明顯的視覺中。

python中的迭代器只是乙個可以迭代的物件。乙個將一次返回資料的物件或乙個元素。

從技術上講,python迭代器物件必須實現兩個特殊的方法__iter__()和__next__(),統稱為迭代器協議。

如果我們從中獲取乙個迭代器,那麼乙個物件被稱為iterable。 大多數python中的內建容器是列表,元組,字串等都是可迭代的。

iter()函式(這又呼叫__iter__()方法)返回乙個迭代器。

通過python中的迭代器迭代

使用next()函式來手動遍歷迭代器的所有專案。當到達結束,沒有更多的資料要返回時,它將會引發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迴圈。 使用for迴圈可以迭代任何可以返回迭代器的物件,例如列表,字串,檔案等。

>>> for element in my_list:

... print(element)

迴圈如何實際工作?

在上面的例子中看到的,for迴圈能夠自動通過列表迭代。

事實上,for迴圈可以迭代任何可迭代物件。我們來仔細看一下在python中是如何實現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的內部,for迴圈通過在可迭代的物件上呼叫iter()來建立乙個迭代器物件iter_obj。

有意思的是,這個for迴圈實際上是乙個無限迴圈~..~。

在迴圈中,它呼叫next()來獲取下乙個元素,並使用該值執行for迴圈的主體。 在所有物件耗盡後,引發stopiteration異常,內部**獲從而結束迴圈。請注意,任何其他型別的異常都將正常通過。

在python中構建自己的iterator

構建迭代器在python中很容易。只需要實現__iter__()和__next__()方法。

__iter__()方法返回迭代器物件本身。如果需要,可以執行一些初始化。

__next__()方法必須返回序列中的下乙個專案(資料物件)。 在到達結束後,並在隨後的呼叫中它必須引發stopiteration異常。

在這裡,我們展示乙個例子,在每次迭代中給出下乙個2的幾次方。 次冪指數從零開始到使用者設定的數字。

class powtwo:

"""class to implement an iterator

of powers of two"""

def __init__(self, max = 0):

self.max = max

def __iter__(self):

self.n = 0

return self

def __next__(self):

if self.n <= self.max:

result = 2 ** self.n

self.n += 1

return result

else:

raise stopiteration

現在可以建立乙個迭代器,並通過它迭代如下 -

>>> a = powtwo(4)

>>> i = iter(a)

>>> next(i)

>>> next(i)

>>> next(i)

>>> next(i)

>>> next(i)

>>> next(i)

traceback (most recent call last):

stopiteration

也可以使用for迴圈迭代那些迭代器類。

>>> for i in powtwo(5):

... print(i)

python無限迭代器

迭代器物件中的專案不必都是可耗盡的,可以是無限迭代器(永遠不會結束)。 處理這樣的迭代器時一定要小心。

下面是用來演示無限迭代器的乙個簡單的例子。

內建的函式iter()可以用兩個引數來呼叫,其中第乙個引數必須是可呼叫物件(函式),而第二個引數是標頭。迭代器呼叫此函式,直到返回的值等於指定值。

>>> int()

>>> inf = iter(int,1)

>>> next(inf)

>>> next(inf)

可以看到,int()函式總是返回0,所以將它作為iter(int,1)傳遞將返回乙個呼叫int()的迭代器,直到返回值等於1。這從來沒有發生,所以這樣就得到乙個無限迭代器。

我們也可以建立自己的無限迭代器。 以下迭代器理論上將返回所有奇數。

class infiter:

"""infinite iterator to return all

odd numbers"""

def __iter__(self):

self.num = 1

return self

def __next__(self):

num = self.num

self.num += 2

return num

示例執行如下 -

>>> a = iter(infiter())

>>> next(a)

>>> next(a)

>>> next(a)

>>> next(a)

當迭代這些型別的無限迭代器時,請注意指定終止條件。

使用迭代器的優點是它們可以節省資源。 如上所示,我們可以獲得所有奇數,而不將整個系統儲存在記憶體中。理論上,可以在有限的記憶體中計算有無限的專案。

¥ 我要打賞

糾錯/補充

收藏加qq群啦,易百教程官方技術學習群

注意:建議每個人選自己的技術方向**,同乙個qq最多限加 3 個群。

python中迭代器 python中的迭代器

如果給定乙個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代 iteration d for key in d print key ac b當我們使用for迴圈時,只要作用於乙個可迭代物件,for迴圈就可以正常執行,而我們不太關心該物件究竟是list還...

Python中的迭代器

可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的生成器函式。這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable python的for迴圈本質上就是通過不斷呼叫n...

python中的迭代器

什麼是迭代器?迭代器是帶有next方法的簡單物件,當然也要實現 iter 函式。迭代器能在一串行的值上進行迭代,當沒有可供迭代時,next方法就會引發stopiteration 的異常。python中有很多的物件都是迭代器,例如 列表,元素,字串,檔案,對映,集合 如何使用迭代器?1.for 變數 ...