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去掉字符串中重复字符的方法
Feb 27 Python
python数据结构之二叉树的遍历实例
Apr 29 Python
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
python生成随机mac地址的方法
Mar 16 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
Python中qutip用法示例详解
Oct 02 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 Python
python openpyxl模块的使用详解
Feb 25 Python
python源码剖析之PyObject详解
May 18 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技术开发技巧分享
2010/03/23 PHP
php设置编码格式的方法
2013/03/05 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
学习面向对象之面向对象的基本概念:对象和其他基本要素
2010/11/30 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
python实现连接mongodb的方法
2015/05/08 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
Django Rest framework频率原理与限制
2019/07/26 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
巴西网上药房:onofre
2016/11/21 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
服装行业创业计划书范文
2014/02/05 职场文书
学生手册评语
2014/05/05 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
六查六看剖析材料
2014/10/06 职场文书
答谢词范文
2015/01/05 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang