高阶函数
9.1高阶函数
- 接收一个或多个函数作为参数
- 将函数作为返回值返回的函数
举例说明
lst1=[1,2,3,4,5,6,7,8,9]
#定义一个函数检测它是偶数
def fn2(i):
if i % 2 == 0:
return True
return False
#定义一个函数检测它是大于4的数
def fn3(i):
if i > 4:
return True
return False
#定义一个函数,将所需求的结果添加到空列表中
def fn(f,lst):
lst2 = []
for i in lst:
#判断条件
if f(i):
lst2.append(i)
return lst2
print(fn(fn2,lst1)) #这里的fn2也可以换成fn3,就看实际情况的需求是什么了
--------------------------------------------------------
[2, 4, 6, 8]
9.2匿名函数
9.2.1匿名函数 lambda函数表达式
lambda函数表达式就是专门用来创建一些简单的函数
语法:
lambda 参数列表 : 返回值
举例说明
##j简单定义一个函数,如下,其作用就是计算a+b的值
def fn(a,b):
return a + b
print(fn(1,2))
----------------
3
很简单的一个问题但是定义一个函数就很复杂,而且用的频率可能相对较少,因此使用lambda函数表达式写成如下
m = (lambda a,b : a + b)
# print((lambda a,b : a + b)(3,4))
或者
print(m(3,4))
------------------------
7
9.2.2 filter() (内置的一个高阶函数,相当于一个过滤器)
序列中的每个元素作为参数传递给函数进行判断,返回True或者False,最后将返回True的元素放到新列表中。
filter()的参数
1.传递一个函数
2.需要过滤的序列 (可迭代的)
举例说明
lst = [1,2,3,4]
def fn(i):
if i % 2 == 0:
return True
return False
print(list(filter(fn,lst)))
------------------------
[2,4]
filter(fn,lst) 是一个返回值,具体的元素看不到,因此需要放到一个新的列表中(可迭代的结构),因此打印的时候需要加上list()。
filter函数结合lambda函数可以实现如上的结果.
lst = [1,2,3,4]
a=filter(lambda i: i%2==0,lst)
print(list(a))
----------------------
[2, 4]
9.3闭包
将函数作为返回值也是高阶函数,我们也称为闭包。
9.3.1闭包的好处
- 通过闭包可以创建一些只有当前函数能够访问的变量
- 可以将一些私有数据藏到闭包中
9.3.2闭包形成的条件
1.函数嵌套。
2.将内部函数作为返回值返回。
3.内部函数必须使用到外部函数的变量。
举个例子
#求平均数
def fn1():
nums = []
# 定义一个函数来实现求平均数
def fn2(n):
nums.append(n)
return sum(nums)/len(nums)
return fn2
r= fn1()
print(r(10))
print(r(20))
------------
10.0
15.0
9.4装饰器
9.4.1装饰器的引入
为什么要引入装饰器?
我们可以通过修改函数中的代码来完成这个需求,但是会产生一些问题,什么问题呢?
1.如果要修改的函数过多,修改起来比较麻烦。
2.不方便后期的维护。
3.违反开闭原则(ocp) 程序的设计思想 要求开发对程序的扩展,要关闭对程序的修改。(个人理解为就是对已有的函数不进行修改,在新增的函数里面调用这个函数来满足新的需求。)
举例
#举例 我想打印两句话,开始,结束,并且hellow在开始结束之间。不动原函数
def fn():
print('hello')
def we():
print('开始')
fn()
print('结束')
we()
-----------------------
开始
hello
结束
9.4.2装饰器的使用
- 通过装饰器,可以在不修改原来的函数的情况下来对函数进行扩展
- 在开发中,我们都是通过装饰器来扩展函数的功能
例如 start(old)这一类函数就称为装饰器。
def start(old):
# 创建一个新的函数
def new_function(*args,**kwargs):
print('函数开始执行.....')
r = old(*args,**kwargs)
print('函数执行结束.....')
return r
# 返回函数
return new_function
@start
def a():
print('ni hao')
a()
----------------------------
函数开始执行.....
ni hao
函数执行结束.....
或者如下这样,但是没有上面看着方便。
def add(a,b):
return a + b
def start(old):
# 创建一个新的函数
def new_function(*args,**kwargs):
print('函数开始执行.....')
r = old(*args,**kwargs)
print('函数执行结束.....')
return r
# 返回函数
return new_function
f = start_end(add)
r = f(123,456)
print(r)
------------------------------------------
函数开始执行.....
函数执行结束.....
579