博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python(七)高阶函数,匿名函数
阅读量:6382 次
发布时间:2019-06-23

本文共 1460 字,大约阅读时间需要 4 分钟。

hot3.png

1,高阶函数

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

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

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

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

133611_TIsH_1156660.png

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

举例如下:

131301_Mkqk_1156660.png

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

132024_QauY_1156660.png

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

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

什么特性?

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

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

132629_I8y1_1156660.png

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

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

2,高阶函数举例

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

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

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

134818_cAdC_1156660.png

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

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

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

193405_KHBF_1156660.png

3,匿名函数

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

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

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

194040_FmBg_1156660.png

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

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

194640_EKKb_1156660.png

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

-----------------------------------------------华丽的分割线------------------------------------------

下一步,模块!

转载于:https://my.oschina.net/u/1156660/blog/370705

你可能感兴趣的文章
linux scp远程拷贝文件及文件夹
查看>>
mysql自动创建分区
查看>>
网络通信socket连接数上限
查看>>
Solr高级查询Facet
查看>>
windows下更换pip源
查看>>
js进阶 14 jquery的ajax有哪些函数和事件(多练)
查看>>
使用 SQL Server 的 uniqueidentifier 字段类型
查看>>
VScode eslint-plugin-vue 自动修复eslint报错
查看>>
WPF中使用cefsharp
查看>>
SpringBootWEB项目和非Web项目的全局异常捕获
查看>>
Smarty之html_options使用心得
查看>>
<python数据挖掘入门与实战>代码
查看>>
让网络编程更轻松和有趣 t-io
查看>>
用 Expression Blend 创建酷炫的 Button
查看>>
码云git 使用配置
查看>>
REST风格接口测试利器Wisdom rest-client
查看>>
java多态--算法实现就是多态
查看>>
在C#中GUID生成的四种格式
查看>>
Java常见设计模式之代理模式
查看>>
jQuery对象与dom对象的转换[转]
查看>>