1. 程式人生 > >Python_基礎個人理解_閉包

Python_基礎個人理解_閉包

就會 返回值 技術 程序 執行 控制 可見 情況 alt

閉包

                       ———— 個人理解簡述

閉包在某種含義上其本身其實也是一個函數。

定義的格式簡單來說為在一個函數內部再創建一個函數,

也就是一個外函數包裹了一個內函數

在內函數裏使用了外函數的臨時變量,

外函數的“return”返回值為內函數的引用(函數名)。

在形式上與循環嵌套有些相似,

暫且也可稱之為函數嵌套。

閉包的使用可以有效的隱藏函數內部的工作細節,

只給外部使用者提供一個可以執行的內部函數的應用。

如果在外函數裏自定義了變量並且需要在內函數中對其進行修改,

需要將變量聲明為 “nonlocal”nonlocal 聲明變量為非本地變量,

如果確定在程序要修改外部變量,那麽建議將 nonlocal 寫在內部函數的第一行。

舉個栗子:

技術分享圖片

如圖:

在這段代碼中,在實際開發中並沒有實際意義,只是簡單示意了函數可以被當做參數和返回值使用。

有兩點需要註意:

   1> 盡量不要使用全局變量,因為全局變量會破壞程序的封裝性。

   2> 如果 show 函數不想被 callFunc 以外的函數進行訪問時,是無法控制的

基於以上兩點,圖中代碼可以進行優化修改:

技術分享圖片

代碼進行優化後,去不再使用全局變量。而且將 show 函數封裝在了 callFunc 函數內部,使外部不可見,不能使用 show 函數,隱藏了實現細節

程序在執行時,callFunc 函數返回了內部定義的 show 函數,並且 在 show 函數內部

使用了外部函數的變量

在 show 函數返回時,保存了當前的執行環境,也就是會在 show 函數中使用的外部變量 n 。

因為 n 是一個 callFunc 函數中的局部變量,正常情況下 callFunc 函數執行結束後,n 就會被釋放。

但是現在因為 callFunc 函數中返回了 show 函數,show 函數在外部還會再執行,所以程序會將 show 函數所需的執行環境保存下來。

水平一般,能力有限,如有不足,加以改正。

  

Python_基礎個人理解_閉包