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发送SMTP邮件的教程
Apr 29 Python
一键搞定python连接mysql驱动有关问题(windows版本)
Apr 23 Python
python简单实现获取当前时间
Aug 27 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
Python实现句子翻译功能
Nov 14 Python
pandas string转dataframe的方法
Apr 11 Python
Python实现计算对象的内存大小示例
Jul 10 Python
python实现车牌识别的示例代码
Aug 05 Python
python pygame实现挡板弹球游戏
Nov 25 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
基于tensorflow权重文件的解读
May 26 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实现文件下载(支持中文文名)
2013/12/04 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Win8下python3.5.1安装教程
2020/07/29 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
社区学习十八大感想
2014/01/22 职场文书
公休请假条
2014/04/11 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
庆祝教师节标语
2014/10/09 职场文书
职工宿舍管理制度
2015/08/05 职场文书