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中str.format()详解
Mar 12 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
python getpass实现密文实例详解
Sep 24 Python
Python List列表对象内置方法实例详解
Oct 22 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
PyCharm2019 安装和配置教程详解附激活码
Jul 31 Python
如何使用Django Admin管理后台导入CSV
Nov 06 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读取数据库信息的几种方法
2008/05/24 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
javascript 单选框,多选框美化代码
2008/08/01 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
python 实现return返回多个值
2019/11/19 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
Python脚本调试工具安装过程
2021/01/11 Python
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
庆元旦活动总结
2014/07/09 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
中学总务处工作总结
2015/08/12 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers