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实现list反转实例汇总
Nov 11 Python
Python实现建立SSH连接的方法
Jun 03 Python
python2.7实现爬虫网页数据
May 25 Python
DRF跨域后端解决之django-cors-headers的使用
Jan 27 Python
将python文件打包成EXE应用程序的方法
May 22 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 Python
python如何输出反斜杠
Jun 18 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
Python编写万花尺图案实例
Jan 03 Python
python定义具名元组实例操作
Feb 28 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php二分法在IP地址查询中的应用
2008/08/12 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
jQuery中html()方法用法实例
2014/12/25 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
中软国际Java程序员机试题
2012/08/19 面试题
通信工程毕业生求职信
2013/11/16 职场文书
校园安全演讲稿
2014/05/09 职场文书
英文演讲稿
2014/05/15 职场文书
路政管理求职信
2014/06/18 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL