調(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