详解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中for循环控制语句用法实例
Jun 02 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
python爬取哈尔滨天气信息
Jul 14 Python
用pycharm开发django项目示例代码
Jun 13 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
python help函数实例用法
Dec 06 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 24 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
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
优化PHP代码的53条建议
2008/03/27 PHP
php 数组的创建、调用和更新实现代码
2009/03/09 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
javascript Prototype 对象扩展
2009/05/15 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
Python中变量交换的例子
2014/08/25 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
python安装gdal的两种方法
2019/10/29 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
八项规定对照检查材料
2014/08/31 职场文书
学校开学标语
2014/10/06 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
初中生毕业评语
2014/12/29 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
Java版 简易五子棋小游戏
2022/05/04 Java/Android