標籤:wrapper tar 容器 結果 閉包 匯總 targe 知識點 war
一.函數名的運?, 第?類對象
函數名是?個變數, 但它是?個特殊的變數, 與括弧配合可以執?函數的變數
1. 函數名的記憶體位址
def func(fn):
print(fn)
print(func) #結果:列印函數的記憶體位址 <function func at 0x0000028AA22F2EA0>
2.函數名可以賦值給其他變數
def func1():
print("端午節")
b=func1 #將函數名func1賦值給b ,
b() #執行結果和 func1的執行結果一樣 "端午節"
3. 函數名可以當做容器類的元素
def func2():
print("貝貝")
def func3():
print("京京")
def func4():
print("歡歡")
lst=[func2,func3,func4] #如果加括弧列印 e ,結果是三個None. 因為沒有傳回值.
for e in lst:
e() #結果是 貝貝 京京 歡歡;
4.函數名可以當做函數的參數
def func5():
print("端午節要放假,哈哈哈")
def func6(fn): # fn= func5
print("下周就是端午節") #第一步
fn() #第二步 相當於執行func5() 結果是:端午節要放假,哈哈哈
print("真的嗎") #第三步
func6(func5) #func5 作為參數,
5.函數名可以作為函數的傳回值
def func7():
print("函數一")
def func8():
print("函數二")
print("函數一")
return func8
ret=func7() #func7()反悔的結果是func8,並賦值給ret
ret() #ret() 就相當於func8() 結果是"函數二"
?.閉包就是內層函數, 對外層函數(非全域)的變數的引?.
閉包的作用 讓?個變數能夠常駐記憶體. 供後?的程式使?.
def func():
name="mary"
def func1():
print(name) #閉包 如果是 # name = "alex" 則返回None.
func1()
print(func1.__closure__) #_ _closure_ _來檢測函數是否是閉包,返回 cell 就是閉包,(<cell at 0x000002AF8F9475B8: str object at 0x000002AF8F9D89D0>,)
# 返回 None就不是閉包.
func()
#多層嵌套:
def func1():
def func2():
def func3():
print("嘿嘿")
return func3
return func2
func1( )( )( )
三.裝飾器初識
開閉原則, ?被成為開放封閉原則,你的代碼對功能的擴充是開放的, 你的程式對修改原始碼是封閉的. 這樣的軟體設計思路可以
更好的維護和開發.
1.定義一個函數
def creat_people():
print("摶泥土,捏泥人")
creat_people()
2.添加功能
def creat_people():
print("澆水") #增加功能 (但是改變代碼了,不符合開放封閉原則)
print("摶泥土,捏泥人")
creat_people()
""" 裝飾器執行流程
1. ?先訪問warter(create_people).
2. 把你的?標函數傳遞給warter的形參fn. 那麼後?如果執?了fn意味著執?了你的?標函數create_people
3. warter()執?就?句話. 返回inner函數. 這個時候. 程式認為warter()函數執?完. 那麼前?的create_people函數名
被重新覆蓋成inner函數
4 執?create_people函數. 實際上執?的是inner函數. ?inner中訪問的恰恰使我們最開
始傳遞進去的原始的create_people函數
"""
3.裝飾器雛形 用文法糖簡化代碼 文法糖文法( @裝飾器 )
def water(fn):
def inner():
print("澆水")
fn()
print("吹仙氣")
return inner
@water
def creat_people():
print("摶泥土,捏泥人")
creat_people()
4.裝飾器的完整模型代碼
def wrapper(func):
def inner(*args,**kwargs): # * 彙總
print("快放假了")
#目標函數之前的內容
ret=func(*args,**kwargs) # * 打散
print("好開心")
#目標函數後面的內容
return ret
return inner
@wrapper #target_func=wrapper(func)
def target_func():
print("我是目標函數,你們都讓路")
target_func()
python全棧開發 * 11知識點匯總 * 1806011