Python函数 - 装饰器与偏函数

一、装饰器

函数装饰器本质上是一个python函数,它可以让其他函数在不需要进行代码变动的前提下添加额外的功能(开放封闭原则),装饰器的返回值是一个函数对象。

#Authors:xiaobei
#装饰器功能定义,可以复杂化,这里只作简化。
def decor():
    print("This is a Decoration!")

##简单装饰器示例
def outer(func):
    def inner():
        decor()
        func()
    return inner
#Authors:xiaobei
# @符号将装饰器应用到函数中

@outer		#相当于func = outer(func)
def func():
    print("This is a Function!")
func()

运行结果如下:

 This is a Decoration!
 This is a Function!

简单来说,函数装饰器 = 高阶函数 + 函数嵌套 + 闭包。其中高阶函数定义:

1.函数接受参数为函数名。
2.函数返回值为函数名。
3.满足上述任一条件即为高阶函数。

它经常用于切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限检验等场景。

有了函数装饰器就抽离出大量与函数本身功能无关的雷同代码并继续使用。

二、偏函数

所谓偏函数,是指固定一个函数的一个或者多个参数,返回一个新的函数,这个新的函数用于接收剩余参数,以便于完成要求。听起来可能难以理解,通过下面的例子就可以理解:

#Authors:xiaobei

#输出十进制1010的十进制数
print(int("1010",base = 10))
#输出二进制1010的十进制数
print(int("1010",base = 2))

输出结果:

1010
10

上面的代码实现了将一字符串转换成整型数据并输出的功能,用到了int()函数,它有两个参数[str,[base]]。

但当我们有一大批数据需要将它们以二进制数逐个转换为整型数据十进制数时,每次都要传递两个参数(若是其他情况下的其他函数可能更糟糕),这时我们就需要固定其中一个参数(令base = 2,默认为10)。

用如下代码:

#Authors:xiaobei
def int2(str):
    return int(str,base = 2)

print(int2("1010"))

运行结果:

10

上述int2()就是一个偏函数,当然我们有一个更为简单点的办法来实现上述功能,引入functools模块:

#Authors:xiaobei
import functools

int2 = functools.partial(int,base = 2)	#等价于上述def int2()……
print(int2("1010"))

简言之,偏函数是简化函数调用的一种方式,主要表现为对函数参数进行部分固化,而python中借用functools.partial来完成。