Python函数式编程简介(二)返回函数
本文為Python函數(shù)式編程的第二部分主要講解返回函數(shù)和閉包
2、返回函數(shù)
2.1、函數(shù)作為返回值
高階函數(shù)除了可以接受函數(shù)作為參數(shù)外,還可以把函數(shù)作為結(jié)果值返回。
我們來(lái)實(shí)現(xiàn)一個(gè)可變參數(shù)的求和。通常情況下,求和的函數(shù)是這樣定義的:
但是,如果不需要立刻求和,而是在后面的代碼中,根據(jù)需要再計(jì)算怎么辦?可以不返回求和的結(jié)果,而是返回求和的函數(shù):
def lazy_sum(*args):def sum():ax = 0for n in args:ax = ax + nreturn axreturn sum# 當(dāng)我們調(diào)用lazy_sum()時(shí),返回的并不是求和結(jié)果,而是求和函數(shù): >>> f = lazy_sum(1, 3, 5, 7, 9) >>> f <function lazy_sum.<locals>.sum at 0x101c6ed90> 調(diào)用函數(shù)f時(shí),才真正計(jì)算求和的結(jié)果: >>> f() 252.2、閉包
正如上邊的例子,內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量),然后返回內(nèi)層函數(shù)的情況,稱(chēng)為閉包(Closure)。
閉包的特點(diǎn)是返回的函數(shù)還引用了外層函數(shù)的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變。
一個(gè)需要注意的問(wèn)題是,返回的函數(shù)并沒(méi)有立刻執(zhí)行,而是直到調(diào)用了f()才執(zhí)行。我們來(lái)看一個(gè)例子:
全部都是9!原因就在于返回的函數(shù)引用了變量i,但它并非立刻執(zhí)行。等到3個(gè)函數(shù)都返回時(shí),它們所引用的變量i已經(jīng)變成了3,因此最終結(jié)果為9。
返回閉包時(shí)牢記一點(diǎn):返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會(huì)發(fā)生變化的變量。
如果一定要引用循環(huán)變量怎么辦?方法是再創(chuàng)建一個(gè)函數(shù),用該函數(shù)的參數(shù)綁定循環(huán)變量當(dāng)前的值,無(wú)論該循環(huán)變量后續(xù)如何更改,已綁定到函數(shù)參數(shù)的值不變
閉包的作用:
封裝
代碼復(fù)用
總結(jié)
以上是生活随笔為你收集整理的Python函数式编程简介(二)返回函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1852. 最终优惠价(单调栈)
- 下一篇: 使用BOOTICE 恢复系统启动项