详解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中使用swapCase()方法转换大小写的教程
May 20 Python
Python实现八皇后问题示例代码
Dec 09 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
20行python代码的入门级小游戏的详解
May 05 Python
Django实现网页分页功能
Oct 31 Python
Python list与NumPy array 区分详解
Nov 06 Python
Python实现序列化及csv文件读取
Jan 19 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
关于Django Models CharField 参数说明
Mar 31 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 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
来自phpguru得Php Cache类源码
2010/04/15 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
jQuery统计上传文件大小的方法
2015/01/24 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
Python Tkinter实现简易计算器功能
2018/01/30 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
Python创建临时文件和文件夹
2020/08/05 Python
台湾家适得:Homeget
2019/02/11 全球购物
群胜软件Java笔试题
2012/09/29 面试题
销售人员个人求职信
2013/09/26 职场文书
电信专业毕业生推荐信
2013/11/18 职场文书
大一新生学期自我评价
2014/04/09 职场文书
幼儿园安全责任书
2014/04/14 职场文书
教师求职自荐书
2014/06/14 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
自我推荐信格式模板
2015/03/24 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
正规借条模板
2015/05/26 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技