1. 程式人生 > >Python學習筆記-返回函式

Python學習筆記-返回函式

1:python返回函式

Python的函式不但可以返回int、str、list、dict等資料型別,還可以返回函式!例如,定義一個函式 f(),我們讓它返回一個函式 g,可以這樣寫:

def f(): 
    print 'call f()...'
    # 定義函式g:
    def g():
            print 'call g()...'
    # 返回函式g:
    return g

在函式 f 內部又定義了一個函式 g。由於函式 g 也是一個物件,函式名 g 就是指向函式 g 的變數,所以,最外層函式 f 可以返回變數 g,也就是函式 g 本身。呼叫函式 f,我們會得到 f 返回的一個函式:

x = f() # 呼叫f(),列印結果call f()...
# 變數x是f()返回的函式:
x() # x指向函式,因此可以呼叫。
#列印結果call g()... 
# 呼叫x()就是執行g()函式定義的程式碼

2:請注意區分返回函式和返回值:

def myabs():
    return abs   # 返回函式
def myabs2(x):
    return abs(x)   # 返回函式呼叫的結果,返回值是一個數值

3:返回函式可以把一些計算延遲執行。

這點其實是回撥函式。例如,如果定義一個普通的求和函式:

def calc_sum(lst)
:
return sum(lst)

呼叫calc_sum()函式時,將立刻計算並得到結果:
calc_sum([1, 2, 3, 4])#返回結果是10,立刻可以得到
但是,如果返回一個函式,就可以“延遲計算”:

def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum

呼叫calc_sum()並沒有計算出結果,而是返回函式:

f = calc_sum([1, 2, 3, 4])
f()#呼叫返回函式進行求和計算

4:使用例子

請編寫一個函式calc_prod(lst),它接收一個list,返回一個函式,返回函式可以計算引數的乘積。

# -*- coding: utf-8 -*-
__author__ = 'liujiepeng'
def calc_prod(lst):
    def lazy_prod():
        def f(x, y):
            return x * y
        return reduce(f, lst, 1)
    return lazy_prod
f = calc_prod([1, 2, 3, 4])
print f()

補充reduce:
python中的reduce內建函式是一個二元操作函式,他用來將一個數據集合(連結串列,元組等)中的所有資料進行下列操作:用傳給reduce中的函式 func()(必須是一個二元操作函式)先對集合中的第1,2個數據進行操作,得到的結果再與第三個資料用func()函式運算,最後得到一個結果。所以,上述的連乘操作,需要定義如上:

        def f(x, y):
            return x * y
        return reduce(f, lst, 1)