1. 程式人生 > >《編寫高質量程式碼 改善python程式的91個建議》讀書筆記

《編寫高質量程式碼 改善python程式的91個建議》讀書筆記

前言: python 一切皆物件,此為前提。

一、關於函式:不要在函式中定義可變物件為預設值,使用異常替換返回錯誤,保證通過單元測試。python函式傳遞的是物件的引用。在類的初始化方法裡,引數的預設值應該為None,因為預設引數在函式被呼叫時候僅僅被評估一次。

二、編碼。 最開始使用ASCII使用一個位元組(8bit)只能表示128個字元;unicode 實現了從數字程式碼到不同語言字符集之間的對映,從而跨平臺、跨語言的要求。但是在實際傳輸過程中,為了節省記憶體,實現Unicode 的過程叫 Unicode格式轉換(transformaition format),簡稱UTF。其中最常見的UTF-8對不同範圍的字元使用不同長度的編碼:0x00- 0x7F的字元的UTF-8編碼與ASCII編碼完全相同。UTF-8的最大長度為4個位元組(32bit)。

decode("utf-8")  #將其他編碼對應的字串解碼成Unicode
encode("utf-8")  #將Unicode編碼轉換為另一種編碼。

三、import VS from ... import x : from +import 會帶來名稱空間衝突。

四、++i 在python裡等價於+(+i) 。+表示正號。

五、使用with open() as f  來進行檔案讀寫。檔案實現了上下文協議,任何實現了上下文協議的物件都可以成為上下文管理器。有_enter_() 和_exti()_兩個方法

__enter__():在使用with語句時呼叫,會話管理器在程式碼塊開始前呼叫,返回值與as後的引數繫結

__exit__():會話管理器在程式碼塊執行完成好後呼叫,在with語句完成時,物件銷燬之前呼叫

六、異常處理:1. 儘量只在可能丟擲異常的語句前加入try。謹慎使用單獨的except 處理所有異常,因為會掩蓋異常到底在哪裡,只知道發生了異常。注意異常捕獲的順序,在合適的層次處理異常。2. 如果finally 後面的語句裡有return 和break, 同時try捕獲的錯誤在except中找不到對應的異常處理,那麼在執行完finally後,異常便不能被丟擲,導致異常丟失。同時finally裡面的return語句是最先被執行的,會覆蓋前面的return語句。因為不能再finally寫return。

七、字串連線:優先使用join 申請一次記憶體 時間複雜度O(n) 。 而 + 連線多個字串的時候,每個+申請一次記憶體,複雜度O(n^2)

八、靜態方法和類方法:子類實現某些功能的時候使用類方法可以避免程式碼重寫帶來的冗餘。

九、字串切分: split() 無視所有空格。 split(' ')會保留空字串。capwords(s):去除兩端空格,並把連續空白字元用一個空格代替。

十、排序。 sorted()    

textbook = {'張三':'7705','李四':'9345'}
from operator import itemgetter  # 獲取第幾個域的值
sorted_pb = sorted(textbook.items(),key=itemgetter(1))
print(sorted_pb)

十一、深拷貝和淺拷貝。深拷貝:包含物件裡面的自物件的拷貝,所以原始物件的改變不會造成深拷貝里任何子元素的改變。

十二、計數

#Counter類是字典類的子類,是一個容器物件,用來統計雜湊物件。
from collections import Counter
some_data = ['a','2',2,4,5,'2','b',4,7,'a',5,'d','a','z']
print(Counter(some_data))

十三、traceback 獲取異常發生時候棧的資訊

十四、maxin。 與其他靜態語言不同, Python語言中的基類在執行中可以動態改變。 所以當我們向其中增加新的基類時, 這個類就擁有了新的方法, 也就是所謂的混入(mixin) 。 這種動態性的好處在於程式碼獲得了更豐富的擴充套件功能。 想象一下, 你之前寫好的程式碼並不需要個性, 只要後期為它增加基類, 就能夠增強功能(或替換原有行為) , 這多麼方便! 值得進一步探索的是, 利用反射技術, 甚至不需要修改程式碼。

十五、state模組

通過引入@ensure_signin,可以代替if判斷語句
def ensure_signin(func):
    def _func(self, *a, **kw):
        if not self._signin:
            raise NeedSignin()
        return func(self, *a, **kw)
    return _func
@ensure_signin
def do_sth(self, *a, **kw):

十六、 __init()__ 不是構造方法!! __new__()才是構造方法!!

·__new__()方法一般需要返回類的物件, 當返回類的物件時將會自動呼叫__init__()方法進行初始化, 如果沒有物件返回, 則__init__()方法不會被呼叫。 __init__()方法不需要顯式返回, 預設為None,否則會在執行時丟擲TypeError。

十七、名稱空間 Python中所有的變數名都是在賦值的時候生成的, 而對任何變數名的建立、 查詢或者改變都會在名稱空間(namespace) 中進行。

十八、 描述符     2. __getattribute__()總會被呼叫, 而__getattr__()只有在__getattribute__()中引發異常的情況下才會被調
用  3. 資料描述符: 如果一個物件同時定義了__get__()和__set__()方法, 則稱為資料描述符, 如果僅定義了__get__()方法, 則稱為非資料描述符 4。 很多地方將property稱為函式, 我個人認為這是不恰當的, 它實際上是一種實現了__get__()、 __set__()方法的類, 使用者也可以根據自己的需要定義個性化的property。property 是資料描述符。
十九、利用操作符過載實現中綴語法  pipe