函数的引用赋值和参数操作
PYTHON中的函数,本身也是一个对象,常规定义函数的语法,就是将一个函数对象的引用地址赋值给函数名称的变量,通过函数名称的变量调用执行函数。
# 声明定义一个函数对象,赋值给了变量show_msg
def show_msg():
print("函数代码执行......")
# 通过变量show_msg可以直接调用执行函数对象的代码
show_msg()
如果函数就是对象,那么函数也和对象一样可以被引用赋值
# 声明定义一个函数对象,赋值给变量show_msg
def show_msg():
print("函数代码执行......")
# 函数可以赋值给一个变量
show_info = show_msg
# 同样可以通过变量show_info调用执行函数show_msg
show_info()
函数也可以被当成参数传递给其他函数执行
# 声明定义一个函数对象,展示第一类信息
def show_msg1():
print("函数代码执行,信息1......")
def show_msg2():
print("函数代码执行,信息2......")
# 定义展示处理函数
def show(message):
message()
# 执行代码,函数可以当成参数被传递
show(show_msg1) # 展示信息1
show(show_msg2) # 展示信息2
函数默认调用:偏函数
有一种函数操作,可以让函数的操作执行更加人性化的操作处理
# 引入函数工具模块中的偏函数扩展
from functools import partial
# 定义普通函数
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
# 普通函数的调用
result = calculation(12, 10, "+")
print(result)
# 通过偏函数进行处理,添加默认操作方式
calculation2 = partial(calculation, opra="+")
result = calculation2(22, 24)
print(result)
注意:
偏函数的操作在一定程度上来说就是一个语法糖,因为python中对于函数参数的处理已经有默认值的操作,完全可以替代偏函数的复杂操作:
def calculation(num1, num2, opra="+"):
pass
if __name__ == "__main__":
result = calculation(22, 24)
print(result)
功能织入:装饰器函数
软件开发原则中,有一项是OCP(Open Close Principle:开闭原则)
OCP:对软件功能的扩展开放,对软件原来代码的修改关闭
那么如果在函数中要给一个函数添加功能但是又不允许修改函数的代码,如上述计算函数calculation(),在计算前后添加日志记录,应该怎么操作?
最原始的操作方式如下:
# 目标函数
def calculation():
pass
# 操作代码
print("开始运算,日志记录......")
calculation()
print("运算结束,得到结果......")
但上述代码对于代码的复用性的提升较差。
PYTHON提供了一种新的处理方式,用于给指定的函数增加功能
# 定义装饰器函数,用于给指定的函数增加功能
def loggin(fn):
def wrapper(*args, **kwargs):
print("新增功能函数>>>>>>")
res = fn(*args, **kwargs)
print("新增功能函数<<<<<<")
return res
return wrapper
# 定义普通函数
@loggin
def calculation(num1, num2, opra):
print("目标函数执行中", num1, opra, num2)
# 普通函数的调用:目标函数调用时,已经添加了新的处理功能
calculation(12, 10, "+")
数据扩展:闭包函数
函数中的数据一般情况都是局部变量作用域,所以函数执行结束,意味着函数中的数据就会丢失,在函数外部就不能访问函数中的数据。
但是在有些情况下,我们需要在函数外部直接操作函数中的数据,用什么样的操作方式呢?
1.将函数中的数据直接通过返回值返回
2.通过闭包函数进行操作
返回值的操作方式比较单一,能作为简单数据的处理手段。
更加灵活的操作方式就是闭包函数,所谓闭包函数,就是在函数中声明另一个函数:
def outer()"
print("外部函数")
def inner():
print("内部函数:闭包函数")
return inner
# 通过执行outer()函数,得到一个函数对象的返回值
x = outer()
# 该返回值是一个函数,所以也可以执行
x()
强大功能:匿名函数
匿名函数,有很多语言都存在这样一种操作方式。
更加广为人知的名称:lambda表达式(兰木达表达式),其主要作用是简化函数操作,将简单的处理逻辑封装在一个表达式中,省去了定义函数的复杂操作方式。
基本语法结构
lambda 参数列表:运算表达式
参数列表:lambda表达式运算的数据输入
运算表达式:可以执行计算的简单代码,最终会成为该表达式的数据输出
基本操作方式:
计算三个数据的基本运算
fn = lambda x, y, z : x + y + z
等价于
def fn(x, y, z):
return x + y + z
主要起到简单处理函数的功能,所以lambda表达式才在很多地方被称为匿名函数。