2020-07-31 Debug

【bug 1:粗心】

仔細(xì)看報(bào)錯(cuò)这溅,其中有3個(gè)關(guān)鍵信息啤它。(1)line 2代表這個(gè)bug出現(xiàn)在第2行,所以岛啸,我們?cè)贒ebug的時(shí)候,可以優(yōu)先從第2行開始檢查茴肥。(2)^代表bug發(fā)生的位置坚踩,這里指出的位置是第二行末尾。(3)這一行寫的是錯(cuò)誤類型瓤狐,SyntaxError指的是語法錯(cuò)誤瞬铸。

一開始可能對(duì)錯(cuò)誤類型的英文不太熟悉,可以直接復(fù)制到百度搜索:

這里有3處問題:(1)沒有定義變量n础锐,就使用n<3?(2)=是賦值嗓节,判斷兩個(gè)值是否相等應(yīng)該用==(3)2處else后面都漏了冒號(hào)。

【常見粗心錯(cuò)誤】

【bug 2:知識(shí)不熟練】

這里的知識(shí)錯(cuò)誤很明顯是:忘記了列表的索引是從0而不是從1開始的皆警。所以拦宣,正確的代碼應(yīng)該這樣寫:

某學(xué)員建了一個(gè)空列表a,希望往里面增加3個(gè)值耀怜,讓最后的列表變成 ['A','B','C']恢着,但寫出的代碼有誤桐愉。請(qǐng)你幫忙debug财破,讓它能夠順利運(yùn)行。

這里的問題出在append()函數(shù)从诲,回顧課堂中append()函數(shù)的相關(guān)知識(shí)左痢,或者搜索“python append”,我們可以知道系洛,并沒有a=append('A','B','C')?這種用法俊性。

append()函數(shù)是列表的一個(gè)方法,要用句點(diǎn).調(diào)用描扯,且append()每次只能接受一個(gè)參數(shù)定页,所以正確的寫法是這樣:

這種bug給我們的啟示是:當(dāng)你發(fā)現(xiàn)知識(shí)點(diǎn)記不清或者不能確定的時(shí)候,就要及時(shí)復(fù)習(xí)或者上網(wǎng)搜索绽诚。不要強(qiáng)行寫出自己不敢確定的代碼典徊,這種情況往往容易出錯(cuò)杭煎。

如果對(duì)某個(gè)基礎(chǔ)知識(shí)點(diǎn)沒有熟練的掌握,隨著往后知識(shí)廣度卒落、深度以及項(xiàng)目難度的增加羡铲,很可能會(huì)增加大量的理解成本,所以多復(fù)習(xí)儡毕、多練習(xí)總是沒有錯(cuò)滴也切。

【bug 3:思路不清】

1、遇到關(guān)鍵步驟時(shí)print出來腰湾,看是否達(dá)到我們所期望的結(jié)果雷恃,以此來揪出錯(cuò)誤的那一步。

2檐盟、當(dāng)你寫的代碼總是不對(duì)褂萧,又弄不明白哪里不對(duì)的時(shí)候,使用#號(hào)把后面的代碼注釋掉葵萎,一步一步運(yùn)行导犹,可以幫助排除錯(cuò)誤。

print()函數(shù)常和#號(hào)注釋結(jié)合在一起用來debug羡忘。

以下是一個(gè)同學(xué)提交的一段錯(cuò)誤代碼谎痢,大家可以運(yùn)行看看(記得這里有input()函數(shù),要在終端輸入卷雕,然后點(diǎn)擊enter):

這個(gè)程序沒有達(dá)到題目要求的效果节猿,可是又沒有報(bào)錯(cuò)。這時(shí)就需要我們思考漫雕,問題出在哪里呢滨嘱?

1-7行看不出問題,因?yàn)樽值涞膶懛ㄍσ?guī)范的浸间,沒出現(xiàn)“粗心bug”太雨。所以,問題應(yīng)該出現(xiàn)在for循環(huán)下面的語句中魁蒜。

繼續(xù)看第8行:這位同學(xué)想要用for循環(huán)遍歷這個(gè)字典囊扳。第9行:這位同學(xué)試圖取出字典中的值。(對(duì)字典用法熟悉的人可以看出兜看,這不符合語法規(guī)范)

但如果他自己不知道怎么回事的話锥咸,這時(shí),就可以用注釋print()函數(shù)來幫助他看看到底是怎么回事细移,請(qǐng)看下面的第10-12行代碼:

*多行注釋有兩種快捷操作:1搏予、在需要注釋的多行代碼塊前后加一組三引號(hào)''' 2、選中代碼后使用快捷鍵操作:Windows快捷鍵是ctrl+/弧轧,Mac為cmd+/雪侥,適用于本地編輯器球涛。

可見這樣寫取到的全部是字典的,而非值校镐。這時(shí)亿扁,就能意識(shí)到是這一行出了問題,他可以回看知識(shí)點(diǎn)鸟廓,發(fā)現(xiàn)字典的值的取法从祝,然后修改代碼。

以下代碼是一位學(xué)員制作的猜硬幣游戲引谜,一共有兩次猜的機(jī)會(huì)牍陌。

但是,這位學(xué)員可能沒有想清楚代碼的邏輯员咽,導(dǎo)致這個(gè)程序有個(gè)致命問題:用戶永遠(yuǎn)都不可能猜得對(duì)毒涧。

因?yàn)檫@個(gè)程序不報(bào)錯(cuò),所以就算沒解決問題贝室,程序也會(huì)運(yùn)行通過契讲。

為了確定random.randint(0,1)功能無誤,我們可以寫一段代碼滑频,隨機(jī)產(chǎn)生20個(gè)數(shù)字捡偏,看看效果是否如我們所愿。

問題應(yīng)該就出現(xiàn)在后面的條件判斷語句了峡迷。為了方便發(fā)現(xiàn)問題银伟,我們可以加入兩個(gè)print,把條件判斷語句先注釋掉绘搞,看看guess彤避、toss這兩個(gè)變量,存起來的是什么東西夯辖。

原來琉预,toss會(huì)隨機(jī)生成0或1,而guess會(huì)是“正面”或“反面”楼雹,這當(dāng)然會(huì)導(dǎo)致【toss == guess】條件為假模孩!也就是無論怎么猜尖阔,條件都不成立贮缅。

這里提供兩種答案,第一種方法是先創(chuàng)建一個(gè)列表

第二種方法更為取巧介却,直接把輸入的信息限定為'0'或'1'谴供。

【bug 4:被動(dòng)掉坑】

被動(dòng)掉坑,是指有時(shí)候你的代碼邏輯上并沒有錯(cuò)齿坷,但可能因?yàn)橛脩舻腻e(cuò)誤操作或者是一些“例外情況”而導(dǎo)致程序崩潰桂肌。

我們舉個(gè)例子数焊,當(dāng)運(yùn)行以下代碼的時(shí)候,如果輸入的東西不是整數(shù)崎场,則程序一定會(huì)報(bào)錯(cuò)佩耳。

這里的“ValueError”的意思是“傳入無效的參數(shù)”。因?yàn)椋?u>int()函數(shù)只接受數(shù)字以及內(nèi)容為整數(shù)的字符串谭跨。

為了不讓一些無關(guān)痛癢的小錯(cuò)影響程序的后續(xù)執(zhí)行干厚,Python給我們提供了一種異常處理的機(jī)制,可以在異常出現(xiàn)時(shí)即時(shí)捕獲螃宙,然后內(nèi)部消化掉蛮瞄,讓程序繼續(xù)運(yùn)行。

這就是try…except…語句谆扎,具體用法如下:

剛才的報(bào)錯(cuò)挂捅,可以查到報(bào)錯(cuò)類型是“ValueError”。

現(xiàn)在你試試不輸入整數(shù)(比如輸入個(gè)abc之類的)堂湖,看代碼是否會(huì)報(bào)錯(cuò):

代碼要點(diǎn)有兩個(gè):(1)因?yàn)椴恢烙脩羰裁磿r(shí)候才會(huì)輸入正確闲先,所以設(shè)置while循環(huán)來接受輸入,只要用戶輸入不是數(shù)字就會(huì)一直循環(huán)无蜂,輸入了數(shù)字就break跳出循環(huán)饵蒂。(2)使用try……except……語句,當(dāng)用戶輸錯(cuò)的時(shí)候會(huì)給予提示酱讶。

我們?cè)賮砜匆粋€(gè)例子退盯,下列代碼的目的是遍歷列表中的數(shù)字,依次用6除以他們泻肯。你可以運(yùn)行一下渊迁,看看報(bào)錯(cuò)類型是什么。

可見灶挟,報(bào)錯(cuò)類型是ZeroDivisionError琉朽,因?yàn)樾W(xué)數(shù)學(xué)告訴我們,0是不可以做除數(shù)的稚铣,所以導(dǎo)致后面的循環(huán)無法執(zhí)行箱叁。

這時(shí)呢,你可以使用try…except語句來幫助你:如果出現(xiàn)ZeroDivisionError就提醒'0不能做除數(shù)'惕医。

最后耕漱,關(guān)于Python的所有報(bào)錯(cuò)類型,有需要的話可以在這里查閱:Python 異常處理 | 菜鳥教程

【課后練習(xí)】

練習(xí)要求:

找出下列3個(gè)代碼的錯(cuò)誤抬伺,并將其糾正螟够。

【知識(shí)點(diǎn)debug】

期末考試結(jié)束了,小加在教務(wù)系統(tǒng)查到了自己的幾門必修課分?jǐn)?shù),他想通過python計(jì)算自己的平均分妓笙。

于是寫了下面的代碼若河,可是總是得不到結(jié)果,請(qǐng)幫糾正bug并跑通程序寞宫。

在這個(gè)代碼中萧福,他犯的錯(cuò)誤是沒有分清全局變量局部變量的區(qū)別。

【思維不清debug】

小強(qiáng)認(rèn)識(shí)了一個(gè)新朋友叫旺財(cái)辈赋,他想讓你給他取個(gè)外號(hào)统锤,但他很不喜歡別人叫他小狗和汪汪,

于是寫了一個(gè)程序讓自己避免叫他這兩個(gè)外號(hào)中的一個(gè)炭庙,可是不知為什么叫他小狗程序也沒有警告饲窿。

小強(qiáng)誤用了while進(jìn)入了死循環(huán),if條件那里應(yīng)該是or,而不是and焕蹄,不可能存在 x 等于兩個(gè)不同的字符串逾雄。

【被動(dòng)掉坑debug】

小明想用python寫個(gè)程序,看看自己的存款每個(gè)月漲了多少倍腻脏。

可是發(fā)現(xiàn)程序報(bào)錯(cuò)鸦泳,你能幫他找出錯(cuò)誤,使程序重新運(yùn)行嗎永品?

法一:

法二:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末做鹰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鼎姐,更是在濱河造成了極大的恐慌钾麸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炕桨,死亡現(xiàn)場離奇詭異饭尝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)献宫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門钥平,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姊途,你說我怎么就攤上這事涉瘾。” “怎么了捷兰?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵立叛,是天一觀的道長。 經(jīng)常有香客問我寂殉,道長囚巴,這世上最難降的妖魔是什么原在? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任友扰,我火速辦了婚禮彤叉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘村怪。我一直安慰自己秽浇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布甚负。 她就那樣靜靜地躺著柬焕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梭域。 梳的紋絲不亂的頭發(fā)上斑举,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音病涨,去河邊找鬼富玷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛既穆,可吹牛的內(nèi)容都是我干的赎懦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幻工,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼励两!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起囊颅,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤当悔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后踢代,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體先鱼,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年奸鬓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焙畔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡串远,死狀恐怖宏多,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澡罚,我是刑警寧澤伸但,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站留搔,受9級(jí)特大地震影響更胖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一却妨、第九天 我趴在偏房一處隱蔽的房頂上張望饵逐。 院中可真熱鬧,春花似錦彪标、人聲如沸倍权。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薄声。三九已至,卻和暖如春题画,著一層夾襖步出監(jiān)牢的瞬間默辨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工苍息, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廓奕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓档叔,卻偏偏與公主長得像桌粉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衙四,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355