1. 程式人生 > >python-返回函式的理解

python-返回函式的理解

最近接觸python,看到了python中返回函式的概念,以前只接觸過函式返回值,比如python就可以返回int,str,list,dict等等型別資料,這裡要說的是python還支援返回函式。

首先看看python支援返回函式的基本語法

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

這裡,最外層的函式f會返回一個函式g,也就是函式g本身;
下面看看函式呼叫的過程;(接上面)

>>> x = f()   # 呼叫f()
call f()... >>> x # 變數x就是上面一個最外層函式返回的函式(不是函式值) <function g at 0x1037bf320> >>> x() # x指向函式,因此可以呼叫,這裡就是呼叫內層函式x()的過程 call g()... # 呼叫x()就是執行g()函式定義的程式碼
  • 只返回函式的作用:
    返回函式可以把一些計算延遲執行。例如,如果定義一個普通的求和函式:
def calc_sum(lst):
    return sum(lst)
>>>calc_sum([1,2,3,4])

結果直接是:10

但是,可以通過返回函式思想寫程式碼,就可以“延時計算”

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

下面是呼叫:
注意,下面程式碼並沒有對函式進行執行計算出結果,而是返回函式。

>>> f = calc_sum([1, 2, 3, 4])
>>> f
<function lazy_sum at 0x1037bfaa0>

對返回的函式進行呼叫時,才計算出結果

>>>f()
10

下面是一個例子:
請編寫一個函式calc_prod(lst),它接收一個list,返回一個函式,返回函式可以計算引數的乘積。
思想:先定義能計算乘積的函式,再將此函式返回。

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()