装饰器得作用
在原函数功能不变的前提下,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器得作用就是避免了为增强函数功能,强势入侵的代码。
装饰器铺垫知识
闭包
在嵌套函数中,内层函数引用到了外层函数的自由变量,而非全局变量,就称之为闭包
柯里化
定义
- 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程,新的函数返回一个以原有第二个参数为参数的函数
- z=f(x,y)转换成z=f(x)(y)的形式
举例
将加法函数柯里化:
def add(x,y):
return x + y
柯里化转换为:
def add(x):
def _add(y):
return x+y
return _add
#这样就将原本的add(5,6)转换为add(5)(6)
高阶函数
定义
- 数学概念中,高阶函数为y=g(f(x))
- 在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数
(1). 接受一个或多个函数作为参数
(2). 输出一个函数
举例1
计数器
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-19
def counter(base):
def inc(step=1):
nonlocal base #声明非本地变量
base += step
return base
return inc
装饰器推倒公式
推倒step0需求分析
一个加法函数,想增强它的功能,能够输出被调用过以及调用的参数信息
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-19
def add(x,y):
return x + y
增加信息输出功能
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-19
def add(x,y):
print("call add,x+y")
return x + y
增强功能函数缺点
- 打印语句的耦合度太高,若有100个函数需要同样的功能,则100个函数每个都需要添加同样的代码
- 加法函数属于业务功能,而输出信息的功能,属于非业务功能代码,不该放在业务函数加法中
推导step1,功能业务分离
- 利用高阶函数进行将功能函数与业务函数进行分类
#!/bin/python3
#-*- coding: UTF-8 -*-
#created time 2018-04-19
def logger(fn):
print("Call function begin")
func = fn(10,30)
print("Call function end")
return func
def add(x,y):
return x+y
#此时将函数add作为logger的参数传入,标准的高阶函数,此时相当于
#
#
#
#
#变形如下,问题是参数是固定死的,无法自由传入
def logger(add):
print("Call function begin")
func = add(10,30) #结果为30
print("Call function end")
return func #此时将30返回,而且实现了打印
遗留问题:
此时功能函数也业务函数是已经实现分离,但是问题在于参数的传入,此时函数的参数是在函数体中是固定死的,在现实中函数参数是灵活的,不可能是一成不变的,因此需要对