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实现将汉字转换成汉语拼音的库
May 05 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
目前最全的python的就业方向
Jun 05 Python
Django model序列化为json的方法示例
Oct 16 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
Apr 05 Python
Python Django view 两种return的实现方式
Mar 16 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
Python如何将函数值赋给变量
Apr 28 Python
Python配置pip国内镜像源的实现
Aug 20 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
Content-type 的说明
2006/10/09 PHP
利用PHP创建动态图像
2006/10/09 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
PHP实现微信发红包程序
2015/08/24 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
jquery foreach使用示例
2013/09/12 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
React快速入门教程
2017/01/17 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
Python微信公众号开发平台
2018/01/25 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
解释一下钝化(Swap out)
2016/12/26 面试题
学校安全教育制度
2014/01/31 职场文书
客户接待方案
2014/02/26 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
vue选项卡切换的实现案例
2022/04/11 Vue.js