python(七)高阶函数,匿名函数

时间:2021-10-04 19:02:13
摘要 此部分内容作为函数知识的扩展,重点在装饰器的理解和学习,为后续的面向对象编程打一个基础

1,高阶函数

还记得第一篇中我这么说:python中的对象不是以变量为准,而是以“字符串”为准。

那这里的“字符串”的含义可以是数字、字符串、列表、元组、集合、字典等python中所允许的任意的数据类型。

函数,可以看做是python中一种特殊的数据类型。因此我可以这么说:定义函数的过程,其实是声明了一个特殊的变量,这个变量指向了内存中的一段代码,这段代码就是我们定义的函数。

所以可以得出结论:python中函数名称也是变量。请看这个示例:

python(七)高阶函数,匿名函数

那所谓的高阶函数,其实就是为了阐明这个道理,同时还强调了一点就是,既然函数名称是变量,那么变量是可以传递到函数内部的,所以函数名也可以传递到函数内部,也就是说:一个函数是可以接受另外一个函数作为参数的。

举例如下:

python(七)高阶函数,匿名函数

那么同样的,参数可以传入就同样可以返回,就像下面这样,当调用一个函数的时候,这个函数返回另外一个函数,这样就允许你拿着返回回来的函数,做对应的操作。

python(七)高阶函数,匿名函数

对于函数中返回函数这种情况而言,其实很少会出现这种情况,除非你不想在调用“父函数”的时候就立即执行操作,而是返回一个“子函数”,当你需要的时候再通过调用“子函数”来执行对应的逻辑。

但是,由于python的这种特性。

什么特性?

在函数中,还可以定义和调用其他函数!

于是,我们的代码可以这么写:

python(七)高阶函数,匿名函数

在函数中调用函数,python会根据“就近原则”去决定到底调用那一个函数。

其实,只要你理解了:函数名也是变量。那么就应该能够想明白,为什么会优先调用函数内部的函数,为什么在函数内定义的函数不能在函数外调用。说白了,就是一个“函数名变量”作用域的问题!

2,高阶函数举例

一个常见的场景是,我们需要对列表、集合或者字典中的元素进行“过滤”。

filter 函数:接收一个函数和一个序列,它会依次把序列中的元素放到函数中,然后根据函数返回值是 True 还是 False 来决定是否保留该元素

一个案例:把一个列表中,不是素数的元素全部都过滤掉

python(七)高阶函数,匿名函数

另一个常见的场景就是排序。

sorted 函数:可以根据指定的函数,对列表,字典等进行排序。sorted 函数规定,对于两个元素 x,y ,如果 x > y 则返回1,x < y 则返回 -1,x == y 则返回 0

一个案例:对列表中的元素实现倒序排列

python(七)高阶函数,匿名函数

3,匿名函数

匿名函数,就是python中有名的“lambda”表达式。

对于这种匿名函数,它的一个限制就是函数体的代码只能有一个表达式,而且不需要写 return,改函数的返回值就是函数的调用结果。

一个简单的案例:对两个数做加法

python(七)高阶函数,匿名函数

根据案例可以确定,匿名函数采用关键字“lambda”声明,然后 “:”前面是函数的参数,后面则是运算的表达式。该“lambda”表达式返回的值是一个“function”,然后可以通过该返回值来调用这个匿名函数,当然了,你也可以直接调用,就像下面这样!

复杂的案例:求给定数 n 的阶乘

python(七)高阶函数,匿名函数

其中 reduce 是python中的另外一个 高阶函数,它的作用是把列表中的值依次作用于一个函数(当然,这里是个匿名函数),然后保存每一次作用后的结果,针对这些结果做“累积”运算!