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实现身份证号码解析
Sep 01 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
10分钟用python搭建一个超好用的CMDB系统
Jul 17 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
django queryset 去重 .distinct()说明
May 19 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
Python爬虫实现自动登录、签到功能的代码
Aug 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将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
js 数组克隆方法 小结
2010/03/20 Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
实例解析Array和String方法
2016/12/14 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
python中精确输出JSON浮点数的方法
2014/04/18 Python
Python学习笔记之os模块使用总结
2014/11/03 Python
Python Socket传输文件示例
2017/01/16 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
python反转列表的三种方式解析
2019/11/08 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
宿舍使用违章电器检讨书
2014/01/12 职场文书
预备党员的自我评价
2014/03/12 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
三孔导游词
2015/02/05 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
Python面试不修改数组找出重复的数字
2022/05/20 Python