1. 程式人生 > >Python語言特性-閉包

Python語言特性-閉包

1.閉包的概述
閉包是指在一個函式中定義了一個另外一個函式,內函式裡運用了外函式的臨時變數,並且外函式的返回值是內函式的引用,這樣就構成了一個閉包。

2.閉包的特點
總結一下,建立一個閉包必須滿足以下幾點:

  • 必須有一個內嵌函式
  • 內嵌函式必須引用外部函式中的變數
  • 外部函式的返回值必須是內嵌函式

由於這樣的特點, 使用閉包,可以隱藏內部函式的工作細節,只給外部使用者提供一個可以執行的內部函式的引用。

3.閉包舉例
利用函式可以被傳遞和返回的特性,在開發過程中,可以隱藏更多的實現細節。

n = 1   # 全域性變數

def show(): # 公有函式
    print('show: ',n)

def callFunc(func): #公有函式
    return func

s = callFunc(show)  # 函式執行
s()
show()

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

但是這段程式碼並不完美

第一,儘量不要使用全域性變數,因為全域性變數會破壞程式的封裝性。

第二,如果 show 函式不想被 callFunc 以外的函式進行訪問時,是無法控制的。

所以可以改進如下:

def callFunc():
    n = 1
    def show():
        print('show: ', n)
    return show

s = callFunc()
s()
# show() 因為 show 函式定義在 callFunc 內部,所以外部不可見,不能使用

程式碼改進後,去掉了全域性變數的使用。而且將 show 函式封裝在了 callFunc 函式內部,使外部不可見,不能使用 show 函式,隱藏了實現細節

程式在執行時,callFunc 函式返回了內部定義的 show 函式,並且 在 show 函式內部使用了外部函式的變數。

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

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

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

這種形式就是閉包。閉包就像個空心球一樣,你知道外面和裡面,但你不知道中間是什麼樣。