高阶具有两个特点,符合以下两个特点,则为高阶函数:
#定义一个函数,求奇数
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,可以达到简化代码的作用。
闭包是将函数作为返回值的高阶函数。
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函数对象:.s1 at 0x00000000030B0C80>
print(r(10,20,30,40)) # 打印结果为25.0
如果不使用装饰器,我们可以直接通过修改函数中的代码来完成需求,但是会产生以下这些问题:
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
谢谢惠顾!!!