Python基礎學習——Debug

 

一、Bug的常見類型

1.粗心bug

例1:

#Debug前的代碼
a = input('請輸入密碼:')
if a == '123456'
    print('通過')

# 運行之後,仔細看報錯,通過理解報錯信息,可快速定位錯誤的根源
# 本例題中有3個關鍵信息:
#(1)line 2代表這個bug出現在第2行,所以,我們在Debug的時候,可以優先從第2行開始檢查。
#(2)^代表bug發生的位置,這裏指出的位置是第二行末尾。
#(3)這一行寫的是錯誤類型,SyntaxError指的是語法錯誤。
# 若運行後看不懂報錯信息,找度娘就基本知道是哪種類型的錯誤。 

# Debug後的代碼
a = input('請輸入密碼:')
if a == '123456':
    print('通過')

 

2.知識不熟練bug

       第二種bug:由於知識不夠熟練而引起的錯誤。這種錯誤給我們的啓示是:當你發現知識點記不清或者不能確定的時候,就要及時複習或者上網搜索。不要強行寫出自己不敢確定的代碼,這種情況往往容易出錯。

例2:

# Debug之前
a = []
a.append ('A','B','C')
print(a)

# 問題分析:
# 查找append()函數的相關知識,發現並沒有a=append('A','B','C') 這種用法。
# append()函數是列表的一個方法,要用句點.調用,且append()每次只能接受一個參數

# Debug之後
a = []
a.append('A')
a.append('B')
a.append('C')
print(a)

3.思路不清bug

       思路不清指的是當我們解決比較複雜的問題時,由於我們對細節和實現手段思考得不夠清楚,要麼導致一步錯,步步錯;要麼雖然沒有報錯,但是程序沒有達到我們想要的效果。

(1)print()函數

         主要用於檢驗對錯:遇到關鍵步驟時print出來,看是否達到我們所期望的結果,以此來揪出錯誤的那一步。

(2)#號

         當你寫的代碼總是不對,又弄不明白哪裏不對的時候,使用#號把後面的代碼註釋掉,一步一步運行,可以幫助排除錯誤。

例3:

Debug之前程序沒有報錯,但是沒有實現想要的效果。例題要求如下圖:

# Debug之前
movie = {
    '妖貓傳':['黃軒','染谷將太'],
    '無問西東':['章子怡','王力宏','祖峯'],
    '超時空同居':['雷佳音','佟麗婭']
}

name=input('你查詢的演員是?')
for i in movie:
    actors=[i]
    if name in actors:
        print(name+'出演了'+i)

# 問題分析:
# 看第10行:想要用for循環遍歷這個字典。第11行:試圖取出字典中的值。
# (對字典用法熟悉的人可以看出,這不符合語法規範)

#使用print和#號排查錯誤:
movie = {
    '妖貓傳':['黃軒','染谷將太'],
    '無問西東':['章子怡','王力宏','祖峯'],
    '超時空同居':['雷佳音','佟麗婭']
}

name=input('你查詢的演員是?')
for i in movie:
    actors=[i]
    print(actors) #使用print() 函數查看操作是否正確。
    #if name in actors:
        #print(name+'出演了'+i)

#Debug之後
movie = {
'妖貓傳':['黃軒','染谷將太'],
'無問西東':['章子怡','王力宏','祖峯'],
'超時空同居':['雷佳音','佟麗婭'],
}

name = input('你想查詢哪個演員?')
for i in movie:
    actors = movie[i]
    #取出字典的值
    if name in actors:
        print(name+'出演了電影'+i)

4.被動掉坑bug

        被動掉坑,是指有時候你的代碼邏輯上並沒有錯,但可能因爲用戶的錯誤操作或者是一些“例外情況”而導致程序崩潰。

        爲了不讓一些無關痛癢的小錯影響程序的後續執行,Python給我們提供了一種異常處理的機制,可以在異常出現時即時捕獲,然後內部消化掉,讓程序繼續運行。就是try...except...語句。具體用法:

例4:

print('\n歡迎使用除法計算器!\n')

while True:
    try:
        x = input('請你輸入被除數:')
        y = input('請你輸入除數:')
        z = float(x)/float(y)
        print(x,'/',y,'=',z)
        break  # 默認每次只計算一次,所以在這裏寫了 break。
    except ZeroDivisionError:  # 當除數爲0時,跳出提示,重新輸入。
        print('0是不能做除數的!')
    except ValueError:  # 當除數或被除數中有一個無法轉換成浮點數時,跳出提示,重新輸入。
        print('除數和被除數都應該是整值或浮點數!')
    
    # 方式2:將兩個(或多個)異常放在一起,只要觸發其中一個,就執行所包含的代碼。
    # except(ZeroDivisionError,ValueError):
    #     print('你的輸入有誤,請重新輸入!')
    
    # 方式3:常規錯誤的基類,假設不想提供很精細的提示,可以用這個語句響應常規錯誤。
    # except Exception:
    #     print('你的輸入有誤,請重新輸入!')
    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章