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之有容乃大的list(1)
Sep 14 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
在windows系统中实现python3安装lxml
Mar 23 Python
Python创建xml文件示例
Mar 22 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
Python中拆分字符串的操作方法
Jul 23 Python
python实现大学人员管理系统
Oct 25 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
Python __slots__的使用方法
Nov 15 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 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开发中四种查询返回结果分析
2011/01/02 PHP
php生成excel列序号代码实例
2013/12/24 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
python实现简单flappy bird
2018/12/24 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
道德之星事迹材料
2014/05/03 职场文书
春节超市活动方案
2014/08/14 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
Mysql排序的特性详情
2021/11/01 MySQL
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技