Python優雅編程(四)

Python優雅編程(四)

關於日常使用到的一些Python技巧,計劃用五個章節完成分享,當前為第四個章節。

本章節主要介紹一下,在Python開發中遇到的一些隱藏的坑。從入門到放棄的血淚史,手動滑稽。

在函數參數中的默認值參數

將Python函數的某個參數設置為默認值,使得調用此函數時該參數可以成為一個可選參數。但這當這個默認值是可變對象(列表,字典)時,稍不注意容易踩坑。

例如,看如下兩個函數。toutiao_dict()、toutiao_list()的函數定義:

Python優雅編程(四)

每次在調用函數時,可能會認為當不對可選參數進行賦值時,它會被附默認的值。例如,在上面的toutiao_list()函數中,可能會認為重複調用此函數(不對可選參數賦值),這個函數會總是返回的username為['iTestOps'],那麼我們嘗試一下,兩次重複調用該函數的時候使用默認參數,參數username會被置為[]、{}(即,一個空的可變對象),如下。

Python優雅編程(四)

看下這麼做的時候會輸出什麼,如下:

Python優雅編程(四)

為何重複調用toutiao_list()的時候,toutiao_list()函數總是在一個已經存在的列表後面添加我們的默認值'iTestOps',而不是每次都基於空的列表,返回['iTestOps']?

原因是Python函數中參數的默認值,僅在該函數定義的時候,被賦值一次。因此,只有當函數toutiao_list()第一次被定義的時候,才將參數username的默認值初始化到它的默認值(即一個空的列表)。當調用toutiao_list()的時候(不對可選參數賦值),會繼續使用username最早初始化時的那個默認值列表。

可以參考以下解決方案

Python優雅編程(四)

此時的輸出如下:

Python優雅編程(四)


在異常處理時捕獲多個異常

使用try / except進行異常處理時,希望同時捕獲兩個異常,如下:

Python優雅編程(四)

輸出如下,發現IndexError異常並沒有被except語句捕捉到。

Python優雅編程(四)

這裡的坑在於except語句不會像“except ValueError,IndexError:”這樣去接受多個異常。

並且,except異常可以帶上參數,可作為輸出的異常信息參數,在Python 2.x裡面,其語法"except Exception, e",通過參數e輸出對應的Exception異常信息。

因此,在上面的代碼中,IndexError異常不會被except語句捕捉到;而當捕獲ValueError異常時,其異常信息綁定在了IndexError的參數上。

在except語句中捕捉多個異常的正確做法是將所有需要捕捉的異常添加到一個元組(tuple)中,並作為第一個參數給except語句,示例如下。

Python優雅編程(四)


在遍歷列表的同時修改列表

在不經意間,容易犯一些邏輯上的錯誤,比如遍歷列表的同時又刪除裡面的元素,導致程序拋出異常,如下:

Python優雅編程(四)

輸出如下:

Python優雅編程(四)

可以使用列表推導式避免這樣的問題。

Python優雅編程(四)

輸出如下:

Python優雅編程(四)


若對你有所幫助,歡迎大家評論、留言、關注,感謝支持!


分享到:


相關文章: