淺談python中的生成器

  • 調(diào)用一個普通的函數(shù),一般是從函數(shù)的第一行代碼開始執(zhí)行,至return語句、異?;蛘咚姓Z句執(zhí)行完畢,可以理解為函數(shù)執(zhí)行完成。一旦函數(shù)使用結(jié)束,函數(shù)中做的所有工作以及保存在局部變量中的數(shù)據(jù)都都會丟失。下次使用該函數(shù)時,一切又都從頭開始。

  • 生成器可以使得Python模仿協(xié)同程序的概念得以實(shí)現(xiàn)。
    * 協(xié)同程序:可以運(yùn)行的獨(dú)立函數(shù)調(diào)用,函數(shù)可以暫?;蛘邟炱?,并且在需要的時候從程序離開的地方繼續(xù)或者是重新開始運(yùn)行。

  • 生成器可以暫時掛起函數(shù),并保留函數(shù)的局部變量等數(shù)據(jù),然后下次調(diào)用的時候,從上一次暫停的位置繼續(xù)執(zhí)行下去。

練習(xí)1

In [1]: def myGen():
   ...:     print("生成器被執(zhí)行!")
   ...:     yield 1
   ...:     yield 2
   ...:     

In [2]: myGenerator = myGen()

In [3]: next(myGenerator)
生成器被執(zhí)行!
Out[3]: 1

In [4]: next(myGenerator)
Out[4]: 2

In [5]: next(myGenerator)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-5-fc98abb8b680> in <module>()
----> 1 next(myGenerator)

StopIteration: 

注意:當(dāng)函數(shù)結(jié)束時,拋出一個StopIteration異常。Python中的for循環(huán)會自動調(diào)用next()方法和處理StopIteration異常,即for循環(huán)可以對生成器產(chǎn)生作用。

練習(xí)2

In [6]: for i in myGen():
   ...:     print(i)
   ...:     
生成器被執(zhí)行!
1
2

以生成器的方式實(shí)現(xiàn)斐波那契數(shù)列

In [7]: def fibs():
   ...:     a = 0
   ...:     b = 1
   ...:     while True:
   ...:         a , b = b ,a + b
   ...:         yield a
   ...:         

In [8]: for each in fibs():
   ...:     if each > 100:
   ...:         break
   ...:     print(each)
   ...:   
結(jié)果如下:  
1
1
2
3
5
8
13
21
34
55
89

推導(dǎo)式(列表、字典、集合

  • 1.列表推導(dǎo)式
In [1]: a = [i for i in range(100) if not( i % 2 )and i % 3]

In [2]: print(a)
[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]

注意:上述列表推導(dǎo)式求得是100以內(nèi),能被2整除,但不能被3整除的所有整數(shù)。

  • 2.字典推導(dǎo)式
In [3]: b = {i:i % 2 == 0 for i in range(10)}

In [4]: print(b)
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
  • 3.集合推導(dǎo)式
In [5]: c = {i for i in [1,1,2,3,3,4,5,5,5,5,7,8,9,41]}

In [6]: print(c)
{1, 2, 3, 4, 5, 7, 8, 9, 41}
  • 4.生成器推導(dǎo)式
In [7]: e = (i for i in range(10))

In [8]: e
Out[8]: <generator object <genexpr> at 0x000001B8579DBF10>

注意:generator就是生成器的意思,用普通的小括號括起來的正是生成式推導(dǎo)式,說明如下:

In [11]: next(e)
Out[11]: 0

In [12]: next(e)
Out[12]: 1

In [13]: next(e)
Out[13]: 2

In [14]: next(e)
Out[14]: 3

In [15]: next(e)
Out[15]: 4

In [16]: next(e)
Out[16]: 5
for循環(huán)打印出剩余的:
In [17]: for each in e:
    ...:     print(each)
    ...:     
6
7
8
9
  • 生成器推導(dǎo)式如果作為函數(shù)的參數(shù),可以直接寫推導(dǎo)式,不用加小括號:
In [1]: sum(i for i in range(100) if i % 2)
Out[1]: 2500

補(bǔ)充:

運(yùn)行環(huán)境:Anaconda3 中的Jupyter QTConsole,還可以使用PyCharm或者python3自帶的IDLE(適合新手學(xué)習(xí)使用)
下載地址:
<a >python3&python2.7最新版本下載地址</a>

python學(xué)習(xí)交流群:463024091
作者qq:1070457631

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容