当前位置: 首页 > news >正文

python内置函数map/filter/reduce详解

      在Python中,map(), filter(), 和 reduce() 是内置的高级函数(实际是class),用于处理可迭代对象(如列表、元组等)的元素。这些函数通常与lambda函数一起使用,以简洁地表达常见的操作。下面我将分别解释这三个函数。

1. map()函数

map() 函数将一个函数应用于一个或多个可迭代对象的每个元素,并返回一个迭代器,该迭代器包含函数应用于每个元素的结果。

以下是builtins.map的源码:__init__()函数可以看出需要传入一个函数func和至少一个可迭代对象。

map(function, iterable, ...)

  • function:接收一个或多个参数的函数。
  • iterable:一个或多个可迭代对象,如列表、元组、字符串等。

注意事项:

  • map() 函数返回的是一个迭代器,如果你需要一个列表或其他可迭代对象,你需要使用 list() 或其他相应的函数来转换它。
  • 当使用 map() 函数时,请确保传递给它的函数能够正确地处理可迭代对象的元素。如果函数引发异常,则 map() 将停止迭代。

示例

传入一个可迭代对象

#通过map函数 返回经过平方计算后的结果
value1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
#之前文章讲过使用list(),将可迭代对象转为列表
print(list(value1))
#结果
[1, 4, 9, 16, 25]

传入多个可迭代对象

#通过map函数 返回两个可迭代对象中每个对应位置元素的乘积平方
value2 = map(lambda x,y: x*y, [1, 2, 3, 4, 5],(2,4,6,8,10))
#之前文章讲过使用list(),将可迭代对象转为列表
print(list(value2))
#结果
[2, 8, 18, 32, 50]

但是注意传入的元素个数与lambda需要的参数个数要一致,否则会报错

比如上面的例子我们只传入一个迭代对象,程序执行后会报错

value2 = map(lambda x,y: x*y, [1, 2, 3, 4, 5])
print(list(value2))
#结果报错
TypeError: <lambda>() missing 1 required positional argument: 'y'

2. filter()

filter() 函数使用一个函数作为条件,并返回一个迭代器,该迭代器包含所有使该函数返回True的可迭代对象的元素。

以下是builtins.filter的源码:__init__()函数可以看出需要传入一个函数func和一个可迭代对象。

filter(function, iterable)

  • function:一个函数,它接受一个参数并返回一个布尔值。
  • iterable:一个可迭代对象,如列表、元组、字符串等。

示例

传入一个可迭代对象,使用lambda函数获取被2整除的数

numbers = [10, 3, 9, 8, 6]
filternumbers = filter(lambda x: x % 2 == 0, numbers)
print(list(filternumbers))
#结果
[10, 8, 6]

3. reduce()

reduce() 函数将一个二元操作符(或函数)连续地应用于一个可迭代对象的元素,从而将其减少为单个值。python3的版本reduce() 函数在Python的functools 模块中,使用时需要先导入。

reduce(function, sequence, initial=_initial_missing)

  • function:该函数接受两个参数并返回一个值。
  • sequence:一个可迭代对象,如列表、元组等。
  • initial(可选):传入该值表示操作的初始值。如果保持默认值,则使用可迭代对象的第一个元素作为初始值。

示例

1) 将可迭代对象的值相加

from functools import reducenumbers = [1, 2, 3, 4, 5]
sumnumbers = reduce(lambda x, y: x + y, numbers)
print(sumnumbers) 
# 输出: 15

当然像上面这种简单的例子,用sum(numbers)函数更简单。

2) 传入1个初始值作为第1个元素

from functools import reducenumbers = [1, 2, 3, 4, 5]
sumnumbers = reduce(lambda x, y: x + y, numbers,6)
print(sumnumbers) 
# 输出: 21

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。

相关文章:

  • VLAN高级特性
  • 吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.4-3.5
  • SpringBoot如何实现跨域?
  • meinheld-gunicorn-flask VS uvicorn-gunicorn-fastapi 性能对比测试
  • OTA在线旅行社系统架构:连接世界的科技纽带
  • 在Spring Boot项目中集成和使用MQTT
  • Qt 概述
  • 什么是SPI,和API有啥区别
  • RustGUI学习(iced/iced_aw)之扩展小部件(二十七):如何使用number_input部件?
  • 嵌入式0基础开始学习 ⅠC语言(2)运算符与表达式
  • 移动云以深度融合之服务,令“大”智慧贯穿云端
  • mysql IF语句,模糊检索
  • Python——二维字典
  • MybatisPlus中自定义sql
  • 【数据结构】二叉树的认识与实现
  • 2019年如何成为全栈工程师?
  • C# 免费离线人脸识别 2.0 Demo
  • centos安装java运行环境jdk+tomcat
  • gops —— Go 程序诊断分析工具
  • input实现文字超出省略号功能
  • IP路由与转发
  • JavaScript类型识别
  • JS数组方法汇总
  • linux安装openssl、swoole等扩展的具体步骤
  • mongodb--安装和初步使用教程
  • node入门
  • Protobuf3语言指南
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Twitter赢在开放,三年创造奇迹
  • 包装类对象
  • 关于extract.autodesk.io的一些说明
  • 开源SQL-on-Hadoop系统一览
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 《码出高效》学习笔记与书中错误记录
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​Python 3 新特性:类型注解
  • ![CDATA[ ]] 是什么东东
  • #pragma pack(1)
  • (2)STL算法之元素计数
  • (2)空速传感器
  • (MATLAB)第五章-矩阵运算
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (论文阅读30/100)Convolutional Pose Machines
  • (南京观海微电子)——COF介绍
  • (三)elasticsearch 源码之启动流程分析
  • (推荐)叮当——中文语音对话机器人
  • ***通过什么方式***网吧
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET关于 跳过SSL中遇到的问题
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • /etc/fstab和/etc/mtab的区别
  • /etc/skel 目录作用