SICP Python 描述 1.4 實(shí)踐指南:函數(shù)的藝術(shù)

1.4 實(shí)踐指南:函數(shù)的藝術(shù)

來(lái)源:1.4 Practical Guidance: The Art of the Function

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

函數(shù)是所有程序的要素,無(wú)論規(guī)模大小,并且在編程語(yǔ)言中作為我們表達(dá)計(jì)算過(guò)程的主要媒介。目前為止,我們討論了函數(shù)的形式特性,以及它們?nèi)绾问褂?。我們現(xiàn)在跳轉(zhuǎn)到如何編寫(xiě)良好的函數(shù)這一話題。

  • 每個(gè)函數(shù)都應(yīng)該只做一個(gè)任務(wù)。這個(gè)任務(wù)可以使用短小的名稱來(lái)定義,使用一行文本來(lái)標(biāo)識(shí)。順序執(zhí)行多個(gè)任務(wù)的函數(shù)應(yīng)該拆分在多個(gè)函數(shù)中。
  • 不要重復(fù)勞動(dòng)(DRY)是軟件工程的中心法則。所謂的DRY原則規(guī)定多個(gè)代碼段不應(yīng)該描述重復(fù)的邏輯。反之,邏輯應(yīng)該只實(shí)現(xiàn)一次,指定一個(gè)名稱,并且多次使用。如果你發(fā)現(xiàn)自己在復(fù)制粘貼一段代碼,你可能發(fā)現(xiàn)了一個(gè)使用函數(shù)抽象的機(jī)會(huì)。
  • 函數(shù)應(yīng)該定義得通常一些,準(zhǔn)確來(lái)說(shuō),平方并不是在 Python 庫(kù)中,因?yàn)樗?code>pow函數(shù)的一個(gè)特例,這個(gè)函數(shù)計(jì)算任何數(shù)的任何次方。

這些準(zhǔn)則提升代碼的可讀性,減少錯(cuò)誤數(shù)量,并且通常使編寫(xiě)的代碼總數(shù)最小。將復(fù)雜的任務(wù)拆分為簡(jiǎn)潔的函數(shù)是一個(gè)技巧,它需要一些經(jīng)驗(yàn)來(lái)掌握。幸運(yùn)的是,Python 提供了一些特性來(lái)支持你的努力。

1.4.1 文檔字符串

函數(shù)定義通常包含描述這個(gè)函數(shù)的文檔,叫做文檔字符串,它必須在函數(shù)體中縮進(jìn)。文檔字符串通常使用三個(gè)引號(hào)。第一行描述函數(shù)的任務(wù)。隨后的一些行描述參數(shù),并且澄清函數(shù)的行為:

>>> 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

當(dāng)你以函數(shù)名稱作為參數(shù)來(lái)調(diào)用help時(shí),你會(huì)看到它的文檔字符串(按下q來(lái)退出 Python 幫助)。

>>> help(pressure)

編寫(xiě) Python 程序時(shí),除了最簡(jiǎn)單的函數(shù)之外,都要包含文檔字符串。要記住,代碼只編寫(xiě)一次,但是會(huì)閱讀多次。Python 文檔包含了文檔字符串準(zhǔn)則,它在不同的 Python 項(xiàng)目中保持一致。

1.4.2 參數(shù)默認(rèn)值

定義普通函數(shù)的結(jié)果之一就是額外參數(shù)的引入。具有許多參數(shù)的函數(shù)調(diào)用起來(lái)非常麻煩,也難以閱讀。

在 Python 中,我們可以為函數(shù)的參數(shù)提供默認(rèn)值。調(diào)用這個(gè)函數(shù)時(shí),帶有默認(rèn)值的參數(shù)是可選的。如果它們沒(méi)有提供,默認(rèn)值就會(huì)綁定到形式參數(shù)的名稱上。例如,如果某個(gè)應(yīng)用通常用來(lái)計(jì)算一摩爾粒子的壓強(qiáng),這個(gè)值就可以設(shè)為默認(rèn):

>>> 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的定義接受三個(gè)參數(shù),但是在調(diào)用表達(dá)式中只提供了兩個(gè)。這種情況下,n的值通過(guò)def語(yǔ)句的默認(rèn)值獲得(它看起來(lái)像對(duì)n的賦值,雖然就像這個(gè)討論暗示的那樣,更大程度上它是條件賦值)。

作為準(zhǔn)則,用于函數(shù)體的大多數(shù)數(shù)據(jù)值應(yīng)該表示為具名參數(shù)的默認(rèn)值,這樣便于查看,以及被函數(shù)調(diào)用者修改。一些值永遠(yuǎn)不會(huì)改變,就像基本常數(shù)k_b,應(yīng)該定義在全局幀中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,644評(píng)論 19 139
  • //Clojure入門(mén)教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 4,054評(píng)論 0 7
  • http://python.jobbole.com/85231/ 關(guān)于專(zhuān)業(yè)技能寫(xiě)完項(xiàng)目接著寫(xiě)寫(xiě)一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,806評(píng)論 1 118
  • 第5章 引用類(lèi)型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類(lèi)型 使用基本類(lèi)型...
    大學(xué)一百閱讀 3,683評(píng)論 0 4
  • 內(nèi)置函數(shù)Python解釋器內(nèi)置了許多功能和類(lèi)型,總是可用的。他們是按字母順序列在這里。 abs(x)返回一個(gè)數(shù)的絕...
    uangianlap閱讀 1,372評(píng)論 0 0

友情鏈接更多精彩內(nèi)容