Pytho学习笔记:错误,测试,调试(合)
前言
最近在學習深度學習,已經跑出了幾個模型,但Pyhton的基礎不夠扎實,因此,開始補習Python了,大家都推薦廖雪峰的課程,因此,開始了學習,但光學有沒有用,還要和大家討論一下,因此,寫下這些帖子,廖雪峰的課程連接在這里:廖雪峰
Python的相關介紹,以及它的歷史故事和運行機制,可以參見這篇:python介紹
Python的安裝可以參見這篇:Python安裝
Python的運行模式以及輸入輸出可以參見這篇:Python IO
Python的基礎概念介紹,可以參見這篇:Python 基礎
Python字符串和編碼的介紹,可以參見這篇:Python字符串與編碼
Python基本數據結構:list和tuple介紹,可以參見這篇:Python list和tuple
Python控制語句介紹:ifelse,可以參見這篇:Python 條件判斷
Python控制語句介紹:循環實現,可以參見這篇:Python循環語句
Python數據結構:dict和set介紹Python數據結構dict和set
Python函數相關:Python函數
Python高階特性:Python高級特性
Python高階函數:Python高階函數
Python匿名函數:Python匿名函數
Python裝飾器:Python裝飾器
Python偏函數:Python偏函數
Python模塊:Python模塊
Python面向對象編程(1):Python面向對象
Python面向對象編程(2):Python面向對象(2)
Python面向對象編程(3):Python面向對象(3)
Python面向對象編程(4):Pyhton面向對象(4)
Python面向對象高級編程(上):Python面向對象高級編程(上)
Python面向對象高級編程(中上):Python面向對象高級編程(中上)
Python面向對象高級編程(中下):Python面向對象高級編程(中下)
Python面向對象高級編程(完):Python面向對象高級編程(完)
Python錯誤調試(起):Python調試:起
Python錯誤調試(承):Python調試:承
Python錯誤調試(轉):Python調試:轉
目錄:
- 前言
- 文檔測試
- 練習
文檔測試
如果你經常閱讀Python的官方文檔,可以看到很多文檔都有示例代碼。比如re模塊就帶了很多示例代碼:
>>> import re >>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0) 'def'可以把這些示例代碼在Python的交互式環境下輸入并執行,結果與文檔中的示例代碼顯示的一致。
這些代碼與其他說明可以寫在注釋中,然后,由一些工具來自動生成文檔。既然這些代碼本身就可以粘貼出來直接運行,那么,可不可以自動執行寫在注釋中的這些代碼呢?
答案是肯定的。
當我們編寫注釋時,如果寫上這樣的注釋:
def abs(n):'''Function to get absolute value of number.Example:>>> abs(1)1>>> abs(-1)1>>> abs(0)0'''return n if n >= 0 else (-n)無疑更明確地告訴函數的調用者該函數的期望輸入和輸出。
并且,Python內置的“文檔測試”(doctest)模塊可以直接提取注釋中的代碼并執行測試。
doctest嚴格按照Python交互式命令行的輸入和輸出來判斷測試結果是否正確。只有測試異常的時候,可以用…表示中間一大段煩人的輸出。
讓我們用doctest來測試上次編寫的Dict類:
# mydict2.py class Dict(dict):'''Simple dict but also support access as x.y style.>>> d1 = Dict()>>> d1['x'] = 100>>> d1.x100>>> d1.y = 200>>> d1['y']200>>> d2 = Dict(a=1, b=2, c='3')>>> d2.c'3'>>> d2['empty']Traceback (most recent call last):...KeyError: 'empty'>>> d2.emptyTraceback (most recent call last):...AttributeError: 'Dict' object has no attribute 'empty''''def __init__(self, **kw):super(Dict, self).__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(r"'Dict' object has no attribute '%s'" % key)def __setattr__(self, key, value):self[key] = valueif __name__=='__main__':import doctestdoctest.testmod()運行python mydict2.py:$ python mydict2.py什么輸出也沒有。這說明我們編寫的doctest運行都是正確的。如果程序有問題,比如把_getattr_()方法注釋掉,再運行就會報錯:
File "E:/python/example/example_doctest.py", line 8, in __main__.Dict Failed example: d1.x Exception raised: Traceback (most recent call last): File "C:\Users\challenger\AppData\Local\Programs\Python\Python36\lib\doctest.py", line 1330, in __run compileflags, 1), test.globs) File "<doctest __main__.Dict[2]>", line 1, in <module> d1.x AttributeError: 'Dict' object has no attribute 'x' ********************************************************************** File "E:/python/example/example_doctest.py", line 14, in __main__.Dict Failed example: d2.c Exception raised: Traceback (most recent call last): File "C:\Users\challenger\AppData\Local\Programs\Python\Python36\lib\doctest.py", line 1330, in __run compileflags, 1), test.globs) File "<doctest __main__.Dict[6]>", line 1, in <module> d2.c AttributeError: 'Dict' object has no attribute 'c' ********************************************************************** 1 items had failures:2 of 9 in __main__.Dict ***Test Failed*** 2 failures.注意到最后3行代碼。當模塊正常導入時,doctest不會被執行。因為設置了name=main這個測試條件。
只有在命令行直接運行時,才執行doctest。所以,不必擔心doctest會在非測試環境下執行。
練習
對函數fact(n)編寫doctest并執行:
def fact(n):'''Calculate 1*2*...*n>>> fact(1)1>>> fact(10)?>>> fact(-1)?'''if n < 1:raise ValueError()if n == 1:return 1return n * fact(n - 1)if __name__ == '__main__':import doctestdoctest.testmod()答案:
def fact(n):'''Calculate 1*2*...*n>>> fact(1)1>>> fact(10)3628800>>> fact(-1)Traceback (most recent call last):...ValueError'''if n < 1:raise ValueError()if n == 1:return 1return n * fact(n - 1)if __name__ == '__main__':import doctestdoctest.testmod()總結
以上是生活随笔為你收集整理的Pytho学习笔记:错误,测试,调试(合)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 江苏省有JAVA技能大赛,江苏省职业学校
- 下一篇: php是阻塞模式吗,PHP非阻塞模式 -