详解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实现周期性抓取网页内容的方法
Nov 04 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
用python处理图片之打开\显示\保存图像的方法
May 04 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
python3爬虫之设计签名小程序
Jun 19 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
Python 面向对象之封装、继承、多态操作实例分析
Nov 21 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 Python
Python如何创建装饰器时保留函数元信息
Aug 07 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
CURL状态码列表(详细)
2013/06/27 PHP
浅析php学习的路线图
2013/07/10 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
一分钟理解js闭包
2016/05/04 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
详解Python爬虫的基本写法
2016/01/08 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
Python列表切片用法示例
2017/04/19 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
如何利用Python写个坦克大战
2020/11/18 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
25道Java面试题集合
2013/05/21 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
公司年会演讲稿范文
2014/01/11 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
超市周年庆活动方案
2014/08/16 职场文书
人事主管岗位职责
2015/02/04 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
基于python实现银行管理系统
2021/04/20 Python
golang中的struct操作
2021/11/11 Golang