python面試中面試官問你什麼是閉包(closure)?該如何回答?

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,若有問題請及時聯繫咱們以做處理。面試

PS:若有須要Python學習資料的小夥伴能夠點擊下方連接自行獲取網絡

Python免費學習資料、代碼以及交流解答點擊便可加入閉包


 

閉包和裝飾器有什麼區別呢?
閉包傳遞的是變量,而裝飾器傳遞的是函數對象,只是傳的參數內容不同,閉包的概念包含了裝飾器,能夠說裝飾器是閉包的一種,它只是傳遞函數對象的閉包。函數

先看一個面試題

先看一個經典的面試題,頗有表明性, 運行如下代碼會輸出什麼呢?爲何會是這種結果?學習

 

運行結果

 

運行的結果是4個6 ,並非咱們想的 :0, 2, 4, 6。上面的代碼用到了列表推導式,還有個匿名函數lambda,直接去閱讀不太好理解,能夠把匿名函數轉成本身定義一個函數。對象

因而上面的代碼等價於:blog

 

 

爲了更好的理解,能夠先去掉外面的一層fun()圖片

 


這裏只定義了一個函數 inner(), 有 2 個變量,i 是函數外部的變量,x 是函數內部的變量。ip

如今問題的關鍵在理解函數外部變量和函數內部變量的區別了, 接下來再看一個簡單的例子get

 

 

運行結果:101 103 103
也就是函數外部變量a是可變的,後面給a從新賦值了,會替換前面的值。上面的 inner(x) 函數也是同樣,外部變量 i 的值是0, 1, 2, 3變化,最後的3 會覆蓋前面的值,因此獲得的結果都是6
如何解決上面的問題,接下來就是要說的閉包的概念了!

什麼是閉包?

閉包就是外部函數中定義了一個內部函數,當外部函數返回內部函數對象(注意是函數對象)時,程序接收了內部函數的定義(此時並未被執行),當再次執行這個返回值時,這個被返回的函數才能被執行。
建立一個閉包必須知足如下幾點:

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

閉包和裝飾器的區別:閉包傳遞的是變量,而裝飾器傳遞的是函數,除此以外沒有任何區別,或者說裝飾器是閉包的一種,它只是傳遞函數的閉包。
如下是閉包的一個標準示例:

 

 

上面的問題,用閉包來解決

 

運行結果

 

使用列表推導式

 

 

這樣就能夠獲得咱們的預期結果:0 2 4 6經過上面的案例就能夠了解到閉包的做用了,它保存了函數的外部變量,不會隨着變量的改變而改變了。

相關文章
相關標籤/搜索