搜尋
首頁後端開發Python教學Python中閉包Closure是什麼?有哪些應用?

這篇文章帶給大家的內容是關於Python中閉包Closure是什麼?有哪些應用?有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

一、函數以返回值

#介紹「閉包」之前,先了解函數作為傳回值的情況。
高階函數除了可以接收函數當參數外,還可以把函數當作結果值回傳。例如先前介紹的裝飾器中,就出現了將函數當作傳回值。

二、閉包

1、產生閉包的條件、作用

什麼是閉包?
當在函數中嵌套另一個函數時,如果內部函數引用了外部函數的變量,則可能產生閉包。
所以閉包產生的三個條件(缺一不可)

  • #1、必須嵌套一個內部函數

  • 2、內部函數必須引用外部函數的變數

  • 3、外部函數必須傳回內部函數

那為什麼要試用閉包,閉包的作用呢?

  • 1、閉包可以根據外部函數的局部變數來得到不同的結果

  • 2、當閉包執行完成後,仍可以保持目前的運行環境,執行結果依賴於函數上一次的運行結果

#2、閉包舉例

栗子一:求序列總和

>>> def calc_sum(*args):
...     ax = 0
...     for n in args:
...         ax = ax + n
...     return ax  # 返回变量
...
>>> calc_sum(1,2,3)
6

但是,現在如果要求不需要立即取得求和結果,而是在後面的程式碼中,根據需要再計算,該怎麼弄呢?
我們可以不傳回求和的結果,而傳回求和的函數,如下:

>>>def lazy_sum(*args):
...    def sum():            # sum()是内部函数,可以利用外部函数的参数
...        ax = 0
...        for n in args:    # sum()中使用外部函数的局部变量
...            ax = ax + n 
...        return ax
...    return sum            # 形成闭包,此时,*args保存在返回的函数中
...
>>>f = lazy_sum(1,3,5,7,9)
>>>f          # 此时返回的是求和函数
>>> f()       # 调用函数f()时,才真正计算求和的结果
25

注意:

lazy_sum()函數的內部執行順序,當f時,執行到return sum處,*args保存在回傳函數中,傳回的是sum()函數。執行f()時,相當於執行sum(),且包含*args。

當我們呼叫lazy_sun()時,每次都會回傳一個新的函數,即使傳入相同的參數,但是f()呼叫結果不影響。

我們來驗證第二點:

# 但是调用 f1() 与f2()的调用结果互不影响
>>> f1 = lazy_sum(1,3,5,7,9)
>>> f2 = lazy_sum(1,3,5,7,9)
>>> f1
<function>.sum at 0x013DD618>
>>> f2
<function>.sum at 0x02F92DF8>
>>> f1 == f2
False
>>> f1() == f2()
True
>>> f1()
25
>>> f2()
25
>>> id(f1())
1627215984
>>> id(f2())
1627215984</function></function>

說明:f1與f2回傳函數的位置不一樣,所以f1==f2回傳結果為False。
但是不影響最後的執行結果,f1()與f2()的執行結果均為25,且用id()進行查看,指向是同一塊區域。

栗子二:

def count():
    fs = []
    for i in range(1, 4):
        def f():         # 返回函数f()放在循环里
            return i*i
    fs.append(f)
    return fs
f1, f2, f3 = count()

實際執行結果為:f1=9 f2=9 f3=9
可能與實際想的([1,4,9])有點不一樣。因為f()函數放在了for迴圈裡,只有當迴圈結束後,最後才回傳i=3的執行結果9。
所以回傳函數最好不要引用任何循環變量,或是後續可能變化的量。那如何來修改呢?

def count():
    def f(j):
        def g():
            return j*j      # 形成闭包
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i))      # 一个i值进入后,f(i)立刻被执行,并加入到fs中
    return fs

f1, f2, f3 = count()  # 返回函数g没有引用j

最後結果:[1,4,9] 即f1=1 f2=4 f3=

三、匿名函數lambda




  • ##定義:匿名函數指一類無需定義標識符函數名的函數或子程序。 Python允許使用lambda關鍵字創造匿名函數。

    語法:lambda 參數:表達式
  •   或lambda 形參1,…,形參n : function(形參),入參1,…,入參n
    #注意:1、lambda函數可以接收任意多個參數且傳回單一表達式的值;
  •   2、lambda中不能包含指令,傳回的表達式不能超過一個。

    優點:1、可以省去定義函數的過程,精簡程式碼;
  •   2、對於一些抽象的、不會重複使用的函數可以用lambda來定義。
######範例:###
>>> list( map( lambda x: x*x ,[1,2,3] ) )
[1, 4, 9]
###其中###lamdba x : x*x### 實作的是:###def f(x): return x*x#### 的功能。 ############可以把匿名函數賦值給一個變量,再利用變數呼叫該函數。例如:#########
>>> f = lambda x:x*x  
>>> f(5) # 调用
>>> g = lambda x,y=2 : x*y
>>> g(2,4)
8
>>> g(2)    # 默认y=2
4
########可以把匿名函數當作傳回值傳回,例如:#########
return lambda x:x*x

以上是Python中閉包Closure是什麼?有哪些應用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault思否。如有侵權,請聯絡admin@php.cn刪除
Numpy數組與使用數組模塊創建的數組有何不同?Numpy數組與使用數組模塊創建的數組有何不同?Apr 24, 2025 pm 03:53 PM

numpyArraysareAreBetterFornumericalialoperations andmulti-demensionaldata,而learthearrayModuleSutableforbasic,內存效率段

Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Apr 24, 2025 pm 03:49 PM

numpyArraySareAreBetterForHeAvyNumericalComputing,而lelethearRayModulesiutable-usemoblemory-connerage-inderabledsswithSimpleDatateTypes.1)NumpyArsofferVerverVerverVerverVersAtility andPerformanceForlargedForlargedAtatasetSetsAtsAndAtasEndCompleXoper.2)

CTYPES模塊與Python中的數組有何關係?CTYPES模塊與Python中的數組有何關係?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingingangandmanipulatingc-stylarraysinpython.1)usectypestoInterfacewithClibrariesForperfermance.2)createc-stylec-stylec-stylarraysfornumericalcomputations.3)passarraystocfunctions foreforfunctionsforeffortions.however.however,However,HoweverofiousofmemoryManageManiverage,Pressiveo,Pressivero

在Python的上下文中定義'數組”和'列表”。在Python的上下文中定義'數組”和'列表”。Apr 24, 2025 pm 03:41 PM

Inpython,一個“列表” isaversatile,mutableSequencethatCanholdMixedDatateTypes,而“陣列” isamorememory-sepersequeSequeSequeSequeSequeRingequiringElements.1)列表

Python列表是可變還是不變的?那Python陣列呢?Python列表是可變還是不變的?那Python陣列呢?Apr 24, 2025 pm 03:37 PM

pythonlistsandArraysareBothable.1)列表Sareflexibleandsupportereceneousdatabutarelessmory-Memory-Empefficity.2)ArraysareMoremoremoremoreMemoremorememorememorememoremorememogeneSdatabutlesserversEversementime,defteringcorcttypecrecttypececeDepeceDyusagetoagetoavoavoiDerrors。

Python vs. C:了解關鍵差異Python vs. C:了解關鍵差異Apr 21, 2025 am 12:18 AM

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

Python vs.C:您的項目選擇哪種語言?Python vs.C:您的項目選擇哪種語言?Apr 21, 2025 am 12:17 AM

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

達到python目標:每天2小時的力量達到python目標:每天2小時的力量Apr 20, 2025 am 12:21 AM

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。