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 相关文章推荐
Python3实现腾讯云OCR识别
Nov 27 Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 Python
pandas求两个表格不相交的集合方法
Dec 08 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
Python之变量类型和if判断方式
May 05 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
深入了解Python 变量作用域
Jul 24 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
PyQt5的QWebEngineView使用示例
Oct 20 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
JS中的三个循环小结
2017/06/20 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
python在每个字符后添加空格的实例
2018/05/07 Python
python生成密码字典的方法
2018/07/06 Python
python如何求解两数的最大公约数
2018/09/27 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
python实现从wind导入数据
2019/12/03 Python
Django用户身份验证完成示例代码
2020/04/03 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
什么是组件架构
2016/05/15 面试题
技术副厂长岗位职责
2013/12/26 职场文书
优秀教师感人事迹材料
2014/05/04 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
志愿者事迹材料
2014/12/26 职场文书
升职自荐信怎么写
2015/03/05 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python