详解Python高阶函数


Posted in Python onAugust 15, 2020

本文要点

1.什么是高阶函数

2.python中有哪些常用的高阶函数

什么是高阶函数?

在了解什么是高阶函数之前,我们来看几个小例子。我们都知道在 python 中一切皆对象,函数也不例外。比如求绝对值函数 abs,我们可以用一个变量 f 指向 abs 函数,那么当调用 f() 的时候可以得到和 abs() 一样的效果,这说明变量可以指向函数!

详解Python高阶函数

同理我们将 abs 指向另一个函数 abs = len,那么 abs 将不再是求绝对值的函数了,abs指向的是求长度的 len 函数。这说明函数名其实就是指向函数的变量!

详解Python高阶函数

既然变量可以指向函数,而函数的参数可以接收变量。也就是说一个函数可以接收另一个函数作为参数。下面我们来看一个DEMO。定义一个 add 函数,它接受三个参数 x, y, f,其中 x, y 是数字,f 是一个函数。

def add(x, y, f):
  return f(x) + f(y)

result = add(-12, -98, abs)
print(result)

输出结果:110

上面的 add() 函数就是一个高阶函数,其实高阶函数的概念很简单,能接收函数作参数的函数就是高阶函数。

python中常用的高阶函数

1.map()

map() 是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

例如,对于 list [1, 2, 3, 4, 5, 6, 7, 8, 9]

如果希望把 list 的每个元素都作平方,就可以用 map() 函数:

因此,我们只需要传入函数 f(x)=x * x,就可以利用 map() 函数完成这个计算:

def add(x, y, f):
  return f(x) + f(y)

result = add(-12, -98, abs)
print(result)

输出结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81]

注意:map() 函数不改变原有的 list,而是返回一个新的 list。

由于 list 包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。

2.reduce()

reduce() 函数接收的参数和 map() 类似,一个函数 f,一个 list,但行为和 map() 不同,reduce() 传入的函数 f 必须接收两个参数,reduce() 对 list 的每个元素反复调用函数 f,并返回最终结果值。

下面我们来看个 demo:

def prod(x, y):
 return x * y


print(reduce(prod, [2, 4, 5, 7, 12]))

输出结果:3360

prod() 函数接收两个参数,返回 x 和 y 的乘积

调用 reduce(prod, [2, 4, 5, 7, 12]) 时,reduce 函数将做如下计算:

先计算头两个元素prod(2, 4)结果为:8,

再把计算结果和第3个元素传给 prod(8, 5) 结果为:40,

再把计算结果和第4个元素传给 prod(40, 7) 结果为:280,

再把计算结果和第5个元素传给 prod(280, 12) 结果为:3360,

由于没有更多元素了,最终返回结果:3360

reduce() 还可以接收第 3 个可选参数,作为计算的初始值。如果把初始值设为 100,计算:

reduce(prod, [2, 4, 5, 7, 12], 100)

结果变为:336000,因为第一轮的计算是:

计算初始值和第一个元素:prod(100, 2),结果为:200。

3.filter()

filter() 又可以叫做过滤函数,它接收一个函数 f 和一个 list,这个函数 f 的作用是对每个元素进行判断,返回 True 或 False,filter() 根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新 list。

例如,要从一个 list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:

def is_odd(x):

 if x % 2 == 1:
 return x

然后用 filter() 过滤掉偶数:

print(list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17])))

结果:[1, 7, 9, 17]

利用 filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:

def is_not_empty(s):
 return s and len(s.strip()) > 0

print(list(filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])))

以上就是详解Python高阶函数的详细内容,更多关于Python高阶函数的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python strip lstrip rstrip使用方法
Sep 06 Python
从零学Python之引用和类属性的初步理解
May 15 Python
Python greenlet实现原理和使用示例
Sep 24 Python
跟老齐学Python之for循环语句
Oct 02 Python
介绍Python中的文档测试模块
Apr 28 Python
python实现将汉字转换成汉语拼音的库
May 05 Python
Python使用minidom读写xml的方法
Jun 03 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
Mar 13 Python
Python 定义只读属性的实现方式
Mar 05 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
python 爬取京东指定商品评论并进行情感分析
May 27 Python
python 19个值得学习的编程技巧
Aug 15 #Python
解析python 类方法、对象方法、静态方法
Aug 15 #Python
浅谈python锁与死锁问题
Aug 14 #Python
Python3.8安装Pygame教程步骤详解
Aug 14 #Python
Python configparser模块应用过程解析
Aug 14 #Python
PyCharm 2020.2 安装详细教程
Sep 25 #Python
Python logging模块handlers用法详解
Aug 14 #Python
You might like
深入apache host的配置详解
2013/06/09 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
params有什么用
2016/03/01 面试题
诉讼代理人授权委托书
2014/04/08 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
国防教育标语
2014/10/08 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
Mysql数据库命令大全
2021/05/26 MySQL
php实现自动生成验证码的实例讲解
2021/11/17 PHP