python在工厂中的应用_什么是工厂函数?Python 中工厂函数怎么理解?
其實(shí)談工廠函數(shù)前必須首先把嵌套作用域和閉包講清楚
python有一個(gè)很有意思的地方,就是def函數(shù)可以嵌套在另一個(gè)def函數(shù)之中。調(diào)用外層函數(shù)時(shí),運(yùn)行到的內(nèi)層def語句僅僅是完成對(duì)內(nèi)層函數(shù)的定義,而不會(huì)去調(diào)用內(nèi)層函數(shù),除非在嵌套函數(shù)之后又顯式的對(duì)其進(jìn)行調(diào)用。
x = 99
def f1():
x = 88
def f2():
print(x)
f2()
f1()
88
可以看出,f1中的嵌套變量x覆蓋了全局變量x=99,然后f2中的本地變量按照引用規(guī)則,就引用了x=88。
下面我們來說說嵌套作用域的一個(gè)特殊之處:
本地作用域在函數(shù)結(jié)束后就立即失效,而嵌套作用域在嵌套的函數(shù)返回后卻仍然有效。
def f1():
x = 88
def f2():
print(x)
return f2
action = f1()
action()
88
這個(gè)例子非常重要,也很有意思,函數(shù)f1中定義了函數(shù)f2,f2引用了f1嵌套作用域內(nèi)的變量x,并且f1將函數(shù)f2作為返回對(duì)象進(jìn)行返回。最值得注意的是我們通過變量action獲取了返回的f2,雖然此時(shí)f1函數(shù)已經(jīng)退出結(jié)束了,但是f2仍然記住了f1嵌套作用域內(nèi)的變量名x。
上面這種語言現(xiàn)象稱之為閉包:一個(gè)能記住嵌套作用域變量值的函數(shù),盡管作用域已經(jīng)不存在。
這里有一個(gè)應(yīng)用就是工廠函數(shù),工廠函數(shù)定義了一個(gè)外部的函數(shù),這個(gè)函數(shù)簡(jiǎn)單的生成并返回一個(gè)內(nèi)嵌的函數(shù),僅僅是返回卻不調(diào)用,因此通過調(diào)用這個(gè)工廠函數(shù),可以得到內(nèi)嵌函數(shù)的一個(gè)引用,內(nèi)嵌函數(shù)就是通過調(diào)用工廠函數(shù)時(shí),運(yùn)行內(nèi)部的def語句而創(chuàng)建的。
def maker(n):
k = 8
def action(x):
return x ** n + k
return action
f = maker(2)
print(f)
.action at 0x00000000021C51E0>
再看一個(gè)例子:
def maker(n):
k = 8
def action(x):
return x ** n + k
return action
f = maker(2)
print(f(4))
24
這里我們可以看出,內(nèi)嵌的函數(shù)action記住了嵌套作用域內(nèi)得兩個(gè)嵌套變量,一個(gè)是變量k,一個(gè)是參數(shù)n,即使后面maker返回并退出。我們通過調(diào)用外部的函數(shù)maker,得到內(nèi)嵌的函數(shù)action的引用。這種函數(shù)嵌套的方法在后面要介紹的裝飾器中會(huì)經(jīng)常用到。這種嵌套作用域引用,就是python的函數(shù)能夠保留狀態(tài)信息的主要方法了。
這里接著說說另一個(gè)關(guān)鍵字nonlocal
本地函數(shù)通過global聲明對(duì)全局變量進(jìn)行引用修改,那么對(duì)應(yīng)的,內(nèi)嵌函數(shù)內(nèi)部想對(duì)嵌套作用域中的變量進(jìn)行修改,就要使用nonlocal進(jìn)行聲明。
def test(num):
in_num = num
def nested(label):
nonlocal in_num
in_num += 1
print(label, in_num)
return nested
F = test(0)
F('a')
F('b')
F('c')
a 1
b 2
c 3
這里我們可以看到幾個(gè)點(diǎn),我們?cè)趎ested函數(shù)中通過nonlocal關(guān)鍵字引用了內(nèi)嵌作用域中的變量in_num,那么我們就可以在nested函數(shù)中修改他,即使test函數(shù)已經(jīng)退出調(diào)用,這個(gè)“記憶”依然有效。
再最后一個(gè)例子:
def test(num):
in_num = num
def nested(label):
nonlocal in_num
in_num += 1
print(label, in_num)
return nested
F = test(0)
F('a')
F('b')
F('c')
G = test(100)
G('mm')
a 1
b 2
c 3
mm 101
多次調(diào)用工廠函數(shù)返回的不同內(nèi)嵌函數(shù)副本F和G,彼此間的內(nèi)嵌變量in_num是彼此獨(dú)立隔離的。
更系統(tǒng)、更深入的探討歡迎進(jìn)入我們的專欄《Python數(shù)據(jù)科學(xué)之路》:醬油哥:來吧,一起踏上Python數(shù)據(jù)科學(xué)之路?zhuanlan.zhihu.com
本專欄仿照美劇的劇集編排方式和整體邏輯架構(gòu)進(jìn)行組織,目前策劃共分為七季:
第一季:Python編程語言核心基礎(chǔ)。
第二季:Python數(shù)據(jù)分析基本工具。
第三季:機(jī)器學(xué)習(xí)線性代數(shù)核心-Python描述。
第四季:利用python進(jìn)行時(shí)間序列分析。
第五季:機(jī)器學(xué)習(xí)概率統(tǒng)計(jì)核心-Python描述。
第六季:機(jī)器學(xué)習(xí)典型算法專題。
第七季:實(shí)戰(zhàn)熱點(diǎn)深度應(yīng)用。
讓我們一步一個(gè)臺(tái)階,共同踏上Python數(shù)據(jù)科學(xué)之旅。
總結(jié)
以上是生活随笔為你收集整理的python在工厂中的应用_什么是工厂函数?Python 中工厂函数怎么理解?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL -set
- 下一篇: python37下载_pythoncom