1沾谜、BUG的由來
一位女科學(xué)家和一只臭蟲的故事。
故事的主人公是被譽(yù)為計(jì)算機(jī)程序之母的格蕾絲·赫伯(Grace Hopper)胀莹。時(shí)光回到1947年基跑,當(dāng)時(shí)她正在為下圖這個(gè)龐然大物編制程序。
這是世界上第一部萬用計(jì)算機(jī)的進(jìn)化版——馬克2號(hào)(Mark II)嗜逻。瞧瞧這龐大的機(jī)器涩僻,可想而知,格蕾絲不止要做腦力活兒栈顷,還得做體力活兒逆日。
有一天,她正在調(diào)試程序(就跟我們?cè)陔娔X上運(yùn)行代碼萄凤,看終端有沒有報(bào)錯(cuò)一樣)室抽,結(jié)果老是出現(xiàn)故障。
層層排查后靡努,她拆開了繼電器坪圾,結(jié)果發(fā)現(xiàn)有只飛蛾被夾扁在觸點(diǎn)中間晓折,從而“卡”住了機(jī)器的運(yùn)行。揪出來之后兽泄,格蕾絲幽默地把這只幺蛾子的尸體貼在了她的工作日志上漓概,并喊它叫bug(臭蟲)。
從此病梢,bug就化身計(jì)算機(jī)領(lǐng)域里程序故障的代名詞胃珍,成為程序員一生如影隨形的“親密敵人”。而我們也自然把排除程序故障叫做debug蜓陌。
Debug是程序開發(fā)中需耗費(fèi)大量時(shí)間與精力的一項(xiàng)工作觅彰,我們將在本章中學(xué)習(xí)Debug的方法。
2钮热、出BUG的常見四種類型
出BUG一般常見的類型分為“粗心”填抬、“知識(shí)不熟練”、“思路不清”隧期、“被動(dòng)出錯(cuò)”飒责。
2.1、粗心
比如下面這段代碼:
a = input('請(qǐng)輸入密碼:')
if a == '123456'
print('通過')
仔細(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ò)誤篡石。
在python的使用中芥喇,還有縮進(jìn)、中文符號(hào)的使用等等因粗心造成的常見問題凰萨,所以我們需要一張清單讓我們完成自我檢查啦继控!
自檢清單
1.漏了末尾的冒號(hào)
,如if語句胖眷、循環(huán)語句武通、定義函數(shù)
2.縮進(jìn)錯(cuò)誤
,忘記縮進(jìn)或者縮進(jìn)和空格混用
3.把英文符號(hào)
寫成了中文符號(hào)
4.字符串拼接的時(shí)候珊搀,把字符串和數(shù)字
拼在一起
5.沒有定義變量
6.'=='判斷符號(hào)和定義符號(hào)'='混用
2.2冶忱、知識(shí)不熟練
a = []
a.append('A','B','C')
print(a)
比如上述的代碼,就是對(duì)append()函數(shù)的運(yùn)用不熟練的運(yùn)用境析,正確的append用法是:
append()
函數(shù)是列表的一個(gè)方法囚枪,要用句點(diǎn).
調(diào)用派诬,且append()
每次只能接受一個(gè)參數(shù),所以正確的寫法是這樣:
a = []
a.append('A')
a.append('B')
a.append('C')
print(a)
2.3链沼、思路不清
思路不清指的是當(dāng)我們解決比較復(fù)雜的問題時(shí)默赂,由于我們對(duì)細(xì)節(jié)和實(shí)現(xiàn)手段思考得不夠清楚,要么導(dǎo)致一步錯(cuò)括勺,步步錯(cuò)放可;要么雖然沒有報(bào)錯(cuò),但是程序沒有達(dá)到我們想要的效果朝刊。
我們可以用兩個(gè)工具來理清思路:
1、print()
函數(shù)
2蜈缤、用#
暫時(shí)注釋部分代碼
movie = {
'妖貓傳':['黃軒','染谷將太'],
'無問西東':['章子怡','王力宏','祖峰'],
'超時(shí)空同居':['雷佳音','佟麗婭'],
}
name=input('你查詢的演員是拾氓?')
for i in movie:
actors = [i] #這里的actors取值錯(cuò)誤了,正確用法為actors=movie[i]
print(actors) #打印當(dāng)前的actors底哥,看看問題出在哪咙鞍。
if name in actors:
print(name+'出演了'+i)
解決思路不清bug的三步法##
1.用#
把感覺會(huì)出問題的代碼段注釋掉
2.利用print()
語句,展示關(guān)鍵步驟的操作結(jié)果
3.根據(jù)print出的結(jié)果趾徽,一步步尋找和解決問題
2.4续滋、被動(dòng)出錯(cuò)
被動(dòng)掉坑,是指有時(shí)候你的代碼邏輯上并沒有錯(cuò)孵奶,但可能因?yàn)橛脩舻腻e(cuò)誤操作或者是一些“例外情況”而導(dǎo)致程序崩潰疲酌。
我們舉個(gè)例子,當(dāng)運(yùn)行以下代碼的時(shí)候了袁,如果輸入的東西不是數(shù)字朗恳,則程序一定會(huì)報(bào)錯(cuò):
age = int(input('你今年幾歲了?')) #我輸入了漢字十八歲
if age < 18:
print('不可以喝酒噢')
一定會(huì)報(bào)錯(cuò)的载绿。
另:
你今年幾歲了粥诫?153 #我輸入了153
153 #屏幕上打印了我的輸出,看起來是數(shù)字
<class 'str'> #但如果用<type(age)>來打印的話崭庸,顯示是字符串類型
為了不讓一些無關(guān)痛癢的小錯(cuò)影響程序的后續(xù)執(zhí)行怀浆,Python給我們提供了一種異常處理的機(jī)制,可以在異常出現(xiàn)時(shí)即時(shí)捕獲怕享,然后內(nèi)部消化掉执赡,讓程序繼續(xù)運(yùn)行。這就是try...except...
語句函筋,具體用法如下:
來搀玖,讓我們使用以下這個(gè)函數(shù)。
while True:
try:
age = int(input('你今年幾歲了驻呐?'))
break
except ValueError:
print('你輸入的不是數(shù)字灌诅!')
if age < 18:
print('不可以喝酒噢')