Python 提供了非常多的库和内置函数。有不同的方法可以执行相同的任务,而在 Python 中使用最为频繁函数莫过于:lambda()、 map()、filter() 和 reduce() 函数,今天我将和大家一起研究学习,喜欢记得收藏、关注、点赞。

【注】代码、资料、交流文末获取

Lambda 函数简介

Lambda函数也被称为匿名(没有名称)函数,它直接接受参数的数量以及使用该参数执行的条件或操作,该参数以冒号分隔,并返回最终结果。为了在大型代码库上编写代码时执行一项小任务,或者在函数中执行一项小任务,便在正常过程中使用lambda函数。

lambda argument_list:expersion

argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的

a,b
a=1,b=2
*args
**kwargs
a,b=1,*args
空
....

expression是一个关于参数的表达式,表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。

1
None
a+b
sum(a)
1 if a >10 else 0
[i for i in range(10)]
...

普通函数和Lambda函数的区别

  1. 没有名称
    Lambda函数没有名称,而普通操作有一个合适的名称。

  2. Lambda函数没有返回值
    使用def关键字构建的普通函数返回值或序列数据类型,但在Lambda函数中返回一个完整的过程。假设我们想要检查数字是偶数还是奇数,使用lambda函数语法类似于下面的代码片段。

b = lambda x: "Even" if x%2==0 else "Odd"
b(9)
  1. 函数只在一行中
    Lambda函数只在一行中编写和创建,而在普通函数的中使用缩进

  2. 不用于代码重用
    Lambda函数不能用于代码重用,或者不能在任何其他文件中导入这个函数。相反,普通函数用于代码重用,可以在外部文件中使用。

为什么要使用Lambda函数?

一般情况下,我们不使用Lambda函数,而是将其与高阶函数一起使用。高阶函数是一种需要多个函数来完成任务的函数,或者当一个函数返回任何另一个函数时,可以选择使用Lambda函数。

什么是高阶函数?

通过一个例子来理解高阶函数。假设有一个整数列表,必须返回三个输出。

  • 一个列表中所有偶数的和

  • 一个列表中所有奇数的和

  • 一个所有能被三整除的数的和

首先假设用普通函数来处理这个问题。在这种情况下,将声明三个不同的变量来存储各个任务,并使用一个for循环处理并返回结果三个变量。该方法常规可正常运行。

现在使用Lambda函数来解决这个问题,那么可以用三个不同的Lambda函数来检查一个待检验数是否是偶数,奇数,还是能被三整除,然后在结果中加上一个数。

def return_sum(func, lst):result = 0for i in lst:#if val satisfies funcif func(i):result = result + ireturn result
lst = [11,14,21,56,78,45,29,28]
x = lambda a: a%2 == 0
y = lambda a: a%2 != 0
z = lambda a: a%3 == 0
print(return_sum(x, lst))
print(return_sum(y, lst))
print(return_sum(z, lst))

这里创建了一个高阶函数,其中将Lambda函数作为一个部分传递给普通函数。其实这种类型的代码在互联网上随处可见。然而很多人在使用Python时都会忽略这个函数,或者只是偶尔使用它,但其实这些函数真的非常方便,同时也可以节省更多的代码行。接下来我们一起看看这些高阶函数。

Python内置高阶函数

Map函数

map() 会根据提供的函数对指定序列做映射。

Map函数是一个接受两个参数的函数。第一个参数 function 以参数序列中的每一个元素调用 function 函数,第二个是任何可迭代的序列数据类型。返回包含每次 function 函数返回值的新列表。

map(function, iterable, ...)

Map函数将定义在迭代器对象中的某种类型的操作。假设我们要将数组元素进行平方运算,即将一个数组的每个元素的平方映射到另一个产生所需结果的数组。

arr = [2,4,6,8]
arr = list(map(lambda x: x*x, arr))
print(arr)

我们可以以不同的方式使用Map函数。假设有一个包含名称、地址等详细信息的字典列表,目标是生成一个包含所有名称的新列表。

students = [{"name": "John Doe","father name": "Robert Doe","Address": "123 Hall street"},{"name": "Rahul Garg","father name": "Kamal Garg","Address": "3-Upper-Street corner"},{"name": "Angela Steven","father name": "Jabob steven","Address": "Unknown"}
]
print(list(map(lambda student: student['name'], students)))
>>> ['John Doe', 'Rahul Garg', 'Angela Steven']

上述操作通常出现在从数据库或网络抓取获取数据等场景中。

Filter函数

Filter函数根据给定的特定条件过滤掉数据。即在函数中设定过滤条件,迭代元素,保留返回值为True 的元素。Map 函数对每个元素进行操作,而 filter 函数仅输出满足特定要求的元素。

假设有一个水果名称列表,任务是只输出那些名称中包含字符“g”的名称。

fruits = ['mango', 'apple', 'orange', 'cherry', 'grapes']
print(list(filter(lambda fruit: 'g' in fruit, fruits)))

filter(function or None, iterable) --> filter object

返回一个迭代器,为那些函数或项为真的可迭代项。如果函数为None,则返回为真的项。

Reduce函数

这个函数比较特别,不是 Python 的内置函数,需要通过from functools import reduce 导入。Reduce 从序列数据结构返回单个输出值,它通过应用一个给定的函数来减少元素。

reduce(function, sequence[, initial]) -> value

将包含两个参数的函数(function)累计应用于序列(sequence)的项,从左到右,从而将序列reduce至单个值。

如果存在initial,则将其放在项目之前的序列,并作为默认值时序列是空的。

假设有一个整数列表,并求得所有元素的总和。且使用reduce函数而不是使用for循环来处理此问题。

from functools import reduce
lst = [2,4,6,8,10]
print(reduce(lambda x, y: x+y, lst))
>>> 30

还可以使用 reduce 函数而不是for循环从列表中找到最大或最小的元素。

lst = [2,4,6,8]
# 找到最大元素
print(reduce(lambda x, y: x if x>y else y, lst))
# 找到最小元素
print(reduce(lambda x, y: x if x<y else y, lst))

高阶函数的替代方法

列表推导式

其实列表推导式只是一个for循环,用于添加新列表中的每一项,以从现有索引或一组元素创建一个新列表。之前使用map、filter和reduce完成的工作也可以使用列表推导式完成。然而,相比于使用Map和filter函数,很多人更喜欢使用列表推导式,也许是因为它更容易应用和记忆。

同样使用列表推导式将数组中每个元素进行平方运算,水果的例子也可以使用列表推导式来解决。

arr = [2,4,6,8]
arr = [i**2 for i in arr]
print(arr)
fruit_result = [fruit for fruit in fruits if 'g' in fruit]
print(fruit_result)

字典推导式

与列表推导式一样,使用字典推导式从现有的字典创建一个新字典。还可以从列表创建字典。

假设有一个整数列表,需要创建一个字典,其中键是列表中的每个元素,值是列表中的每个元素的平方。

lst = [2,4,6,8]
D1 = {item:item**2 for item in lst}
print(D1)
>>> {2: 4, 4: 16, 6: 36, 8: 64}
# 创建一个只包含奇数元素的字典
arr = [1,2,3,4,5,6,7,8]
D2 = {item: item**2 for item in arr if item %2 != 0}
print(D2)
>>> {1: 1, 3: 9, 5: 25, 7: 49}

一个简单应用

如何快速找到多个字典的公共键

方法一

dl = [d1, d2, d3] # d1, d2, d3为字典,目标找到所有字典的公共键
[k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]
dl = [{1:'life', 2: 'is'}, {1:'short', 3: 'i'}, {1: 'use', 4: 'python'}]
[k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]
# 1
解析
# 列表表达式遍历dl中第一个字典中的键
[k for k in dl[0]]
# [1, 2]# lambda 匿名函数判断字典中的键,即k值是否在其余字典中
list(map(lambda d: 1 in d, dl[1:]))
# [True, True]
list(map(lambda d: 2 in d, dl[1:]))
#[False, False]# 列表表达式条件为上述结果([True, True])全为True,则输出对应的k值
#1

方法二

# 利用集合(set)的交集操作
from functools import reduce
# reduce(lambda a, b: a*b, range(1,11)) # 10!
reduce(lambda a, b: a & b, map(dict.keys, dl))

写在最后

目前已经学习了Lambda函数是什么,以及Lambda函数的一些使用方法。随后又一起学习了Python中的高阶函数,以及如何在高阶函数中使用lambda函数。除此之外,还学习了高阶函数的替代方法:在列表推导式和字典推导式中执行之前操作。虽然这些方法看似简单,或者说你之前已经见到过这类方法,但你很可能很少使用它们。你可以尝试在其他更加复杂的函数中使用它们,以便使代码更加简洁。

推荐文章

  • 李宏毅《机器学习》国语课程(2022)来了

  • 有人把吴恩达老师的机器学习和深度学习做成了中文版

  • 上瘾了,最近又给公司撸了一个可视化大屏(附源码)

  • 如此优雅,4款 Python 自动数据分析神器真香啊

  • 梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学

  • 年终汇总:20份可视化大屏模板,直接套用真香(文末附源码)

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

Python 最频繁使用的4个函数:lambda、 map、filter 和 reduce相关推荐

  1. Python Map, Filter and Reduce

    所属网站分类: python基础 > 函数 作者:慧雅 原文链接: http://www.pythonheidong.com/blog/article/21/ 来源:python黑洞网 www. ...

  2. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊...

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  3. Python 函数式编程,Python中内置的高阶函数:map()、reduce()、filter()与sorted(),Python中返回函数

    函数式编程 是一种编程范式,比函数更高层次的抽象. 函数式编程将计算视为函数而非指令. 纯函数式编程:不需要变量,没有副作用,测试简单. 支持高阶函数,代码简洁. Python 支持的函数式编程 不是 ...

  4. 用python计算1~100的阶乘之和_在Python中递归函数调用举例and匿名函数lambda求1~100的和及计算阶乘举例...

    1.递归列出目录里的文件的脚本举例 列出目录中的文件可以通过下面方法:os.listdir() In [1]: import os In [4]: os.listdir('/root') Out[4] ...

  5. [转载] Python 内置函数 lambda、filter、map、reduce

    参考链接: Python lambda (匿名函数) | filter, map, reduce Python 内置了一些比较特殊且实用的函数,使用这些能使你的代码简洁而易读. 下面对 Python ...

  6. python map lambda 分割字符串_python六剑客:map()、lambda()、filter()、reduce()、推导类表、切片...

    一:map():映射 map()函数在python2和python3中是区别的 python2中的定义:映射后,返回一个列表 >>> help(map) Help on built- ...

  7. 自定义函数变量的设置(*/**),lambda匿名函数(map/filter/zip/enumerate)

    自定义函数变量的设置 一个星号 *传入元组,且这个变量为可变变量 两个星号 **后的那些参数被当做字典类型传递到函数中 带有双星号的可变参数只能出现在参数列表的最后 注意双星号是字典类型(字典形式要有 ...

  8. Python内置函数zip map filter的使用

    并行遍历zip zip会取得一个或多个序理为参数,然后返回元组的列表,将这些序列中的并排的元素配成对. L1=[1,2,3,4] L2=[5,6,7,8] L3=zip(L1,L2) print(L3 ...

  9. python基础(12)之匿名函数lambda

    lambda lambda 函数是一个小的匿名函数.一个 lambda 函数可以接受任意数量的参数,但只能有一个表达式. 语法: lambda arguments : expression 执行表达式 ...

  10. 如何用Map、Filter和Reduce替换Python For循环?

    2020-01-06 17:00:00 全文共2375字,预计学习时长7分钟 图源:Unsplash 屏幕前的你,瞅瞅看,你的代码是不是通篇都是For循环?是不是眯眼靠近屏幕才能看清自己的代码? 没错 ...

最新文章

  1. 新冠研究数据哪里找?科研工作者必看(附链接)
  2. jquery ui 自動完成對中文字搜尋Bug(firefox)
  3. linux jdk免安装配置,生产环境免安装jdk的使用方法
  4. 基于openfire源码开发插件
  5. c++ 取两个链表的交集_使用C ++程序查找两个链表的交集
  6. 李沐《动手学深度学习》中文版PDF和视频免费领!!!
  7. DEDE内容页调用栏目的SEO标题、描述、关键字的方法
  8. java多态 成员访问特点(父类引用指向子类对象)
  9. 5不能另存为dwg_5.建立数模
  10. mysql语句大全(2)
  11. Linux中的sh+source+export
  12. 悟透JavaScript--可爱与智慧并存,灵感与诙谐共生
  13. 五种常用web服务器jvm参数设置
  14. miui android mmi,小米5miui9稳定版自改官包方法
  15. 基于Linux的录像机:Neuros OSD
  16. java计算机毕业设计交通事故档案管理系统源码+数据库+lw文档+系统
  17. [JS]Tue Feb 01 2022 00:00:00 GMT+0800 (中国标准时间) 日期格式化
  18. 公司网站被黑 跳转到彩票网站的处理解决办法
  19. 【开发指南】Spring Cloud集成POI完成Excel读写操作
  20. 华为低端路由器配置脚本

热门文章

  1. Ubuntu 20.10 wine、微信、QQ安装教程
  2. ClientHeight
  3. npm install报错:npm WARN saveError ENOENT: no such file or directory, open ‘xxx‘
  4. 云计算发展和容器息息相关丨阿里云、腾讯云争相抢镜【软件网每日新闻播报│第10-25期】
  5. radius服务器连接无线网络,验证RADIUS服务器连接用测验AAA RADIUS命令
  6. [Linux基础]读书笔记-老男孩核心系统命令实战1
  7. GNS3(1.下载与安装)
  8. PTA|团体程序设计天梯赛-练习集|JAVA版
  9. Yahoo 股票数据抓取
  10. CAN分析仪 USBCAN USB转CAN CAN转换调试器接口卡使用指导