Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

1.4 實踐指南:函數的藝術

來源:1.4 Practical Guidance: The Art of the Function

譯者:飛龍

協議:CC BY-NC-SA 4.0

函數是所有程序的要素,無論規模大小,並且在編程語言中作為我們表達計算過程的主要媒介。目前為止,我們討論了函數的形式特性,以及它們如何使用。我們現在跳轉到如何編寫良好的函數這一話題。

  • 每個函數都應該只做一個任務。這個任務可以使用短小的名稱來定義,使用一行文本來標識。順序執行多個任務的函數應該拆分在多個函數中。
  • 不要重複勞動(DRY)是軟件工程的中心法則。所謂的DRY原則規定多個代碼段不應該描述重複的邏輯。反之,邏輯應該只實現一次,指定一個名稱,並且多次使用。如果你發現自己在複製粘貼一段代碼,你可能發現了一個使用函數抽象的機會。
  • 函數應該定義得通常一些,準確來說,平方並不是在 Python 庫中,因為它是pow函數的一個特例,這個函數計算任何數的任何次方。

這些準則提升代碼的可讀性,減少錯誤數量,並且通常使編寫的代碼總數最小。將複雜的任務拆分為簡潔的函數是一個技巧,它需要一些經驗來掌握。幸運的是,Python 提供了一些特性來支持你的努力。

1.4.1 文檔字符串

函數定義通常包含描述這個函數的文檔,叫做文檔字符串,它必須在函數體中縮進。文檔字符串通常使用三個引號。第一行描述函數的任務。隨後的一些行描述參數,並且澄清函數的行為:

>>> def pressure(v, t, n):
        """Compute the pressure in pascals of an ideal gas.

        Applies the ideal gas law: http://en.wikipedia.org/wiki/Ideal_gas_law

        v -- volume of gas, in cubic meters
        t -- absolute temperature in degrees kelvin
        n -- particles of gas
        """
        k = 1.38e-23  # Boltzmann's constant
        return n * k * t / v

當你以函數名稱作為參數來調用help時,你會看到它的文檔字符串(按下q來退出 Python 幫助)。

>>> help(pressure)

編寫 Python 程序時,除了最簡單的函數之外,都要包含文檔字符串。要記住,代碼只編寫一次,但是會閱讀多次。Python 文檔包含了文檔字符串準則,它在不同的 Python 項目中保持一致。

1.4.2 參數默認值

定義普通函數的結果之一就是額外參數的引入。具有許多參數的函數調用起來非常麻煩,也難以閱讀。

在 Python 中,我們可以為函數的參數提供默認值。調用這個函數時,帶有默認值的參數是可選的。如果它們沒有提供,默認值就會綁定到形式參數的名稱上。例如,如果某個應用通常用來計算一摩爾粒子的壓強,這個值就可以設為默認:

>>> k_b=1.38e-23  # Boltzmann's constant
>>> def pressure(v, t, n=6.022e23):
        """Compute the pressure in pascals of an ideal gas.

        v -- volume of gas, in cubic meters
        t -- absolute temperature in degrees kelvin
        n -- particles of gas (default: one mole)
        """
        return n * k_b * t / v
>>> pressure(1, 273.15)
2269.974834

這裡,pressure的定義接受三個參數,但是在調用表達式中只提供了兩個。這種情況下,n的值通過def語句的默認值獲得(它看起來像對n的賦值,雖然就像這個討論暗示的那樣,更大程度上它是條件賦值)。

作為準則,用於函數體的大多數數據值應該表示為具名參數的默認值,這樣便於查看,以及被函數調用者修改。一些值永遠不會改變,就像基本常數k_b,應該定義在全局幀中。