一.高阶函数
-->分类:
1.将函数作为参数 2.将函数作为返回值
-->好处:
1.当使用函数作为参数的时候,实际是将函数代码传入到目标函数,交互性好
-->不同的函数实现不同的功能,满足不同用户需求,简单示例
求偶数
def fn1(n):
if n % 2 == 0:
return True
大于5
def fn2(n):
if n > 5:
return True
3的倍数
def fn3(n):
if n % 3 == 0:
return True
lst = [1,2,3,4,5,6,7,8,9]
def fn(fun,l): #传入函数参数
lst1 = []
for i in l:
if fun(i) : #调用函数
lst1.append(i)
return lst1
print(fn(fn3,lst)) #[3, 6, 9]
二.匿名函数
格式:filter(function,interable)
function: 函数名
interable: 可迭代对象
返回值:对象
lst = [1,2,3,4,5,6,7,8,9,10]
def fn1(n):
if n > 5:
return True
print(filter(fn1,lst))
print(list(filter(fn1,lst)))
# <filter object at 0x0000024456291CF8>
# [6, 7, 8, 9, 10]
-->由于创建的函数内容(实现功能简单),引入匿名函数
1.占用空间小,
2.只会调用一次,就会在内存中消失了
-->匿名函数lambda
格式: lambda 参数表达式;返回值
r =lambda a,b : a + b
print(r) # at 0x000002037A2EC268>
print(r(100,200)) #300
三.闭包
-->高阶函数第二种形式:将函数作为返回值
-->通过闭包创建一个只有当前函数才能返回的变量,我可以将一些私有数据放到闭包中
形成闭包的条件:
1.函数嵌套
2.内部函数使用了外部函数的变量(还包括外部函数的参数)
3.外部函数返回了内部函数
实例如下:
def num_add():
lst = []
def fn(n):
lst.append(n)
return sum(lst) /len(lst)
return fn
r = num_add()
print(r(10))
print(r(20))
lst = [ ] 无影响,不改变运行结果
lst = 7 无影响, 不改变运行结果
print(r(30))
# 10.0
# 15.0
# 20.0
四.装饰器
-->我们可以直接修改函数代码完成需求,但是会产生一些问题
1.如果修改的函数较多,修改起来麻烦
2.不方便后期维护
3.这种方式会违反OCP原则(扩展代码,但不允许修改源码)
-->例子:对f4函数扩展
def f4():
# print('我是F4')
# def f5():
# print('函数开始')
# f4()
# print('函数结束')
# f5()
# 函数开始
# 我是F4
# 函数结束
-->扩展案例
def add(a,b):
# 求任意两个数的和
# print('开始运行')
r = a + b
# print('结束运行')
return r
# v = add(109,108)
# print(v)
# 开始运行
# 结束运行
# 217
def new_add(a,b):
print('开始运行')
print('结束运行')
return add(a,b)
print(new_add(123,543))
# 开始运行
# 结束运行
# 666
-->装饰器的使用
def add(a,b):
r = a + b
return r
def f_start(old): #传入函数参数,对其进行拓展
def new_fun(*a,**b): #接收多种参数
print('开始执行')
res = old(*a,**b)
print('结束执行')
return res
return new_fun
r = f_start(add)
value = r(132,543)
print(value)
开始执行
结束执行
675
-->类似于f_start(old)函数称之为装饰器函数
对传入的old函数扩展
-->实际使用
@f_start
def say():
print('hello world')
say()
开始执行
hello world
结束执行
五.命名空间
--> locals() 获取当前作用域的命名空间
a =10 #相当于在命名空间田间key-value ( 'a' = 10)
r =locals()
print(r)
print(r['a'])
# {'__name__': '__main__',
# '__doc__': None,
# '__package__': None,
# '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000211C6E31CF8>,
# '__spec__': None, '__annotations__': {}, '__builtins__': ,
# '__file__': 'C:/untitled/001.小黑/命名空间.py', '__cached__': None, 'r': {...}}
10