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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
用Python生成器实现微线程编程的教程
Apr 13 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
python网络爬虫学习笔记(1)
Apr 09 Python
Python视频爬虫实现下载头条视频功能示例
May 07 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
Python3安装pip工具的详细步骤
Oct 14 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
Python&Matlab实现灰狼优化算法的示例代码
Mar 21 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
YB217、YB235、YB400浅听
2021/03/02 无线电
Php部分常见问题总结
2006/10/09 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python脚本处理空格的方法
2016/08/08 Python
Python编写一个优美的下载器
2018/04/15 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
详解Python中的Lock和Rlock
2021/01/26 Python
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
小学生期末评语大全
2014/04/21 职场文书
承诺书范本
2015/01/21 职场文书
小学新教师个人总结
2015/02/05 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
老龙头导游词
2015/02/11 职场文书
闪闪红星观后感
2015/06/08 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS