首頁 > 後端開發 > Python教學 > 關於Python傳回函數與傳回值的秘密

關於Python傳回函數與傳回值的秘密

Tomorin
發布: 2018-08-17 17:53:35
原創
1741 人瀏覽過

最近接觸python,看到了python中回傳函數的概念,以前只接觸過函數回傳值,例如python就可以回傳int,str,list,dict等等類型數據,這裡要說的是python還支援返回函數

首先看看python支援傳回函數的基本語法

def f():
    print 'call f()...'
    # 定义函数g:
    def g():
        print 'call g()...'
    # 返回函数g:
    return g
登入後複製

我們來實作一個可變參數的求和。通常情況下,求和的函數是這樣定義的:

def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n  
    return ax
登入後複製

但是,如果不需要立刻求和,而是在後面的程式碼中,根據需要再計算怎麼辦?可以不傳回求和的結果,而是傳回求和的函數:

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n       
        return ax   
        return sum
登入後複製

當我們呼叫lazy_sum()時,傳回的不是求和結果,而是求和函數:

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
登入後複製

呼叫函數f時,才真正計算求和的結果:

>>> f()
25
登入後複製

在這個例子中,我們在函數lazy_sum中又定義了函數sum,並且,內部函數sum可以引用外部函數lazy_sum的參數和局部變量,當lazy_sum返回函數sum時,相關參數和變數都保存在傳回的函數中,這種稱為「閉包(Closure)」的程式結構擁有極大的威力。

請再注意一點,當我們呼叫lazy_sum()時,每次呼叫都會回傳一個新的函數,即使傳入相同的參數:

>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
登入後複製

f1()和f2()的呼叫結果互不影響。

以上是關於Python傳回函數與傳回值的秘密的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板