閉包:閉是封閉(函式內部函式),包是包含(該內部函式對外部作用域而非全域性作用域的變數的引用)。
閉包指的是:函式內部函式對外部作用域而非全域性作用域的引用。
為函式傳參的方式一:使用引數的形式
def func(x):
print(x)
func(1)
func(1)
func(1)
1
11
為函式傳參的方式二:包給函式
def outter(x):
x = 1
def inner():
print(x)
return inner
f = outter(1)
f()f()
f()# 檢視閉包的元素
print(f"f.__closure__[0].cell_contents: ")
111
f.__closure__[0].cell_contents: 1
閉包的意義:返回的函式物件,不僅僅是乙個函式物件,在該函式外還包裹了一層作用域,這使得,該函式無論在何處呼叫,優先使用自己外層包裹的作用域。
應用領域:延遲計算(原來我們是傳參,現在我們是包起來)、爬蟲領域。
import requests
def get(url):
response = requests.get(url)
print(f"done: ")
get('')
get('')
get('')
get('')
get('')
get('')
done:
done:
done:
done:
done:
done:
上面的方式是極其複雜的,我們如果使用預設引數也只能解決乙個**,因此我們可以考慮使用閉包的方式。
done:器指的是工具,而程式中的函式就是具備某一功能的工具,所以裝飾器指的是為被裝飾器物件新增額外功能。
因此定義裝飾器就是定義乙個函式,只不過該函式的功能是用來為其他函式新增額外的功能。
需要注意的是:
如果我們已經上線了乙個專案,我們需要修改某乙個方法,但是我們不想修改方法的使用方法,這個時候可以使用裝飾器。因為軟體的維護應該遵循開放封閉原則,即軟體一旦上線執行後,軟體的維護對修改源**是封閉的,對擴充套件功能指的是開放的。
裝飾器的實現必須遵循兩大原則:
不修改被裝飾物件的源**
不修改被裝飾物件的呼叫方式
裝飾器其實就是在遵循以上兩個原則的前提下為被裝飾物件新增新功能。
在被裝飾函式正上方,並且是單獨一行寫上@裝飾器名
def deco(func):
res = func(*args,**kwargs)
return res
無參裝飾器只套了兩層,講乙個套三層的裝飾器——有參裝飾器,但現在我們先實現乙個使用者登入註冊的裝飾器。
詳見nick部落格
day05課堂小結
加 減 乘 除 取整 取餘 冪 等於 不等於 不等於 大於 小於 大於等於 小於等於 c a b 將 a b的運算結果賦值給 c,c a 等效於 c c a c a等效於c c a and or not 與 或 非 is和 的區別 is用於判斷兩個變數引用物件是否為同乙個 記憶體空間 用於判斷引用變...
day04課堂小結
a 1 b 1 c 1 d 1 print f a b c d a 1,b 1,c 1,d 1 a b c d 1 print f a b c d x 10 y 20 x變成20,y變成10,不讓原來的10和20被垃圾 機制 設乙個中間變數 z x x y y z print f x print f...
day03課堂小結
ctrl c 複製,預設複製整行 ctrl v 貼上 ctrl z 撤銷 ctrl x 剪下,預設剪下整行 ctrl a 全選 ctrl f 查詢 選中批量修改 shift ctrl z 反撤銷 ctrl d 複製貼上選中內容,沒有選中預設整行 ctrl backspace 刪除乙個單詞 ctrl ...