一文搞懂Python迭代器和生成器

2022-08-26 16:45:16 字數 3244 閱讀 7688

很多童鞋搞不懂python迭代器和生成器到底是什麼?它們之間又有什麼樣的關係?

這篇文章就是要用最簡單的方式讓你理解python迭代器和生成器!

維基百科解釋道:

在python中,迭代器是遵循迭代協議的物件。使用iter()從任何序列物件中得到迭代器(如list, tuple, dictionary, set等)。另一種形式的輸入迭代器是generator(生成器)。
很多容器諸如列表、字串可以用for迴圈遍歷物件。for 語句會呼叫容器物件中的 iter()函式, 該函式返回乙個定義了 __next__() 方法的迭代器物件,該方法將逐一訪問容器中的元素。

所以說:python中,任意物件,只要定義了__next__方法,它就是乙個迭代器。因此,python中的容器如列表、元組、字典、集合、字串都可以被稱作迭代器。

講完迭代器後,迭代就比較好理解了,迭代就是從迭代器中取元素的過程。

比如我們用for迴圈從列表[1,2,3]中取元素,這種遍歷過程就被稱作迭代。

# 列表是迭代器

for element in [1, 2, 3]:

print(element)

# 元組是迭代器

for element in (1, 2, 3):

print(element)

# 字典是迭代器

for key in :

print(key)

# 字串是迭代器

for char in "123":

print(char)

# 開啟的text同樣是迭代器

for line in open("myfile.txt"):

print(line, end='')

如果你不想用for迴圈迭代呢?這時你可以:

先呼叫容器(以字串為例)的iter()函式

再使用 next() 內建函式來呼叫 __next__() 方法

當元素用盡時,__next__() 將引發 stopiteration 異常

看看廖雪峰大神的解釋:

通過列表生成式,我們可以直接建立乙個列表。

但是,受到記憶體限制,列表容量肯定是有限的。

而且,建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?

這樣就不必建立完整的list,從而節省大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器(generator)。

生成器也是一種迭代器,但是你只能對其迭代一次。這是因為它們並沒有把所有的值存在記憶體中,而是在執行時生成值。

你通過遍歷來使用它們,要麼用乙個for迴圈,要麼將它們傳遞給任意可以進行迭代的函式和結構。大多數時候生成器是以函式來實現的。然而,它們並不返回乙個值,而是yield(暫且譯作「生出」)乙個值。

每次對生成器呼叫 next() 時,它會從上次離開位置恢復執行(它會記住上次執行語句時的所有資料值)。顯示如何非常容易地建立生成器的示例如下:

def reverse(data):

for index in range(len(data)-1, -1, -1):

yield data[index]

>>> for char in reverse('golf'):

... print(char)

...flo

g

可以用生成器來完成的操作同樣可以用前一節所描述的基於類的迭代器來完成。但生成器的寫法更為緊湊,因為它會自動建 __iter__() 和 __next__()方法。

生成器不一定要用複雜的函式表示,python提供了簡潔的生成器表示式。

從形式上來看,生成器表示式和列表推導式很像,僅僅是將列表推導式中的替換為(),但是兩者差別挺大,生成器表示式可以說組合了迭代功能和列表解析功能。

生成器表示式可以認為是一種特殊的生成器函式,類似於lambda表示式和普通函式。但是和生成器一樣,生成器表示式也是返回生成器generator物件,一次只返回乙個值。

一文搞懂transform skew

目錄 如何理解斜切 skew,先看乙個 demo。在下面的 demo 中,有 4 個正方形,分別是 紅色 不做 skew 變換,綠色 x 方向變換,藍色 y 方向變換,黑色 兩個方向都變換,拖動下面的滑塊可以檢視改變 skew 角度後的效果。切換 selector 可以設定 transform or...

一文搞懂併發和並行

併發和並行是兩個非常容易混淆的概念。它們都可以表示兩個或多個任務一起執行,但是偏重點有點不同。併發偏重於多個任務交替執行,而多個任務之間有可能還是序列的。併發是邏輯上的同時發生 simultaneous 而並行是物理上的同時發生。然而並行的偏重點在於 同時執行 並行 parallel 指在同一時刻,...

一文搞懂property函式

接下來我帶大家了解乙個函式的作用以及使用技巧,希望對大家都有幫助,話不多說,接下來就開始我的表演特性 首先property有兩種用法,一種是作為函式的用法,一種是作為裝飾器的用法,接下來我們就逐一分析 property函式 看一下作為函式它包含的引數都有哪些 property fget none,f...