Python中的函數具有多種特性,這能夠簡化編程工做。Python函數的某些性質與其餘編程語言中的函數類似,但也有性質是Python獨有的。本節將介紹如何用函數來表達億圖、提高可複用程度,並減小Bug編程
第十四條:儘可能用異常來表示特殊狀況,而不要返回None閉包
第十五條:瞭解如何在閉包裏使用外圍做用域中的變量編程語言
第十六條:考慮用生成起來改爲直接返回列表的函數函數
第十七條:在參數上面迭代時,要多加當心內存
第十八條:用數量可變的位置參數減小視覺雜訊作用域
第十九條:用關鍵字參數來表達可選的行爲文檔
第二十一條: 用只能以關鍵字形式的指定的參數來確保代碼的明晰字符串
要點1:用None這個返回值來表示特殊意義的函數,很容易是使用者犯錯,由於None和0及空字符串之類的值,在條件表達式裏都會評估爲False。it
要點2:函數在遇到特殊狀況時,應該拋出異常,而不要返回None。調用者看到該函數的文檔中所描述的異常以後,應該就會編寫響應的代碼來處理他們了。for循環
要點1:對於定義在某做用域內的閉包來講,它能夠應用這些做用域中的變量。
要點2:使用默認方式對閉包內的變量賦值,不會影響外圍做用域中的同名變量。
要點3:在Python3中,程序能夠在閉包內用nonlocal語句來修飾某個名稱,使該閉包可以修改外圍做用域中的同名變量。
要點4:在Python2中,程序可使用可變值(例如,包含單個元素的列表)來實現與nonlocal語句相仿的機制。
要點5:除了那種會叫簡單的函數,儘可能不要用nonlocal語句。
要點1:使用生成器比把收集到的結果放入列表裏返回給調用者更加清晰。
要點2:由生成器函數所返回的那個迭代器,能夠把生成器函數體中,傳給yied表達式的那些值,逐次產生出來。
要點3:不管輸入量有多大,生成器都能產生一系列輸出,由於這些輸入量和輸出量,都不會影響它在執行時所耗的內存。
要點1:函數在輸的參數上面屢次迭代時要小心:若是參數是迭代器,那麼可能會致使奇怪的行爲並錯失某些值。
要點2:Python的迭代器協議,描述了容器和迭代器應該如何與iter和next內置函數,for循環及相關表達式相互配合。
要點3:把__iter__方法實現爲生成器,便可定義本身的容器類型。
要點4:想判斷某個值是迭代器仍是容器,能夠拿該值爲參數,兩次調用iter函數,若結果相同,則是迭代器,調用內置的next函數,便可靈蓋迭代器前進一步。
要點1:在def語句中使用*args,便可令函數接收數量可變的位置參數。
要點2:調用函數時,能夠採用*操做符,把序列中的元素方程位置參數,傳給該函數。
要點3:對生成器使用*操做符,可能致使程序耗盡內存並崩潰。
要點4:在已經接受*args參數的函數上面繼續添加位置參數,可能會產生難以排查的bug。
要點1:函數參數能夠按位置或關鍵字來指定。
要點2:只使用位置參數來調用函數,可能會致使這些參數值的含義不夠準確,而關鍵字參數則可以闡明每一個參數的意圖。
要點3:給函數添加新的新的行爲時,可使用帶默認值的關鍵字參數,以便與原有的函數調用代碼保持兼容。
要點4:可選的關鍵字參數,老是應該以關鍵字形式來指定,而不該該以位置參數的形式來指定。
要點1:參數的默認值,只會在程序加載模塊並讀到本函數的定義時評估一次。對於{}或[]等動態的值,這可能會致使奇怪的行爲。
要點1:關鍵字參數可以勢函數調用的意圖更加明確。
要點2:對於各參數之間很容易混淆的函數,能夠聲明只能以關鍵字形式指定的參數,以確保調用者必須經過關鍵字來指定它們。對於接受多個Boolean標誌的函數,更應該這樣作。
要點3:在編寫函數時,Python3有明確的語法來定義這種只能以關鍵字的形式指定的參數。
要點4:Python2的函數能夠接受**kwargs參數,並手工拋出TypeError異常,以便模擬只能以關鍵字形式來指定的參數。