02Python學(xué)習(xí)筆記之二.六【生成器磕昼、pdb調(diào)試】2019-08-18

章節(jié)號 內(nèi)容????????????
1圖片格式(png) 寬度大于620px,保持高寬比減低為620px
1-1 應(yīng)用
1-1-1 方法

第1章節(jié)? 生成器

  • 1-1?生成器—生成器的2種方式

??列表生成式:

In [17]: a=[x for x in range(10)]

In [18]: a
Out[18]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [21]: a=[x*2 for x in range(10)]

In [22]: a
Out[22]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

??什么是生成器:
??1延都、把列表生成式的[]改為()

In [25]: b=(x*2 for x in range(10))

In [26]: b
Out[26]: <generator object <genexpr> at 0x7fbf76db3eb8>

??怎么來使用?使用next(生成器名)棠耕,一次一個毡们。

In [27]: next(b)
Out[27]: 0

In [28]: next(b)
Out[28]: 2

In [36]: next(b)
Out[36]: 18

In [37]: next(b)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-37-adb3e17b0219> in <module>()
----> 1 next(b)

StopIteration: 

??斐波那契數(shù)列問題。
??2昧辽、使用yield
??引言衙熔,兩數(shù)交換問題。

In [38]: a,b=0,1

In [39]: a,b=b,a

In [40]: a
Out[40]: 1

In [41]: b
Out[41]: 0
In [42]: a=9

In [43]: b=10

In [44]: a=a+b

In [45]: b=a-b

In [46]: a=a-b

In [47]: a
Out[47]: 10

In [48]: b
Out[48]: 9

??↓這里使用列表的方式來實現(xiàn)斐波那契數(shù)列的計算搅荞。

def fab(n):
    a = [1, 1]
    
    for i in range(n):
        an = a[i]+a[i+1]
        a.append(an)
        # yield a
    print(a)

fab(10)
# c=fab(10)
# print(next(c))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

??↓用yield實現(xiàn):

def fab(n):
    a = [1, 1]
    
    for i in range(n):
        an = a[i]+a[i+1]
        a.append(an)
        yield a
    print(a)

print(fab(10))
c=fab(10)
print(next(c))
<generator object fab at 0x7f7f94fff1a8>
[1, 1, 2]

??↑函數(shù)體內(nèi)一旦聲明了yield红氯,此函數(shù)就會變成一個生成器框咙。不再能被以普通的方式調(diào)用。
??1痢甘、首先要把函數(shù)賦給一個變量c=fab(10)
??2喇嘱、使用next(c)來取生成器的值,或者a=c.__next__()來調(diào)用函數(shù)取得返回值。
??3塞栅、你yield誰者铜,使用next()的時候,就返回誰放椰。
??4作烟、一般都是套在循環(huán)中,next()一次砾医,執(zhí)行一次循環(huán)拿撩。
??5、程序每次停在yield結(jié)束處如蚜,下一次next()從yield的下一句開始執(zhí)行

In [4]: def fab(n):
   ...:     a = [1, 1]
   ...:     
   ...:     for i in range(n):
   ...:         an = a[i]+a[i+1]
   ...:         a.append(an)
   ...:         print("before yield")
   ...:         yield a
   ...:         print("after yield")
   ...:     print(a)
   ...: 
   ...: print(fab(10))
   ...: c=fab(10)
   ...: 
<generator object fab at 0x7fb98914dfa0>

In [5]: next(c)
before yield
Out[5]: [1, 1, 2]

In [6]: next(c)
after yield
before yield
Out[6]: [1, 1, 2, 3]

??如果沒有循環(huán)會咋樣呢压恒?只能生成一次~

In [1]: def fab():
   ...:     a=0
   ...:     b=1
   ...:     c=a+b
   ...:     yield c
   ...: 
   ...: 
   ...: print(fab())
   ...: a=fab()
   ...: 
<generator object fab at 0x7fb98a1f65f0>

In [2]: next(a)
Out[2]: 1

In [3]: next(a)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-3-15841f3f11d4> in <module>()
----> 1 next(a)

  • 1-2?生成器—自動輸出生成器返回值,不報錯

def fab(n):
    a = [1, 1]
    
    for i in range(n):
        an = a[i]+a[i+1]
        a.append(an)
        # print("before yield")
        yield a
        # print("after yield")
    # print(a)

for t in fab(10):
    print(t)

[1, 1, 2]
[1, 1, 2, 3]
[1, 1, 2, 3, 5]
[1, 1, 2, 3, 5, 8]
[1, 1, 2, 3, 5, 8, 13]
[1, 1, 2, 3, 5, 8, 13, 21]
[1, 1, 2, 3, 5, 8, 13, 21, 34]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

??↑一個生成器错邦,可以中for循環(huán)來輸入探赫,放到in的后面即可。

  • 1-3?生成器—send

In [14]: def test():
    ...:     i=0
    ...:     while i<5:
    ...:         t = yield i
    ...:         print(t)
    ...:         i+=1
    ...: 
    ...: t1=test()
    ...: 

In [15]: next(t1)
Out[15]: 0

In [16]: next(t1)
None
Out[16]: 1

In [17]: t1.send("hhhhh")
hhhhh
Out[17]: 2

In [18]: next(t1)
None
Out[18]: 3

In [19]: t1.send("jjjjjjj")
jjjjjjj
Out[19]: 4

??↑yield i本身是沒有值的撬呢,一旦使用了send()函數(shù)期吓,則相當(dāng)于給yield i發(fā)送了一個值,這個值就會賦值給t倾芝,從而被打印出來讨勤。
??↓send()next()都可以讓程序往下走一步。第一次不能使用send()晨另!

In [21]: def test():
    ...:     i=0
    ...:     while i<5:
    ...:         t = yield i
    ...:         print(t)
    ...:         i+=1
    ...: 
    ...: t1=test()
    ...: 

In [22]: t1.send("1123")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-22-fb04f94f864c> in <module>()
----> 1 t1.send("1123")

TypeError: can't send non-None value to a just-started generator

??↓非要使用潭千,則必須傳遞一個None

In [25]: def test():
    ...:     i=0
    ...:     while i<5:
    ...:         t = yield i
    ...:         print(t)
    ...:         i+=1
    ...: 
    ...: t1=test()
    ...: 

In [26]: t1.send(None)
Out[26]: 0

In [27]: def test():
    ...:     i=0
    ...:     while i<5:
    ...:         if i==0:
    ...:             temp = yield i
    ...:         else:
    ...:             yield i
    ...:         i+=1
    ...:         print(temp)
    ...: 
    ...: t=test()
    ...: 

In [28]: next(t)
Out[28]: 0

In [29]: t.send("hahah")
hahah
Out[29]: 1

In [30]: next(t)
hahah
Out[30]: 2

In [31]: next(t)
hahah
Out[31]: 3

In [32]: next(t)
hahah
Out[32]: 4

In [33]: next(t)
hahah

??↑如果yield這里有了一個賦值的操作借尿,那么如果不使用send給yield x發(fā)送一個值刨晴,那么yield x就會產(chǎn)生一個None,從而給等號左邊的變量賦值一個None,那么完全可以控制好程序的走向路翻,從而把send()出去的值一直保留下來狈癞?這有什么用呢?茂契?蝶桶??掉冶?真竖?脐雪??恢共?战秋??讨韭?

  • 1-4?生成器—完成多任務(wù)

??yield不是暫停的概念脂信,而是本輪執(zhí)行結(jié)束的概念。我結(jié)束了透硝,那執(zhí)行流就交給下一行代碼狰闪。我等待下一次執(zhí)行。

import time
def t1():
    while True:
        print("t1")
        yield None

def t2():
    while True:
        print("t2")
        yield None


t11=t1()
t22=t2()

while True:
    t11.__next__()
    t22.__next__()
    time.sleep(1)
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2

??↑實現(xiàn)的效果就是t1和t2看上去同時執(zhí)行蹬铺。這就叫!秉撇!協(xié)程L鹋省!
??多任務(wù)分:進程琐馆、線程规阀、協(xié)程

第2章節(jié)? pdb調(diào)試(命令行)

??如何開啟調(diào)試

python3 -m pdb 名字.py

??交互調(diào)試瘦麸,進入python或ipython解釋器

import pdb

??調(diào)試命令:
??1谁撼、l 。顯示當(dāng)前代碼list(不好使敲個n滋饲,再l)厉碟。
??2、n屠缭。 向下執(zhí)行一行next(不進入函數(shù))箍鼓。
??3、c呵曹。 直接執(zhí)行完畢continue款咖。
??4、b 空格 行數(shù)奄喂。在制定行數(shù)加斷點铐殃。
??5、b跨新。查看斷點序號富腊。
??6、clear 斷點序號域帐。刪除斷點蟹肘。
??7词疼、s。執(zhí)行進入函數(shù)帘腹。
??8贰盗、p 變量。查看變量數(shù)據(jù)阳欲。
??9舵盈、a。查看函數(shù)內(nèi)參數(shù)球化。
??10秽晚、

??↓小寫字母l,查看執(zhí)行流位置

li@li-System-Product-Name:~/py$ python3 -m pdb 2.py
> /home/li/py/2.py(1)<module>()
-> class person(object):
(Pdb) l
  1  -> class person(object):
  2         def __init__(self, name, age):
  3             self.__name = name
  4             self.__age = age
  5     
  6         def chaname(self, name):
  7             self.__name = name
  8     
  9         def chaage(self, age):
 10             if age <=100:
 11                 self.__age = age
(Pdb) 

??↓小寫字母n筒愚,執(zhí)行一步

(Pdb) n
> /home/li/py/2.py(25)<module>()
-> ren = person("xiaom", 14)
(Pdb) 

??↓再l看一下

(Pdb) l
 20             print(self.__age)
 21     
 22         def getname(self):
 23             return self.__name
 24     
 25  -> ren = person("xiaom", 14)
 26     ren.priname()
 27     ren.priage()
 28     
 29     ren.chaname("aaa")
 30     ren.chaage(1111)
(Pdb) 

??↓c赴蝇,直接執(zhí)行完畢

li@li-System-Product-Name:~/py$ python3 -m pdb 2.py
> /home/li/py/2.py(1)<module>()
-> class person(object):
(Pdb) c
xiaom
14
輸入的年紀(jì)非法
aaa
14
The program finished and will be restarted
> /home/li/py/2.py(1)<module>()
-> class person(object):

??↓b空格7,回車巢掺,c句伶。設(shè)斷點,執(zhí)行到斷點陆淀。

(Pdb) b 6
Breakpoint 1 at /home/li/py/2.py:6
(Pdb) c
> /home/li/py/2.py(6)person()
-> def chaname(self, name):
(Pdb) l
  1     class person(object):
  2         def __init__(self, name, age):
  3             self.__name = name
  4             self.__age = age
  5     
  6 B->     def chaname(self, name):
  7             self.__name = name
  8     
  9         def chaage(self, age):
 10             if age <=100:
 11                 self.__age = age
(Pdb) 
  • 2-1?pdb調(diào)試—








  • 3-1?類的初步—定義一個類并創(chuàng)建對象實例

??↑↓類的基本結(jié)構(gòu):

  • 1-1?類的初步—定義一個類并創(chuàng)建對象實例

??1-1-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
  • 1-2?類的初步—定義一個類并創(chuàng)建對象實例

??1-2-1. 導(dǎo)言—用戶管理—用戶的分類及介紹

第2章節(jié)?

  • 2-1?類的初步—定義一個類并創(chuàng)建對象實例

??2-1-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
  • 2-2?類的初步—定義一個類并創(chuàng)建對象實例

??2-2-1. 導(dǎo)言—用戶管理—用戶的分類及介紹

第3章節(jié)?

  • 3-1?類的初步—定義一個類并創(chuàng)建對象實例

??3-1-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
  • 3-2?類的初步—定義一個類并創(chuàng)建對象實例

??3-2-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末考余,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轧苫,更是在濱河造成了極大的恐慌楚堤,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件含懊,死亡現(xiàn)場離奇詭異身冬,居然都是意外死亡,警方通過查閱死者的電腦和手機岔乔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門吏恭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人重罪,你說我怎么就攤上這事樱哼。” “怎么了剿配?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵搅幅,是天一觀的道長。 經(jīng)常有香客問我呼胚,道長茄唐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮沪编,結(jié)果婚禮上呼盆,老公的妹妹穿的比我還像新娘。我一直安慰自己蚁廓,他們只是感情好访圃,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著相嵌,像睡著了一般腿时。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饭宾,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天批糟,我揣著相機與錄音,去河邊找鬼看铆。 笑死徽鼎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弹惦。 我是一名探鬼主播否淤,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肤频!你這毒婦竟也來了叹括?” 一聲冷哼從身側(cè)響起算墨,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤宵荒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后净嘀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體报咳,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年挖藏,在試婚紗的時候發(fā)現(xiàn)自己被綠了暑刃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡膜眠,死狀恐怖岩臣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宵膨,我是刑警寧澤架谎,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站辟躏,受9級特大地震影響谷扣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捎琐,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一会涎、第九天 我趴在偏房一處隱蔽的房頂上張望裹匙。 院中可真熱鬧,春花似錦末秃、人聲如沸概页。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绰沥。三九已至,卻和暖如春贺待,著一層夾襖步出監(jiān)牢的瞬間徽曲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工麸塞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秃臣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓哪工,卻偏偏與公主長得像奥此,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雁比,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349