除錯
第一種方法簡單直接粗暴有效,就是用print()把可能有問題的變數列印出來看看
斷言凡是用print()來輔助檢視的地方,都可以用斷言(assert)來替代
assert的意思是,表示式n != 0應該是true,否則,根據程式執行的邏輯,後面的**肯定會出錯。
如果斷言失敗,assert語句本身就會丟擲assertionerror
程式中如果到處充斥著assert,和print()相比也好不到哪去。不過,啟動python直譯器時可以用-o引數來關閉assert
logging
把print()替換為logging是第3種方式,和assert比,logging不會丟擲錯誤,而且可以輸出到檔案
logging.info()就可以輸出一段文字。執行,發現除了zerodivisionerror,沒有任何資訊。怎麼回事?
別急,在import logging之後新增一行配置再試試:
這就是logging的好處,它允許你指定記錄資訊的級別,有debug,info,warning,error等幾個級別,當我們指定level=info時,logging.debug就不起作用了。同理,指定level=warning後,debug和info就不起作用了。這樣一來,你可以放心地輸出不同級別的資訊,也不用刪除,最後統一控制輸出哪個級別的資訊。
pdb第4種方式是啟動python的偵錯程式pdb,讓程式以單步方式執行,可以隨時檢視執行狀態。
$ python -m pdb err.py
(pdb) l
1 # err.py
2 -> s = '0'
3 n = int(s)
4 print(10 / n)
輸入命令n可以單步執行**:
(pdb) n
> /users/michael/github/learn-python3/samples/debug/err.py(3)()
-> n = int(s)
(pdb) n
> /users/michael/github/learn-python3/samples/debug/err.py(4)()
-> print(10 / n)
任何時候都可以輸入命令p 變數名來檢視變數:
(pdb) p s
'0'(pdb) p n
0輸入命令q結束除錯,退出程式:
(pdb) q
這種通過pdb在命令列除錯的方法理論上是萬能的,但實在是太麻煩了,如果有一千行**,要執行到第999行得敲多少命令啊。
pdb.set_trace()
這個方法也是用pdb,但是不需要單步執行,我們只需要import pdb,然後,在可能出錯的地方放乙個pdb.set_trace(),就可以設定乙個斷點:
# err.py
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 執行到這裡會自動暫停
print(10 / n)
執行**,程式會自動在pdb.set_trace()暫停並進入pdb除錯環境,可以用命令p檢視變數,或者用命令c繼續執行:
$ python err.py
> /users/michael/github/learn-python3/samples/debug/err.py(7)()
-> print(10 / n)
(pdb) p n
0(pdb) c
traceback (most recent call last):
file "err.py", line 7, in
print(10 / n)
zerodivisionerror: division by zero
這個方式比直接啟動pdb單步除錯效率要高很多,但也高不到哪去。
ide如果要比較爽地設定斷點、單步執行,就需要乙個支援除錯功能的ide。目前比較好的python ide有:
visual studio code:需要安裝python外掛程式。
pycharm:
另外,eclipse加上pydev外掛程式也可以除錯python程式
java筆記第九節
第九節 一 設計模式 相當於戰術 入格 看 可用性,美觀性 的由23種。二 架構模式 相當於戰略 目前只有兩種 1.b s 瀏覽器 伺服器,邏輯 堆放到伺服器上 方便公升級,修改,伺服器任務重 b s網頁上的內容是臨時從伺服器上下下來的 2.c s 客戶 伺服器,邏輯 堆放到客戶端上 不適合管理軟體...
第九節 開閉原則
1 開閉原則,對擴充套件是開放的,對修改是關閉的。2 復用,模組復用和系統復用,其中模組部分復用或將整個專案程式設計可復用的。3 內部模組化時,之中有不同的邏輯。將 分為業務邏輯層和資料儲存層,將 模組化成兩個層級。像 對選單的處理,選單功能實現為業務邏輯 像 選單資料儲存用鍊錶,也可以以後改為雜湊...
第九節 陣列
陣列是為了放多個資料的資料型別,陣列是引用資料型別,除了八種基本資料型別外其他資料都是引用資料型別。語法 有兩種方式 方式一 資料型別 變數名 推薦 例如 int array 方式二 資料型別 變數名 例如 int array 語法 有兩種方式 方式一 變數名 new 資料型別 陣列大小 方式二 變...