一、高阶函数
1、简介
特点:
- 接受一个或多个函数作为参数
- 将函数作为返回值返回
一般思路⬇️
# 将一个指定列表中的偶数保存到新列表中返回
l = [1,2,3,4,5,6,7,8,9,10]
def f(l):
new_l = []#新列表
for n in l:
if n % 2 == 0:
new_l.append(n)
return new_l
print(f(l))
高阶写法
l = [1,2,3,4,5,6,7,8,9,10]
def f2(i):
if i % 2 == 0:
return True
def f(func,l):#传入函数
new_l = []
for n in l:
if func(n):
new_l.append(n)
return new_l
print(f(f2,l))
2、匿名函数
list(filter(f2,l))
filter(函数,参数) # 实现相关功能
lambda函数表达式:用来创建简单的函数
语法:
lambda 参数列表:返回值
print((lambda a,b:a+b)(5,6))
或者
f = lambda a,b:a+b
print(f(4,6))
二、闭包
- 将函数作为返回值返回
- 通过闭包创建只有当前函数访问的变量
def fn():
a = 10
def fn2():
print('fff',a)
return fn2
r = fn()
r()
定义平均数函数
n2 = [] #全局,都能使用
def average(n):
n2.append(n)
return sum(n2)/len(n2)
print(average(3))
def Fun():
n2 = [] #全局,都能使用
def average(n):
n2.append(n)
return sum(n2)/len(n2)
return average
print(fun(3))
现成闭包的条件:
- 函数嵌套
- 将内部函数作为返回值返回
- 内部函数必须使用到外部函数的变量
三、装饰器
通过修改函数中代码完成修改需求
- 如果修改的函数过多,修改比较麻烦
- 不方便后期维护
- 违反开闭原则(ocp原则)要求开发对程序的扩展,关闭对程序的修改
希望在不修改原函数的前提下,对函数扩展功能
def f():
print('iam func')
def f2()
print('start....')
f()
print('end')
f2()
通用:
def f_print():
print('just for test')
def f_add(a,b):
return a+b
def add_info(old):#装饰器,不修改原函数而修改原功能
def new_func(*args,**kwargs):
print("start print...")
return_info = old(*args,**kwargs)
print("end print...")
return return_info
f = add_info(f_add)
print(f(2,6))
简便来调用装饰器
@add_info #装饰器函数
def func_X():
print(iam add_info function's son)