1.高阶函数
1.1高阶函数的特点
高阶具有两个特点,符合以下两个特点,则为高阶函数:
- 接收一个或者多个函数作为参数
- 函数作为返回值返回
1.2 高阶函数示例
#定义一个函数,求奇数
def s1(i):
if i%2 !=0:
return True
#定义一个函数求偶数
def s2(i):
if i%2 ==0:
return True
#定义一个函数找出3的倍数
def s3(i):
if i%3 ==0:
return True
list = [1,2,3,4,5,6,7,8,9,10,11,12]
def s(func,list): # 通过func调用函数做为参数,此处func也可以f,a,b,c
new_list=[]
for n in list:
if func(n): #此处使用func(n),相当于s1(n),此处func也可以f,a,b,c
new_list.append(n)
return new_list
result1 = s(s1,list) #s函数调用s1函数作为参数,注意次处s1是函数对象,不要加()
print('所有奇数为:',result1)
result2 = s(s2,list) #s函数调用s2函数作为参数
print('所有偶数为:',result2)
result3 = s(s3,list) #s函数调用s3函数作为参数
print('所有3的倍数为:',result3)
#输出结果如下:
#所有奇数为: [1, 3, 5, 7, 9, 11]
#所有偶数为: [2, 4, 6, 8, 10, 12]
#所有3的倍数为: [3, 6, 9, 12]
从上面可以看到通过在函数s里面定义func参数来传递函数s1、s2、s3,可以达到简化代码的作用。
2.闭包
2.1闭包的定义
闭包是将函数作为返回值的高阶函数。
2.2 闭包的作用
- 安全性
通过闭包可以创建只有当前函数能访问的变量可以将这些私有数据藏到闭包中。
2.3 形成的闭包的条件
- 函数嵌套
- 将内部函数作为返回值返回
- 内部函数必须要使用到外部函数的变量
2.4 闭包示例
def s():
list = []
# 定义一个函数 计算平均值
def s1(*n):
# 将n添加到列表当中
for i in n:
list.append(i)
return sum(list)/len(list) # 返回平均值
return s1 # 返回函数s1
r=s() # 将s传递的函数赋值给r
print(r) # 打印r显示是s1函数对象:<function s.<locals>.s1 at 0x00000000030B0C80>
print(r(10,20,30,40)) # 打印结果为25.0
3.装饰器
3.1使用装饰器的原因
如果不使用装饰器,我们可以直接通过修改函数中的代码来完成需求,但是会产生以下这些问题:
- 当修改的函数多时,修改起来会比较麻烦
- 不方便后期的维护
- 违反开闭原则(ocp)
程序的设计,要求开发对程序的扩展,要关闭对程序的修改
3.2 装饰器的作用
- 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
- 在开发中,我们都是通过装饰器来扩展函数的功能的
3.3 装饰器示例
def mul(a,b):
mul = a*b
print('乘积是:',mul)
return mul
def start_end(old):#通过old传递mul函数
def new_funciton(*args,**kwargs): #*args表示接收任意长度位置参数 **kwargs表示接收任意长度关键字参数
print('欢迎光临!!!')
result = old(*args,**kwargs) #通过old调用mul函数
print('谢谢惠顾!!!')
return result
return new_funciton #返回值是new_funciton函数
s=start_end(mul)
s(10,20)
#结果为:
欢迎光临!!!
乘积是: 200
谢谢惠顾!!!
#修饰器的使用方法
@start_end
def add(a,b): #定义一个函数,计算和
add = a+b
print('和是:',add)
return add
add(1,10)
#结果为:
欢迎光临!!!
和是: 11
谢谢惠顾!!!