python基础学习-入门到精通(9-高阶函数)

高阶函数

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值