返回函數(shù)
1)普通的函數(shù)返回一個(gè)值,返回函數(shù)則是把函數(shù)作為結(jié)果值返回
為什么要返回函數(shù):不需要立刻求和凛剥,而是在后面的代碼中熔恢,根據(jù)需要再計(jì)算,這樣就先返回求和的函數(shù)续徽。(這樣迂回的手段蚓曼,聽起來就好像為了優(yōu)化代碼。钦扭。纫版。)
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
2)當(dāng)我們調(diào)用lazy_sum(1, 3, 5, 7, 9)時(shí),返回的并不是求和結(jié)果客情,而是求和函數(shù):
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
因?yàn)閘azy_sum()函數(shù)return sum
意思就是其弊,無論lazy_sum(1, 3, 5, 7, 9)
括號(hào)里寫成什么癞己,它都不會(huì)先計(jì)算,而是先返回一個(gè)sum函數(shù)梭伐,這個(gè)時(shí)候參數(shù)以及被包含在里面了痹雅。f = lazy_sum(1, 3, 5, 7, 9)
意思是,將函數(shù)返回的sum這個(gè)函數(shù)對(duì)象賦值給了f,而不是調(diào)用了sum函數(shù)糊识,所以>>> f
會(huì)返回一個(gè)類似內(nèi)存地址一樣的東西绩社。
3)關(guān)于 f 和 f():函數(shù)對(duì)象VS函數(shù)調(diào)用,鑒于一開始也混淆了赂苗,所以還是要強(qiáng)行解釋一波
把函數(shù)賦值給新的標(biāo)識(shí)符或作為參數(shù)傳遞給新的函數(shù)愉耙,針對(duì)的都是函數(shù)對(duì)象本身,而不是函數(shù)的調(diào)用拌滋。
def func():
return "hello,world"
ref1 = func #將函數(shù)對(duì)象賦值給ref1 賦值的結(jié)果是函數(shù) 朴沿,可調(diào)用
ref2 = func() #調(diào)用函數(shù),將函數(shù)的返回值("hello,world"字符串)賦值給ref2 賦值的結(jié)果是str败砂,不可調(diào)用
所以赌渣,回答上面關(guān)于f = lazy_sum(1, 3, 5, 7, 9)
的情況上面,可以寫成print(lazy_sum(1,3,5,7,9)())
這個(gè)樣子昌犹。
4)注意:當(dāng)我們調(diào)用lazy_sum()
時(shí)坚芜,每次調(diào)用都會(huì)返回一個(gè)新的函數(shù),即使傳入相同的參數(shù):
>>> f1 = lazy_sum(1,3,5,7,9)
>>> f2 = lazy_sum(1,3,5,7,9)
>>> print(f1==f2)
False
在函數(shù)lazy_sum中又定義了函數(shù)sum祭隔,并且货岭,內(nèi)部函數(shù)sum可以引用外部函數(shù)lazy_sum的參數(shù)和局部變量路操,當(dāng)lazy_sum返回函數(shù)sum時(shí)疾渴,相關(guān)參數(shù)和變量都保存在返回的函數(shù)中,這種稱為“閉包(Closure)”屯仗。