欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解python函數的閉包問題(內部函數與外部函數詳述)

 更新時間:2019年05月17日 08:35:21   作者:AngelovLee  
這篇文章主要介紹了python函數的閉包問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

python函數的閉包問題(內嵌函數)

>>> def func1():
...   print ('func1 running...')
...   def func2():
...       print ('func2 running...')
...   func2()
... 
>>> func1()
func1 running...
func2 running...

內部函數func2作用域都在外部函數func1作用域之內
如果試圖在外部函數的外部調用內部函數將會報錯

>>> func2()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'func2' is not defined

關于python的閉包問題

如果試圖在一個內部函數里對外部作用域(不包括外部函數的外部作用域)的變量進行引用,內部函數就會被認為是閉包

>>> def FuncX(x):
...   def FuncY(y):
...       return x*y
...   return FuncY

對于FuncY函數來說,對在FuncX函數的整個作用域(FuncY函數的非全局作用域的外部作用)的變量x進行引用,自此就可以說FuncY函數就是所謂的閉包

>>> f = FuncX(8)
>>> f
<function FuncY at 0x7f3a436fc2a8>
>>> type(f)
<type 'function'>
>>> f(10)
80
>>> FuncX(7)(8)
56

由于閉包本身是基于內部函數這一概念而來,所以不能在外部函數的外部作用域對內部函數進行調用

>>> FuncY(8)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'FuncY' is not defined

既然是基于內部函數這一概念而來,自然對于內部函數來說對引用外部函數作用域內的變量進行修改,將會啟動解釋器的屏蔽機制

>>> def Func1():
...   x = 233
...   def Func2():
...       x *=x
...       return x
...   return Func2()
... 
>>> Func1()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 6, in Func1
 File "<stdin>", line 4, in Func2
UnboundLocalError: local variable 'x' referenced before assignment

x*=x的左值此時是內部函數作用域里的變量,此時試圖將沒有定義的數據進行平方操作,因此報錯

>>> def Func1():
...   x = 233
...   def Func2():
...       x = 321
...       return x
...   return Func2()
... 
>>> Func1()
321

內部函數創(chuàng)建x變量并且屏蔽外部函數作用域內的x變量

python3之前的解決辦法

應用容器類型(list,tuple之類的)存放外部函數作用域的變量從而不會被屏蔽機制屏蔽掉,因為容器類型不是存放在棧里面

>>> def Func1():
...   x = [233]
...   def Func2():
...       x[0] *= x[0]
...       return x[0]
...   return Func2()
... 
>>> Func1()
54289

python3之后的解決辦法:nonlocal關鍵字

>>> def Func1():
...   x = 233
...   def Func2():
...   nonlocal x
...       x *= x
...       return x
...   return Func2()
... 
>>> Func1()
54289

以上所述是小編給大家介紹的python函數的閉包問題詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • Python 200行代碼實現(xiàn)一個滑動驗證碼過程詳解

    Python 200行代碼實現(xiàn)一個滑動驗證碼過程詳解

    這篇文章主要介紹了Python 200行代碼實現(xiàn)一個滑動驗證碼過程詳解,各種各樣的驗證碼,比較高級的有滑動、點選等樣式,看起來好像挺復雜的,但實際上它們的核心原理還是還是很清晰的,本文章大致說明下這些驗證碼的原理以及帶大家實現(xiàn)一個滑動驗證碼
    2019-07-07
  • 詳解python內置常用高階函數(列出了5個常用的)

    詳解python內置常用高階函數(列出了5個常用的)

    這篇文章主要介紹了python內置常用高階函數(列出了5個常用的),通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • python實現(xiàn)批量按比例縮放圖片效果

    python實現(xiàn)批量按比例縮放圖片效果

    這篇文章主要為大家詳細介紹了python實現(xiàn)批量按比例縮放圖片效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 在VScode里面添加Python解釋器的詳細步驟

    在VScode里面添加Python解釋器的詳細步驟

    VScode編輯器在安裝好Python插件之后會自動選擇環(huán)境變量中排序最高的那一個解釋器作為默認解釋器,而想要額外添加新的Python解釋器就需要自己設置,接下來通過本文給大家分享VScode添加Python解釋器的方法,感興趣的朋友一起看看吧
    2023-02-02
  • 在Python中封裝GObject模塊進行圖形化程序編程的教程

    在Python中封裝GObject模塊進行圖形化程序編程的教程

    這篇文章主要介紹了在Python中封裝GObject模塊進行圖形化程序編程的教程,本文來自于IBM官方網站技術文檔,需要的朋友可以參考下
    2015-04-04
  • Python多圖片合并PDF的方法

    Python多圖片合并PDF的方法

    今天小編就為大家分享一篇關于Python多圖片合并PDF的方法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Python讀寫文件模式和文件對象方法實例詳解

    Python讀寫文件模式和文件對象方法實例詳解

    這篇文章主要介紹了Python讀寫文件模式和文件對象方法,結合實例形式詳細分析了Python文件操作常用技巧與相關注意事項,需要的朋友可以參考下
    2019-09-09
  • Django框架實現(xiàn)分頁顯示內容的方法詳解

    Django框架實現(xiàn)分頁顯示內容的方法詳解

    這篇文章主要介紹了Django框架實現(xiàn)分頁顯示內容的方法,結合實例形式詳細分析了Django框架引入bootstrap樣式進行分頁顯示相關步驟、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2019-05-05
  • Python使用win32com實現(xiàn)的模擬瀏覽器功能示例

    Python使用win32com實現(xiàn)的模擬瀏覽器功能示例

    這篇文章主要介紹了Python使用win32com實現(xiàn)的模擬瀏覽器功能,結合實例形式分析了Python基于win32com模塊實現(xiàn)網頁的打開、登陸、加載等功能相關技巧,需要的朋友可以參考下
    2017-07-07
  • 用Python實現(xiàn)校園通知更新提醒功能

    用Python實現(xiàn)校園通知更新提醒功能

    今天小編就為大家分享一篇用Python實現(xiàn)校園通知更新提醒功能,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11

最新評論