python生成器詳解

python生成器的優點:

(1)延遲計算,一次返回一個結果。生成器不會一次生成所有的結果,而是一邊循環一邊計算,這對於大數據量處理,是個非常有用的優勢。因爲在編程的實際應用中,佔用內存量是工程師必須考慮的一個問題。

(2)有效提高代碼可讀性。使用生成器以後,代碼行數更少。(下面的例子會說明)

說完生成器的優點,下面介紹一下python是如何表示生成器的。

在python中生成器有兩種表示形式:(1)生成器函數 (2)生成器表達式

(1)生成器函數

生成器函數與python中的普通函數定義相同,都是使用def 關鍵字進行定義。不同的地方,生成器使用yield語句而不是return語句返回結果。在執行生成器函數時,每次執行到yield語句之後,會返回一次結果,然後將函數掛起,再次執行生成器函數時從上次返回的yield語句處繼續執行。(延時計算特性)

舉例子說明:

定義普通函數和生成器函數求取0~10的平方

普通函數的定義及調用:

def getSquare_l(maxVal):

    square_list = []

    for i in range(maxVal+1):

        square_list.append(i*i)

    return square_list

square_list = getSquare_l(10)

square_list:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

生成器函數的定義及調用:

def getSquare_g(maxVal):

    for i in range(maxVal+1):

        yield i*i

square_generator = getSquare_g(10)

square_generator: <generator object getSquare_g at 0x109b7e308>

可以看到調用生成器函數返回的是一個generator object。想要提取generator中的值,可以用next方法進行提取,直到產生StopIteration異常。

next(square_generator): 0

next(square_generator): 1

...

next(square_generator): 100

next(square_generator): StopIteration

但是這樣太麻煩,我們同樣可以使用for循環進行生成器對象的提取

for i in square_generator:

    print(i)

通過對比生成器函數和普通函數,可以看到生成器函數所需要的代碼量更少,提高代碼的可讀性。

這裏需要加粗。生成器好處多多,但是需要注意的一點是,生成器只能遍歷一次。因爲遍歷一遍生成器對象之後就沒有記錄再存在於生成器之中了(我想這也是爲什麼生成器會節省內存的另一個原因)。

(2)生成器表達式

要說生成器表達式,就不得不提到列表生成式(list comprehension)。相信大家都已經聽說過列表生成式。這也是python中一個很強大的特性,可以用很少的代碼生成一個list。小編我在算法課上,只穿插的學了3周的python,這個特性就被老師當作重點,在期中和期末考試的時候,都考了這個知識點。

同樣求取0~10的平方

列表生成式:[i*i for i in range(11)]     結果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

所謂的生成器表達式就是將列表生成式的[ ] 換成 ( )。

生成器表達式: (i*i for i in range(11)) ,同樣,需要next方法或者for循環方法進行提取。


感謝
作者:泡泡_e661
鏈接:https://www.jianshu.com/p/8a774747008a

 

############################################################################################

這個寫的也不錯
版權聲明:本文爲CSDN博主「n_laomomo」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/niedongri/article/details/79978466

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章