1. 高阶函数
- 含义:接收函数作为参数,或者将函数作为返回值的都是高阶函数
- 示例
lst = [1,2,3,4,5,6,7,8,9,10]
# 定义一个函数,用来检查偶数
def fn2(i):
if i % 2 == 0:
return True
# 定义一个函数,用来检查数字是否大于5
def fn3(i):
if i > 5:
return True
return False
def fn(func,lst):
new_list = []
for n in lst:
if func(n):
new_list.append(n)
return new_list
# 当我们使用一个函数作为参数时,实际上就是将一段代码传递到了目标函数
print(fn(fn2,lst))
[2, 4, 6, 8, 10]
2. 匿名函数
- 含义:匿名函数就是不需要显式的指定函数名
- 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
- lambda 函数表达式是专门用来创建一些简单的函数,它是函数的另一种创建方式
- 语法:lambda 参数列表: 返回值
- 示例
print((lambda a,b:a + b)(1,2))
3
3. 闭包
- 含义:在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包,简而言之, 闭包的特点就是内部函数引用了外部函数中的变量
- 闭包的好处:
- 通过闭包可以创建一些只有当前函数才能访问的变量
- 可以将一些私有数据藏到闭包中
- 形成闭包的条件:
- 函数嵌套
- 将内部函数作为返回值返回
- 内部函数必须使用到外部函数的变量
- 示例
# 求列表中元素的平均值
def make_average():
nums = []
def average(n):
nums.append(n)
return(sum(nums) / len(nums))
return average
average = make_average()
print(average(10))
nums = [] # 不会对函数产生影响
print(average(120))
10.0
65.0
4. 装饰器的引入
- 我们可以直接通过修改函数中的代码来完成一些需求,但是存在一些问题
- 如果修改的函数多,修改起来比较麻烦
- 不方便后期的维护
- 会违反开闭幕原则(ocp):程序的设计,要求开发对程序的扩展,但要关闭对程序的修改
- 装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因此就产生了装饰器,使得其满足:
- 不能修改被装饰的函数的源代码
- 不能修改被装饰的函数的调用方式
- 满足1、2的情况下给程序增添功能
5. 装饰器的使用
- 通过装饰器,可以在不修改原来函数的情况下对函数进行扩展
- 在开发中,我们都是通过装饰器来扩展函数的功能
- 示例一
def fn():
print('我是fn函数....')
def add(a,b):
r = a + b
return r
def start_end(old):
def new_function():
print('开始执行....')
result = old(*args,**kwargs)
print('执行结束....')
return result
return new_function
f = start_end(fn)
f()
f2 = start_end(add)
r = f2(123,456)
print(t)
开始执行....
我是fn函数....
执行结束....
开始执行....
执行结束....
579
- 示例二
def start_end(old):
def new_function():
print('开始执行....')
result = old(*args,**kwargs)
print('执行结束....')
return result
return new_function
@start_end
def speak():
print('同学们好好复习')
speak()
开始执行....
同学们好好复习
执行结束....