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实现猜数字游戏(无重复数字)示例分享
Mar 29 Python
在python的WEB框架Flask中使用多个配置文件的解决方法
Apr 18 Python
9种python web 程序的部署方式小结
Jun 30 Python
Python3基础之基本运算符概述
Aug 13 Python
python查找指定具有相同内容文件的方法
Jun 28 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 Python
python实现在函数中修改变量值的方法
Jul 16 Python
python3安装crypto出错及解决方法
Jul 30 Python
python实现的Iou与Giou代码
Jan 18 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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中的超全局变量
2006/10/09 PHP
PHP 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
一个php导出oracle库的php代码
2009/04/20 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
python中将字典转换成其json字符串
2014/07/16 Python
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python中的choice()方法使用详解
2015/05/15 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
python实现人脸识别代码
2017/11/08 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
python实现智能语音天气预报
2019/12/02 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
python合并多个excel文件的示例
2020/09/23 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
大学在校生求职信范文
2013/11/21 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
纪律委员竞选稿
2015/11/19 职场文书
自考生自我评价
2019/06/21 职场文书