函數(shù)的引用賦值和參數(shù)操作
python中的函數(shù)操作,本身也就是一個(gè)對(duì)象磕瓷,常規(guī)定義語(yǔ)法的函數(shù)就是將一個(gè)函數(shù)對(duì)象的引用地址賦值給函數(shù)名稱的變量腥椒,通過(guò)函數(shù)名稱的變量調(diào)用執(zhí)行函數(shù)
如果函數(shù)是對(duì)象虽惭,那么函數(shù)也可以和對(duì)象一樣可以被引用賦值
#函數(shù)的引用賦值
def show():
print("函數(shù)執(zhí)行了")
#將函數(shù)的地址賦值給一個(gè)變量
a = show
#通過(guò)調(diào)用這個(gè)變量也可以執(zhí)行函數(shù)
a()
輸出結(jié)果:
同樣梧宫,函數(shù)也可以被當(dāng)成參數(shù)傳遞給其他函數(shù)執(zhí)行
#函數(shù)的傳值操作接谨,策略模式
def show(message):
message()
def show_msg():
print("函數(shù)1執(zhí)行了")
def show_msg2():
print("函數(shù)2執(zhí)行了")
#調(diào)用執(zhí)行參數(shù)show
show(show_msg)
show(show_msg2)
輸出結(jié)果:
裝飾器函數(shù):
軟件開發(fā)原則中摆碉,有一項(xiàng)OCP原則((open close principle:開閉原則)
OCP原則((open close principle:開閉原則):對(duì)軟件功能的擴(kuò)展開放,對(duì)軟件原來(lái)代碼的修改關(guān)閉脓豪。
既然如此巷帝,如何在函數(shù)中添加功能但是又不修改函數(shù)的代碼呢?
python提供了一種新的處理方式,可以更加友好的在符合OCP原則的情況下擴(kuò)展函數(shù)的操作功能扫夜,稱為裝飾器函數(shù)
例如:
原函數(shù)如下楞泼,客戶要求在每段函數(shù)開始和結(jié)束時(shí)添加提示語(yǔ)句:
def record_info():
print("模擬,記錄用戶信息")
def show_info():
print("模擬笤闯,展示用戶信息")
#調(diào)用記錄用戶信息
record_info()
#調(diào)用展示用戶信息
show_info()按客戶需求在遵守OCP原則的情況下修改代碼如下:
#定義一個(gè)裝飾器函數(shù)
def decorators(fn):
def wrapper(*args, **kwargs):
print("函數(shù)準(zhǔn)備執(zhí)行")
result = fn(*args, **kwargs)
print("函數(shù)執(zhí)行結(jié)束")
return result
return wrapper
@decorators
def record_info():
print("模擬堕阔,記錄用戶信息")
@decorators
def show_info():
print("模擬,展示用戶信息")
#調(diào)用記錄用戶信息
record_info()
#調(diào)用展示用戶信息
show_info()輸出結(jié)果:
裝飾器函數(shù)執(zhí)行過(guò)程:
函數(shù)擴(kuò)展內(nèi)容:
1望侈、偏函數(shù):
引入模塊 from functools import partial
通過(guò)偏函數(shù)模塊可以給當(dāng)前函數(shù)賦值定義一個(gè)特殊的訪問(wèn)函數(shù),特殊的訪問(wèn)函數(shù)可以給原來(lái)的函數(shù)增加一個(gè)默認(rèn)值
示例:
引入函數(shù)工具模塊中的偏函數(shù)擴(kuò)展
from functools import partial
# 定義普通函數(shù)
def calculation(num1, num2, opra):
res = None
if opra == "+":
res = num1 + num2
elif opra == "-":
res = num1 - num2
elif opra == "*":
res = num1 * num2
elif opra == "/":
res = num1 / num2
return res
# 普通函數(shù)的調(diào)用
result = calculation(12, 10, "+")
print(result)
# 通過(guò)偏函數(shù)進(jìn)行處理勋桶,添加默認(rèn)操作方式
calculation2 = partial(calculation, opra="+")
result = calculation2(22, 24)
print(r輸出結(jié)果:
但是偏函數(shù)的操作脱衙,在一定程度上來(lái)說(shuō)只是一個(gè)語(yǔ)法糖,因?yàn)閜ython中對(duì)于函數(shù)參數(shù)的處理已經(jīng)有默認(rèn)值的操作例驹,完全可以代替偏函數(shù)的復(fù)雜操作捐韩。
2、閉包函數(shù):
因?yàn)楹瘮?shù)的出現(xiàn)鹃锈,變量出現(xiàn)了分化:全局變量荤胁,局部變量
全局變量:在聲明開始的任意地方都可以訪問(wèn)
局部變量:在當(dāng)前函數(shù)中可以操作
但在有些情況下,我們需要在函數(shù)外部直接操作函數(shù)中的數(shù)據(jù)屎债,怎么進(jìn)行操作呢:
1仅政、將函數(shù)中的數(shù)據(jù)通過(guò)返回值進(jìn)行返回
2、通過(guò)閉包函數(shù)進(jìn)行操作
返回值的操作方式比較固定單一盆驹,能作為簡(jiǎn)單數(shù)據(jù)處理的手段
但更加靈活的操作方式就是閉包函數(shù)
所謂閉包函數(shù):就是在函數(shù)中聲明另一個(gè)變量
修飾器函數(shù)就是一個(gè)閉包函數(shù)
例如:
# 閉包函數(shù)
def outer():
print("外部函數(shù)")
def inner():
print("內(nèi)部函數(shù):閉包函數(shù)")
return inner
# 調(diào)用執(zhí)行outer()函數(shù)時(shí)圆丹,得到一個(gè)函數(shù)對(duì)象的返回值
x = outer()
# 該返回值是一個(gè)函數(shù),所以也可以執(zhí)行
x()輸出結(jié)果:
3躯喇、匿名函數(shù):
匿名函數(shù)辫封,又稱lambda表達(dá)式:通過(guò)一個(gè)表達(dá)式實(shí)現(xiàn)函數(shù)功能。主要作用是簡(jiǎn)化函數(shù)操作廉丽,將簡(jiǎn)單的處理邏輯封裝在一個(gè)表達(dá)式中倦微,而省去了定義函數(shù)的復(fù)雜的操作方式
主要起到簡(jiǎn)單處理函數(shù)的功能,所以 lambda 表達(dá)式才在很多地方被稱為匿名函數(shù)
基本語(yǔ)法結(jié)構(gòu):
lambda 參數(shù)列表:運(yùn)算表達(dá)式
lambda關(guān)鍵字
參數(shù)列表:用于給表達(dá)式傳遞數(shù)據(jù)
表達(dá)式語(yǔ)句:計(jì)算表達(dá)式正压,計(jì)算結(jié)果會(huì)自動(dòng)輸出
使用注意事項(xiàng):
主要用于替代功能簡(jiǎn)單的函數(shù)欣福,提高代碼的簡(jiǎn)潔性
但是不要濫用,大量使用會(huì)造成代碼可讀性嚴(yán)重下降
示例:
# 匿名函數(shù):lambda表達(dá)式
fn = lambda x, y: x + y
# 等價(jià)于
def fn2(x, y):
return x + y
print(fn(1, 2))
print(fn2(1, 2))
輸出結(jié)果:
如有錯(cuò)誤焦履,敬請(qǐng)指出