python3 閉包 第九天python3 閉包

2021-10-11 12:31:15 字數 1221 閱讀 1214

自由變數:未在本地作用域中定義的變數,例如定義在記憶體函式外的外層函式的作用域中的變數;

閉包:出現在巢狀函式中,指的是內層函式引用到了外層函式的自由變數,就形成了閉包;

示例1:

**解析:

第四行不會報錯,c已經在counter函式中定義過了,而且inc中的使用方式是為c的元素修改值,而不是重新定義;

第八行列印1,2;

第十行列印3,因為第九行的c和counter中的c不一樣,而inc引用的是自由變數正式counter的函式;

這是python2中實現閉包的方式,pyton3還可以使用nonlocal關鍵字;

示例2:

上圖**使用global可以執行,但是這使用的是全域性變數,而不是閉包;

如果要對普通變數的閉包,python3中可以使用nonlocal;

nonlocal關鍵字

使用了nonlocal關鍵字,將變數標記為在上級的區域性作用域中定義,但不能在全域性作用域中定義;

示例:上圖中count是外層函式的區域性變數,被內部函式引用;內部函式使用nonlocal關鍵字宣告count變數在上一級作用域中;

左邊**可以正常使用,且形成閉包,右邊**不能正常執行,變數a不能在全域性作用域中;

預設值作用域

為什麼第二次呼叫foo函式列印的是[1,1]?因為函式也是物件,python把函式的預設值放在了屬性中,這個屬性就是是伴隨著這個函式物件的整個生命週期;如果print(xyz) #nameerror,當前作用域沒有xyz變數;

如上圖所示,函式的位址並沒有變,就是說函式這個物件沒有變,呼叫它,它的屬性__defaults__中使用元組儲存所有預設值;xyz預設值是引用型別,引用型別的元素變動,並不是元組的變化;

非引用型別例子

如上圖所示:屬性__defaults__中使用元組儲存所有預設值,它不會因為在函式體內使用了它而發生改變;

預設值的作用域

可變型別預設值,如果使用預設值,就可能修改這個預設值;

方法一:使用影子拷貝建立乙個新的物件,永遠不能改變傳入的引數;

如上圖所示:函式體內,不改變預設值;xyz都是傳入引數或者預設引數的副本,如果就想修改原引數,無能為力;

方法二:通過值的判斷就可以靈活的選擇建立或者修改傳入物件,這種方式靈活應用廣泛,很多函式的定義,都可以看到使用none這個不可變的值作為預設引數,可以說這是一種慣用法;

如上圖所示:使用不可變型別預設值,如果使用預設值none就建立乙個列表,如果傳入乙個列表,就修改這個列表;

python學習 第九天

在下這廂有禮了 爬蟲簡單實現 coding utf 8 import urllib def gethtml url page urllib.urlopen url html page.read returnhtml html gethtml print html l urllib 模組提供了讀取we...

Python 元組 第九天

python 的元組與列表類似,不同之處在於元組的元素不能修改。元組使用小括號,列表使用方括號。元組建立很簡單,只需要在括號中新增元素,並使用逗號隔開即可。例如 tup1 google runoob 1997,2000 tup2 1,2,3,4,5 tup3 a b c d 不需要括號也可以 建立空...

python學習第九天

一.檔案的擴充套件模式 擴充套件模式 配合開啟模式的輔助模式,自己單獨不能使用 如 和 b 1.先讀後寫 r 2.先寫後讀 r 3.可讀可寫 w 4.可讀可寫 a 在寫入內容時,會強制把游標移動到最後 二.read seek tell 三個函式的使用 utf 8編碼格式下 預設乙個中文三個位元組 乙...