180202—【Python 初識 D9】Python的內建函數 & 工廠函數

按:看書的時候一直被這兩個東西搞的頭大,雖然學一門語言一直死摳概念不算什麼好習慣,但如果全世界都在圍着某個概念做文章,強調一個函數看上去像這個但實際是那個,這個內建函數在X.X版本之後變成了工廠函數……云云。你就會很難受了。
難受,作此篇,兼難受:

內建函數

內建函數,就是由語法規定存在的函數。
是 各家編譯器,如果支持該語法規則,則必須爲使用者提供的函數。
這些函數,包含在編譯器的運行時庫當中,程序員不必單獨書寫代碼實現它,只需要調用既可,他們的實現,由編譯器廠商完成。
比如print()函數,隨意拉出來就可以用

跟庫函數是什麼關係?

庫函數(Library function)是把函數放到庫裏,供別人使用的一種方式。方法是把一些常用到的函數編完放到一個文件裏,供不同的人進行調用。調用時要先import進來先。
(猶憶C中 #include < > …)

【區別】:
標準庫函數都需要import xxx才能取得。
內建函數都在 _ builtins_ 裏面,在global裏直接就能用。
在試圖區分此篇試圖區分的幾個概念時,搜索發現大量與此有關的文章都在談論常用的內建函數,概念說明並不是很多。。這裏也放幾個去處,有需自取:
Python 標準庫系列之內建函數
Python 內建函數

工廠函數

工廠函數看上去有點像函數,實質上他們是類,當你調用它們時,實際上是生成了該類型的一個實例,就像工廠生產貨物一樣.
Python核心編程 第二版(p71)

啥意思呢? 其實把書翻了好久,也查了不少地方,都不如下面這段代碼來的直接:

定義一個外部函數,這個函數簡單地生成並且返回了一個被嵌套的函數,卻並不調用這個內嵌函數。如果調用外部函數就得到一個生成的內嵌函數的一個引用。
如果再調用外部得到的那個函數,它將調用內嵌函數,也就是說,maker函數內部的名爲action的函數。

>>> def maker(N):
    def action(X):
        return X**N
    return action

>>> f = maker(2)  
>>> f(3) #結果是9  
9
>>> g = maker(3)  
>>> g(3) #結果是27
27  

工廠函數:一個能夠記住嵌套作用域的變量值的函數,儘管那個作用域已經不存在了。。

函數maker裏面嵌套了一個函數action,首先用戶傳給maker函數一個參數,這個參數傳給了action函數,使得action函數可以形成具體的函數
比如說第一次參數N爲2,此時,action(x)函數得以具體化了,也就是:

def action(X): return X**2

然後將action(x)返回給頂層,並賦值給f,也就是現在f是action(x),
然後用戶再傳遞參數到f中,也就是傳給了action(x)。
神奇之處在於,內嵌的函數存住了2,即maker函數內部的變量N的值,儘管在調用執行f時maker已經返回了值並且退出。實際上,在本地作用域的N被作爲執行的狀態信息保留了下來。

總結一下,之所以稱之爲工廠函數,是因爲,可以自由更改嵌套函數的參數,譬如書中說的,將N=2,則f可以是平方函數,如果N=3,則f可以是3次方函數,N=4,則f可以是4次方函數。等等……

參考:
Python中的工廠函數
python(第一天): 工廠函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章