详解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的绘图工具matplotlib使用实例
Jul 03 Python
Python使用Scrapy爬取妹子图
May 28 Python
Python对象类型及其运算方法(详解)
Jul 05 Python
纯用NumPy实现神经网络的示例代码
Oct 24 Python
Python tkinter和exe打包的方法
Feb 05 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
快速了解Python开发环境Spyder
Jun 29 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
python 获取字典键值对的实现
Nov 12 Python
Python用SSH连接到网络设备
Feb 18 Python
python实现socket简单通信的示例代码
Apr 13 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 什么是PEAR?(第三篇)
2009/03/19 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
Javascript 学习笔记 错误处理
2009/07/30 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
浅谈Python中copy()方法的使用
2015/05/21 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
python+flask实现API的方法
2018/11/21 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
学校禁毒宣传活动总结
2015/05/08 职场文书
党小组鉴定意见
2015/06/02 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
Vue.Draggable实现交换位置
2022/04/07 Vue.js