Python的函数的一些高阶特性


Posted in Python onApril 27, 2015

高阶函数英文叫Higher-order function。什么是高阶函数?我们以实际代码为例子,一步一步深入概念。
变量可以指向函数

以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码:

>>> abs(-10)
10

但是,如果只写abs呢?

>>> abs
<built-in function abs>

可见,abs(-10)是函数调用,而abs是函数本身。

要获得函数调用结果,我们可以把结果赋值给变量:

>>> x = abs(-10)
>>> x
10

但是,如果把函数本身赋值给变量呢?

>>> f = abs
>>> f
<built-in function abs>

结论:函数本身也可以赋值给变量,即:变量可以指向函数。

如果一个变量指向了一个函数,那么,可否通过该变量来调用这个函数?用代码验证一下:

>>> f = abs
>>> f(-10)
10

成功!说明变量f现在已经指向了abs函数本身。
函数名也是变量

那么函数名是什么呢?函数名其实就是指向函数的变量!对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个可以计算绝对值的函数!

如果把abs指向其他对象,会有什么情况发生?

>>> abs = 10
>>> abs(-10)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

把abs指向10后,就无法通过abs(-10)调用该函数了!因为abs这个变量已经不指向求绝对值函数了!

当然实际代码绝对不能这么写,这里是为了说明函数名也是变量。要恢复abs函数,请重启Python交互环境。

注:由于abs函数实际上是定义在__builtin__模块中的,所以要让修改abs变量的指向在其它模块也生效,要用__builtin__.abs = 10。
传入函数

既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

一个最简单的高阶函数:

def add(x, y, f):
  return f(x) + f(y)

当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为:

x ==> -5
y ==> 6
f ==> abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11

用代码验证一下:

>>> add(-5, 6, abs)
11

编写高阶函数,就是让函数的参数能够接收别的函数。
小结

把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

Python 相关文章推荐
使用python提取html文件中的特定数据的实现代码
Mar 24 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
python 设置文件编码格式的实现方法
Dec 21 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
python读取LMDB中图像的方法
Jul 02 Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
Python调用shell命令常用方法(4种)
May 11 Python
python如何运行js语句
Sep 09 Python
Python简单进程锁代码实例
Apr 27 #Python
在Python中使用列表生成式的教程
Apr 27 #Python
讲解Python中的递归函数
Apr 27 #Python
理解Python中函数的参数
Apr 27 #Python
Python中自定义函数的教程
Apr 27 #Python
在Python中使用dict和set方法的教程
Apr 27 #Python
在Python中使用判断语句和循环的教程
Apr 25 #Python
You might like
怎样在PHP中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
PHP加密技术的简单实现
2016/09/04 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
小程序采集录音并上传到后台
2019/11/22 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
python如何进入交互模式
2020/07/06 Python
基于python实现操作git过程代码解析
2020/07/27 Python
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
2014年监理工作总结范文
2014/11/17 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang