Python中的閉包

2021-08-20 14:50:07 字數 1386 閱讀 3709

最近一直在看python有關的東西,看到有個閉包的東西,感覺比較新鮮,所以多了解了下,更重要的是閉包這東西跟python中的裝飾器有著非常密切的關係,而裝飾器這東西跟功能的拓展有著非常大的關係,所以我覺得有必要好好的理解下閉包這東西了!下面分享下自己對閉包的一些理解!

一、從函式說起

def test(a):

def inner(x):

return x+a

return inner

我們看到在上面的**中我們定義了乙個test函式,而在test函式中我們又定義了乙個inner函式,同時在使用inner函式的時候我們又使用到了test函式中的形參a,最後test函式返回了內函式inner的引用,這種方式我們在python中就叫做閉包了。

接下來使用的時候我們就能看到如下效果了:

不難看出,當我們呼叫了了內函式之後對我們的a跟x做了求和運算的,這時候也許就會有朋友要問了,我們不就是要對兩個數進行求和麼?用得了那麼麻煩?直接定義乙個函式test(a,x),同時傳遞兩個引數,直接做求和運算不就行了?看起來好像確實是這樣;但是大家不妨先回想下初中時候經常看到的老師畫在黑板的直角座標系!

二、數學上的應用

怎麼樣,相信大家都不陌生吧?其實把條直線用這條表示式去表達的時候就是y=x+1,結合我們上面的**不難得出y=x+a這樣的式子,也就是說我們上面的函式,其實可以看成根據x跟a兩個引數去求一條直線上所有點的座標的y值,可能還會有朋友說:這樣也不影響我們定義乙個test(x,a)這樣的函式啊,照樣能夠計算出任何點的座標的y值啊?

話是這樣說沒錯,但是不妨好好思考下,當我們a值確定之後,座標系中的線的斜率是不是確定了?也就是說一但a確定了,座標系中的線也就確定了,在python中也就相當於線的物件確定了,接下來線上每個點的y值只會受x值的影響,所以說我們只需傳一次a引數去確定乙個線條物件就足夠了,這也比較符合物件導向的思想!

def test(a):

def inner(x):

return x+a

return inner

line = test(1)

y1 = line(2)

y2 = line(3)

y3 = line(4)

...

就像上面**這樣,看起來雖然簡單,但是就是這幾句簡單的**,把物件導向的程式設計思想體現得淋漓盡致!當然,如果結合python中的裝飾器去理解,會更有感覺!

the end 端午節快到了,提前祝大家假期愉快,工作順心如意^_^!

python中閉包 python中的閉包

一 定義 如果在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 這個定義是相對直白的,閉包有三個條件 1.函式巢狀 2,內部函式呼叫外部函式的變數 3.返回內部函式 defa a defb b s a breturnsreturnb ...

python 閉包 Python中的閉包

一 什麼是閉包 在談之前,我們先來說說作用域,變數的作用域無非就兩種 全域性變數和區域性變數。函式內部可以直接讀取全域性變數,但是在函式外部無法讀取函式內部的區域性變數。出於種種原因,我們有時候需要獲取到函式內部的區域性變數。但是,正常情況下,這是辦不到的!只有通過變通的方法才能實現。於是就引入了閉...

閉包 Python中的閉包

通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...