Python學習之路 迭代器與生成器

2021-10-02 11:48:15 字數 3150 閱讀 8829

二、迭代器

三、生成器

迭代是重複反饋過程的活動,其目的通常是為了逼近所需目標或結果。

在前面的學習中,我們知道list、tuple、str等這些物件是可以用for迴圈進行遍歷的,這種遍歷的方式我們就稱之為迭代。能夠進行迭代行為的物件我們就稱之為可迭代物件(iterable)

我們可以用python的內建模組來判斷乙個物件是不是可迭代物件:

from collections.abc import iterable

print

(isinstance

('python'

, iterable)

)# true

print

(isinstance([

1,2]

, iterable)

)# true

print

(isinstance((

1,), iterable)

)# true

print

(isinstance

(, iterable)

)# true

print

(isinstance

(, iterable)

)# true

通過**驗證,我們之前常用的字串、列表、元組、字典和集合都屬於可迭代物件。

在python中,我們可以自定義迭代器。想要定義迭代器,那麼我們就需要在我們的類中新增__iter__() 與 __next__()這兩個魔法方法。

__iter__() 方法:返回乙個特殊的迭代器物件;

__next__() 方法:呼叫next() 函式時呼叫此方法。

下面我們就用迭代器來實現輸出斐波那契數列:

斐波那契數列:1、1、2、3、5、8、13、21、34…

class

demo

:def

__iter__

(self)

: self.a =

0 self.b =

1return self

def__next__

(self)

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

return self.a

num = demo(

)myiter =

iter

(num)

print

(next

(myiter)

)# 1

print

(next

(myiter)

)# 1

print

(next

(myiter)

)# 2

print

(next

(myiter)

)# 3

使用上面的**我們成功實現了利用迭代器輸出斐波那契數列。

為什麼在python中我們有那麼多的可迭代的容器我們卻還要弄乙個迭代器呢?像列表、元組等這些容器都能夠實現迭代輸出,為什麼我們還需要自定義迭代器呢?

首先我們思考乙個問題,如果我們要遍歷輸出 1~100000 的數字,我們用列表怎樣輸出呢?我們可以用列表推導式——[i for i in range(100000)],像這樣就可以輸出。但是這樣有乙個問題,那就是這樣使用時python直譯器會將整個列表放入到記憶體中,這龐大的資料量必定會占用極大的記憶體空間。

首先就會拖累程式的執行速度,而且很有可能會產生記憶體溢位的風險。這就是列表的壞處。

但是如果我們使用迭代器輸出,就不會有這種風險了。因為迭代器是呼叫的函式,輸出一次呼叫一次函式。因此迭代器消耗的記憶體始終是固定的,不會有記憶體溢位的風險。

因此在資料較為龐大時我們應當採用迭代器輸出。

在python中,使用了yield的函式被稱為生成器(generator)

生成器函式跟普通函式不同的是,生成器是乙個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是乙個迭代器。

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值(這裡和return類似), 並在下一次執行 next() 方法時從當前位置繼續執行。

建立列表和生成器的區別僅在於最外層的(),建立的是乙個列表,而 () 建立的是乙個生成器。

a =

(i for i in

range(10

))print

(next

(a))

# 0print

(next

(a))

# 1print

(next

(a))

# 2

利用生成器來實現輸出斐波那契數列:

def

fibonacci()

: a, b, counter =0,

1,0while

true

:yield a

a, b = b, a + b

counter +=

1

f = fibonacci(

)# f 是乙個迭代器,由生成器返回生成

print

(next

(f))

# 0print

(next

(f))

# 1print

(next

(f))

# 2

生成器和迭代器極為相似,生成器也像迭代器那樣有著佔據記憶體空間少的優點,同樣適合在資料量較為龐大時使用。

Python學習之路 迭代器

可直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function.這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable.可以使用isinstan...

python之路 迭代器與可迭代物件

可以直接使用for迴圈進行遍歷的資料型別有兩種 一種是集合型資料型別如list str dict set tuple,一種是generator型別,這些物件都可以使用isinstance函式進行判斷 from collections import iterable list1 1,2,3,4,5,6...

doraemon的python 迭代器與生成器

6.9.1迭代器的定義 自己不用寫,只需要學會用 迭代器 對可迭代物件中的元素進行逐一獲取,表象 具有 next 方法且每次呼叫都獲取可迭代物件中的元素 從前到後乙個個獲取 迭代器想要獲取每個值,就必須反覆執行 v1 11,22,33,44 列表轉化成迭代器 v2 iter v1 result v2...