详解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中几个常用的类方法
Apr 08 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
python批量修改ssh密码的实现
Aug 08 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
django中间键重定向实例方法
Nov 10 Python
python的faker库用法
Nov 28 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
python中wheel的用法整理
Jun 15 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 Python
Python3 如何开启自带http服务
May 18 Python
浅谈pytorch中的dropout的概率p
May 27 Python
浅谈Python中对象是如何被调用的
Apr 06 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
php中的数组操作函数整理
2008/08/18 PHP
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
js 事件小结 表格区别
2007/08/13 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
Python语言的12个基础知识点小结
2014/07/10 Python
在Python中使用列表生成式的教程
2015/04/27 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
Python实现非正太分布的异常值检测方式
2019/12/09 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
python中turtle库的简单使用教程
2020/11/11 Python
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
学生夜不归宿检讨书
2014/09/23 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
行政助理岗位职责
2015/02/10 职场文书
雷锋电影观后感
2015/06/10 职场文书
JavaScript函数柯里化
2021/11/07 Javascript