python的函式不但可以返回int、str、list、dict等資料型別,還可以返回函式!
例如,定義乙個函式 f(),我們讓它返回乙個函式 g,可以這樣寫:
deff():print 『call f()...『
#定義函式g:
defg():print 『call g()...『
#返回函式g:
return g
仔細觀察上面的函式定義,我們在函式 f 內部又定義了乙個函式 g。由於函式 g 也是乙個物件,函式名 g 就是指向函式 g 的變數,所以,最外層函式 f 可以返回變數 g,也就是函式 g 本身。
呼叫函式 f,我們會得到 f 返回的乙個函式:
>>> x = f() #呼叫f()
call f()...>>> x #變數x是f()返回的函式:
>>> x() #x指向函式,因此可以呼叫
call g()... #呼叫x()就是執行g()函式定義的**
請注意區分返回函式和返回值:
defmyabs():return abs #返回函式
defmyabs2(x):return abs(x) #返回函式呼叫的結果,返回值是乙個數值
返回函式可以把一些計算延遲執行。例如,如果定義乙個普通的求和函式:
defcalc_sum(lst):return sum(lst)
呼叫calc_sum()函式時,將立刻計算並得到結果:
>>> calc_sum([1, 2, 3, 4])10
但是,如果返回乙個函式,就可以「延遲計算」:
defcalc_sum(lst):deflazy_sum():returnsum(lst)return lazy_sum
# 呼叫calc_sum()並沒有計算出結果,而是返回函式:
>>> f = calc_sum([1, 2, 3, 4])>>>f
# 對返回的函式進行呼叫時,才計算出結果:
>>>f()10
由於可以返回函式,我們在後續**裡就可以決定到底要不要呼叫該函式。
練習:編寫乙個函式calc_prod(lst),它接收乙個list,返回乙個函式,返回函式可以計算引數的乘積。
defcalc_prod(lst):defcal():return reduce(lambda x,y:x*y,lst)returncal
f= calc_prod([1, 2, 3, 4])print f()
另一種方法返回list中各元素的乘積:
defcalc_prod(lst):defcal():return map(lambda x:x*x,lst)returncal
f= calc_prod([1, 2, 3, 4])print f()
結果:map函式返回結果:
[1, 4, 9, 16]
python第一句 第一句python
內部執行過程 python內部執行過程如下 內容編碼 python直譯器在載入.py檔案中的 時,會對內容進行編碼 預設ascill ascii american standard code for information interchange,美國標準資訊交換 是基於拉丁字母的一套電腦編碼系統,...
每日一句 2014 8 26
when life gets hard and you want to give up,remember that life is full of ups and downs,and without the downs,the ups would mean nothing 當生活很艱難,你想要放棄的...
每日一句 2014 9 1
people with goals succeed because they know where they re going 有目標的人能夠成功,因為他們知道他們要去哪 people with goals succeed because they know where they re going ...