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之间的那些事
Jan 07 Python
Python3.6简单反射操作示例
Jun 14 Python
python学生管理系统
Jan 30 Python
python处理DICOM并计算三维模型体积
Feb 26 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
May 04 Python
pygame实现非图片按钮效果
Oct 29 Python
简单了解Python读取大文件代码实例
Dec 18 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 Python
Python hashlib常见摘要算法详解
Jan 13 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
python基于selenium爬取斗鱼弹幕
Feb 20 Python
python爬取某网站原图作为壁纸
Jun 02 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
php 不同编码下的字符串长度区分
2009/09/26 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
10款实用的PHP开源工具
2015/10/23 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
js模块加载方式浅析
2017/08/12 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
使用python进行拆分大文件的方法
2018/12/10 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
后勤副校长自我鉴定
2013/10/13 职场文书
爱岗敬业演讲稿范文
2014/01/14 职场文书
幼儿园教师工作感言
2014/02/15 职场文书
党风廉政承诺书
2014/03/27 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
工作失误检讨书范文
2015/01/26 职场文书
食品药品安全责任书
2015/05/11 职场文书
Redis可视化客户端小结
2021/06/10 Redis