可能會有程序猿剛開始接觸Python的時候感受很清爽,入門很簡單,但後邊學到生成器和協程的時候就感受有些吃力了。本文主要與你們分享什麼是生成器以及生成器表達式。python
下載生成器yield源碼bash
書上說:函數使用yield能夠定義生成器對象,那麼包含yield的函數主是一個生成器函數,它能夠生成一個序列,方便迭代中使用,__next__()#python3中的特殊方法,應該避免使用特殊方法,next(c)使用內置函數next()便可。框架
def countdown(n): print("Counting down from %s" % n) while n > 0: yield n n -= 1 return c = countdown(10)print(c.__next__())#python3中的特殊方法,應該避免使用特殊方法print(next(c))#使用內置函數next()for i in c : print(i,end=' ')複製代碼
函數對象調用.__next__()函數時開始執行語句,遇到yield語句時中止。可使用循環來操做生成器。 調用close()方法關閉未使用完的生成器。 那麼問題來了,yield究竟是什麼?函數
咱們把上邊的代碼稍加變化:工具
def countdown1(n): print("Counting down from %s" % n) while n > 0: yield n*n n -= 1 return c = countdown1(10)print(next(c))print(next(c))print(next(c))for i in c : print(i,end=' ')複製代碼
運行以後咱們能夠發現程序運行到yield的時候返回了一個值,那麼yield和return在功能上有些類似。post
若是你對列表推導有些瞭解,你會發現,生成器表達式只不過是把列表的[]換成了元組的(),但列表推導返回的是一個結果集,而生成器表達式返回的是一個生成器。 由於這個特色,咱們能夠經過流方式訪問一個巨大的文件而沒必要把它直接加載到內存,這樣很大的提升了程序的性能。性能
代碼以下:ui
print('')print("生成器表達式:")b = (x*x for x in range(10) if (x % 2 ==0))print(next(b))print(next(b))for i in b : print(i, end=' ')複製代碼
【專業Python IDE推薦】——PyCharm spa
PyCharm 是一款Python IDE,其帶有一整套能夠幫助用戶在使用Python語言開發時提升其效率的工具。此外,該IDE提供了一些高級功能,以用於Django框架下的專業Web開發。code
更多Python教程:《利用Python自動生成小學生加減乘除口算考試題卷,再也不爲手寫算術題煩惱!》