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
############################################################################################