1.高阶函数
1.1高阶函数简介和特点
- 接受函数作为参数,或者将函数作为返回值的函数就是高阶函数(当我们使用一个函数作为参数的时候,实际上是将指定的代码传递到了目标函数)
- 高阶函数有2个特点,符合任意一个特点,这个函数就是高阶函数
1.接受一个或多个函数作为参数
2.将函数作为返回值返回
# 可以指定一个列表中的所有的偶数,保存到一个新的列表
lst = [1,2,3,4,5,6,7,8,9,10]
def fn1(i):
if i % 2== 0:
return True
return False
def fn(func,l):
new_lst=[]
for n in l:
# 判断n的奇偶
if funca(n):
new_lst.append(n)
return new_lst
print(fn(fn1,lst))
输出结果:
[2, 4, 6, 8, 10]
1.2匿名函数
- 匿名函数 lambda表达式
- lambda函数表达式是专门用来创建一些简单的函数,它也是函数的另一种创建方式
- 语法:
labdma 参数列表 : 返回值
注意:
匿名函数最大好处是:它只会用一次,用完就会从内存消失
# filter() 就是一个高阶函数 它需要将别的函数作为参数来传递
# 可以将我们的可迭代对象进行一个过滤
# 返回值 可迭代的对象
lst = [1,2,3,4,5,6,7,8,9,10]
def fn4(i):
if i % 3 == 0:
return True
return False
# filter(fn4,lst) 等价于 filter(lambda i : i % 3 == 0,lst)
print(filter(fn4,lst))
r = filter(lambda i : i % 3 != 0,lst)
print(r)
print(list(r))
输出结果:
<filter object at 0x7fe245a15430>
<filter object at 0x7fe2459a0370>
[3, 6, 9]
********************************************
# 将匿名函数赋值个一个变量
fn6 = (lambda a,b : a + b)(10,50)
print(fn6)
fn8=(lambda i : i % 3 == 0)(4)
print(fn8)
输出结果:
60
False
2.闭包
- 将函数作为返回值也是高阶函数我们也称为闭包
- 闭包的好处
1.通过闭包可以创建一些只有当前函数能访问的变量
2.可以将一些私有数据藏到闭包中
- 形成闭包的条件
1.函数嵌套
2.将内部函数作为返回值返回
3.内部函数必须要使用到外部函数的变量
def make_average():
nums = []
def fn1(n):
nums.append(n)
return sum(nums)/len(nums)
return fn1
mff= make_average()
print(mff(10))
print(mff(20))
输出结果:
10.0
15.0
3.装饰器的引入
- 我们可以直接通过修改函数中的代码来完成需求,但是会产生以下一些问题
1.如果修改的函数多,修改起来会比较麻烦
2.不方便后期的维护
3.这样做会违反开闭原则.(OCP原则)
程序的设计,要求开发过程的扩展,要关闭对程序的修改
#我希望扩展add函数的,但是要求不能修改原函数的情况下对它进行扩展
def add(a,b):
r = a + b
return r
def new_add():
print('函数开始执行')
r= add(1,2)
print('函数执行结束')
return r
s = new_add()
print(s)
输出结果:
函数开始执行
函数执行结束
3
4.装饰器的使用
- 通过装饰器,可以在不修改原来函数的情况下对函数进行扩展
- 在开发中,我们都是通过装饰器来扩展函数的功能的
#定义一个函数,就是对其他函数进行扩展,扩展功能:一个是打印函数开始执行;一个打印函数执行结束
def stard_add(old):
def neww_function(*args,**kwargs):
print('函数开始执行')
r= old(*args,**kwargs)
print('函数执行结束')
return r
return neww_function
#像类似于stard_add(old)这种函数我们就称之为装饰器
@stard_add
def spe():
print('方法')
spe()
@stard_add
def add(a,b):
print( a+b)
add(2,4)
输出结果:
函数开始执行
方法
函数执行结束
函数开始执行
6
函数执行结束
网友评论