【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)行嗎永品?
法一:
法二: