高阶函数
高阶函数的特征:
- 接受函数作为参数
- 返回值仍然是一个函数
* `def fun1(n):
if n>50:
return True
def fun2(fun,n):
n1=[]
for i in n:
if fun(i):
n1.append([i])
return n1
import random
array=[]
for i in range(0,100):
array.append(random.randint(0,101))
print(fun2(fun1,array))`
这就是一个高阶函数,我们可以通过不断调整fun1实现fun2的不同功能。
闭包
• 将函数作为返回值也是高阶函数我们也称为闭包
闭包的好处
• 通过闭包可以创建一些只有当前函数能访问的变量
• 可以将一些私有数据藏到闭包中
行成闭包的条件
• 函数嵌套
• 将内部函数作为返回值返回
• 内部函数必须要使用到外部函数的变量
def fun(num1):
def fun1(num2):
add=num1+num2
print(add)
return fun1
fun(4)(7)
装饰器
装饰器的引入
我们可能会产生以下问题:
• 如果修改的函数多,修改起来会比较麻烦
• 不方便后期的维护
• 这样做会违反开闭原则(ocp)
• 程序的设计,要求开发对程序的扩展,要关闭对程序的修改
import time
def fun_out(fun):
def fun_in(*args,**kwargs):
start = time.clock()
r=fun(*args,**kwargs)
print(r)
end=time.clock()
print(end)
return fun_in
装饰器的使用
• 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
• 在开发中,我们都是通过装饰器来扩展函数的功能的
import time
def fun_out(fun):
def fun_in(*args,**kwargs):
start = time.clock()
r=fun(*args,**kwargs)
print(r)
end=time.clock()
print(end)
return fun_in
@fun_out
def add(n1,n2):
result=n1+n2
return result
add(7,5)
一般情况下,我们是调用那些非递归函数,但是我们可不可以调用递归函数呢?
import time
def fun_out(fun):
def fun_in(*args,**kwargs):
start = time.clock()
r=fun(*args,**kwargs)
print(r)
end=time.clock()
print(end)
return fun_in
@fun_out
def add(n1,n2):
result=n1+n2
return result
add(7,5)
@fun_out
def sum_n_numbers(n):
if n==1:
return 1
else:
return n+sum_n_numbers(n-1)
sum_n_numbers(600)
输出结果
File "G:/程序们/作业十/函数装饰器.py", line 29, in sum_n_numbers
return n+sum_n_numbers(n-1)
File "G:/程序们/作业十/函数装饰器.py", line 5, in fun_in
r=fun(*args,**kwargs)
这表明递归函数没法用装饰器直接实现,有什么办法呢?见作业。
作业
(递归函数的装饰器使用)
import time
def fun_out(fun):
def fun_in(*args,**kwargs):
start = time.clock()
r=fun(*args,**kwargs)
print(r)
end=time.clock()
print(end)
return fun_in
@fun_out
def func(n):
def sum_n_numbers(n):
if n==1:
return 1
else:
return n+sum_n_numbers(n-1)
return sum_n_numbers(n)
func(600)
@fun_out
def add(n1,n2):
result=n1+n2
return result
add(7,5)
180300
0.0006065
12
0.0006283
解决方法其实很简单,只需要将递归函数放置在一个函数内使其成为一个普通的函数,再用装饰器就可以了。