前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理,
PS:如有需要Python學習資料的小伙伴可以點擊下方鏈接自行獲取
Python免費學習資料、代碼以及交流解答點擊即可加入
閉包和裝飾器有什么區別呢?
閉包傳遞的是變數,而裝飾器傳遞的是函式物件,只是傳的引數內容不一樣,閉包的概念包含了裝飾器,可以說裝飾器是閉包的一種,它只是傳遞函式物件的閉包,
先看一個面試題
先看一個經典的面試題,很有代表性, 運行以下代碼會輸出什么呢?為什么會是這種結果?
運行結果
運行的結果是4個6 ,并不是我們想的 :0, 2, 4, 6,上面的代碼用到了串列推導式,還有個匿名函式lambda,直接去閱讀不太好理解,可以把匿名函式轉成自己定義一個函式,
于是上面的代碼等價于:
為了更好的理解,可以先去掉外面的一層fun()
這里只定義了一個函式 inner(), 有 2 個變數,i 是函式外部的變數,x 是函式內部的變數,
現在問題的關鍵在理解函式外部變數和函式內部變數的區別了, 接下來再看一個簡單的例子
運行結果:101 103 103
也就是函式外部變數a是可變的,后面給a重新賦值了,會替換前面的值,上面的 inner(x) 函式也是一樣,外部變數 i 的值是0, 1, 2, 3變化,最后的3 會覆寫前面的值,所以得到的結果都是6
如何解決上面的問題,接下來就是要說的閉包的概念了!
什么是閉包?
閉包就是外部函式中定義了一個內部函式,當外部函式回傳內部函式物件(注意是函式物件)時,程式接收了內部函式的定義(此時并未被執行),當再次執行這個回傳值時,這個被回傳的函式才能被執行,
創建一個閉包必須滿足以下幾點:
- 必須有一個內嵌函式
- 內嵌函式必須參考外部函式中的變數
- 外部函式的回傳值必須是內嵌函式
閉包和裝飾器的區別:閉包傳遞的是變數,而裝飾器傳遞的是函式,除此之外沒有任何區別,或者說裝飾器是閉包的一種,它只是傳遞函式的閉包,
以下是閉包的一個標準示例:
上面的問題,用閉包來解決
運行結果
使用串列推導式
這樣就可以得到我們的預期結果:0 2 4 6
通過上面的案例就可以了解到閉包的作用了,它保存了函式的外部變數,不會隨著變數的改變而改變了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266223.html
標籤:Python
