Python函数:reduce()函数累积计算全掌握

发布时间:2026/9/14 0:00:00

Python函数:reduce()函数累积计算全掌握 Python函数reduce()函数累积计算全掌握一、开篇从逐个处理到累积计算map()对序列中的每个元素应用同一个操作filter()从序列中筛选出符合条件的元素。而reduce()的思路完全不同——它将序列中的元素两两聚合最终累积成一个结果。⌨️ 用一个简单例子理解reduce的思维fromfunctoolsimportreduce# 问题计算 [1, 2, 3, 4, 5] 的累加和numbers[1,2,3,4,5]# reduce的累积过程# 第1步1 2 3# 第2步3 3 6# 第3步6 4 10# 第4步10 5 15# 结果15resultreduce(lambdaa,b:ab,numbers)print(result)# 15# 等价于# ((((1 2) 3) 4) 5) 15reduce()像一个滚雪球的过程——从第一个元素开始依次将累积结果与下一个元素进行计算最终得到一个汇总值。二、reduce()的基本用法2.1 语法和工作原理fromfunctoolsimportreduce# reduce(function, iterable[, initializer])# function: 二元函数接收两个参数(累积值, 下一个元素)返回新的累积值# iterable: 可迭代对象# initializer: 可选初始累积值# 工作原理图解# 没有initializer时# 累积值 第一个元素# for 每个剩余元素:# 累积值 function(累积值, 当前元素)# return 累积值# 有initializer时# 累积值 initializer# for 每个元素:# 累积值 function(累积值, 当前元素)# return 累积值# ⌨️ 逐步查看reduce的过程numbers[1,2,3,4,5]defadd_and_show(a,b):加法并显示中间过程resultabprint(f{a}{b}{result})returnresultprint(reduce过程)totalreduce(add_and_show,numbers)print(f最终结果:{total})# 输出# reduce过程# 1 2 3# 3 3 6# 6 4 10# 10 5 15# 最终结果: 152.2 initializer初始值的作用# initializer可以改变reduce的行为numbers[1,2,3,4,5]# 没有initializer——从第一个元素开始result1reduce(lambdaa,b:ab,numbers)print(result1)# 15# 有initializer0——从0开始result2reduce(lambdaa,b:ab,numbers,0)print(result2)# 15结果相同# 有initializer10——从10开始result3reduce(lambdaa,b:ab,numbers,10)print(result3)# 25 10 (12345)# ⚠️ initializer很关键空序列的情况empty_list[]# 没有initializer——报错# reduce(lambda a, b: a b, empty_list)# TypeError: reduce() of empty iterable with no initial value# 有initializer——安全返回result4reduce(lambdaa,b:ab,empty_list,0)print(result4)# 0# 始终提供initializer是个好习惯——让代码更安全三、reduce()的经典应用3.1 聚合计算fromfunctoolsimportreduceimportoperator numbers[1,2,3,4,5]# 累加求和totalreduce(operator.add,numbers)print(f求和:{total})# 15# 累乘求积productreduce(operator.mul,numbers)print(f求积:{product})# 1205的阶乘# 找最大值maximumreduce(lambdaa,b:aifabelseb,numbers)print(f最大值:{maximum})# 5# 找最小值minimumreduce(lambdaa,b:aifabelseb,numbers)print(f最小值:{minimum})# 1# 字符串拼接words[Python,是,一门,优雅的,语言]sentencereduce(lambdaa,b:ab,words)print(sentence)# Python是一门优雅的语言# 使用空格分隔的拼接sentence2reduce(lambdaa,b:f{a}{b},words)print(sentence2)# Python 是 一门 优雅的 语言3.2 实现阶乘和其他数学运算fromfunctoolsimportreduceimportoperator# 阶乘 n! 1 × 2 × 3 × ... × ndeffactorial(n):计算n的阶乘ifn0:raiseValueError(阶乘只对非负整数定义)ifn0:return1returnreduce(operator.mul,range(1,n1))forninrange(11):print(f{n}! {factorial(n)})# 0! 1# 1! 1# 2! 2# ...# 10! 3628800# 最大公约数GCDimportmathdefgcd_of_list(numbers):计算列表中所有数的最大公约数ifnotnumbers:raiseValueError(列表不能为空)returnreduce(math.gcd,numbers)print(gcd_of_list([48,64,96]))# 16print(gcd_of_list([100,75,25]))# 25print(gcd_of_list([17,31]))# 1互质# 最小公倍数LCMdeflcm_of_list(numbers):计算列表中所有数的最小公倍数ifnotnumbers:raiseValueError(列表不能为空)returnreduce(math.lcm,numbers)# Python 3.9print(lcm_of_list([4,6,8]))# 243.3 用reduce()实现map()和filter()fromfunctoolsimportreduce# reduce可以模拟mapdefmy_map(func,iterable):用reduce实现mapreturnreduce(lambdaacc,item:acc[func(item)],iterable,[]# 初始值空列表)resultmy_map(lambdax:x**2,[1,2,3,4,5])print(result)# [1, 4, 9, 16, 25]# reduce可以模拟filterdefmy_filter(func,iterable):用reduce实现filterreturnreduce(lambdaacc,item:acc[item]iffunc(item)elseacc,iterable,[])resultmy_filter(lambdax:x%20,range(1,11))print(result)# [2, 4, 6, 8, 10]# ⚠️ 但实际开发中不要这样用——直接用map()和filter()或列表推导式# 这只是用来帮助理解reduce的能力四、reduce()的高级应用4.1 管道/流水线处理fromfunctoolsimportreduce# 定义一系列数据处理函数defremove_none(data):移除None值return[xforxindataifxisnotNone]defconvert_to_int(data):转为整数return[int(x)forxindata]deffilter_positive(data):只保留正数return[xforxindataifx0]defmultiply_by(data,factor):乘以因子return[x*factorforxindata]# 用reduce链式应用这些处理pipeline[remove_none,convert_to_int,filter_positive,lambdadata:multiply_by(data,2),]raw_data[1,None,3,-2,5,None,0,8]resultreduce(lambdadata,step:step(data),pipeline,raw_data)print(result)# [2, 6, 10, 16]# 解释data经过pipeline的每一层转换# raw_data [1, None, 3, -2, 5, None, 0, 8]# → remove_none: [1, 3, -2, 5, 0, 8]# → convert_to_int: [1, 3, -2, 5, 0, 8]# → filter_positive: [1, 3, 5, 8]# → multiply_by(×2): [2, 6, 10, 16]4.2 深度合并字典fromfunctoolsimportreduce# 合并多个字典后面的覆盖前面的dicts[{host:localhost,port:8080},{port:9090,debug:True},# port覆盖前面的{timeout:30,retries:3},]mergedreduce(lambdaa,b:{**a,**b},dicts)print(merged)# {host: localhost, port: 9090, debug: True, timeout: 30, retries: 3}# 深度合并嵌套字典也合并configs[{database:{host:localhost,port:5432},debug:False},{database:{port:5433,name:mydb},cache:True},{debug:True,timeout:30},]defdeep_merge(a,b):深度合并两个字典resultdict(a)forkey,valueinb.items():ifkeyinresultandisinstance(result[key],dict)andisinstance(value,dict):result[key]deep_merge(result[key],value)else:result[key]valuereturnresult final_configreduce(deep_merge,configs,{})print(final_config)# {database: {host: localhost, port: 5433, name: mydb},# debug: True, cache: True, timeout: 30}五、reduce() vs 其他方式fromfunctoolsimportreduceimportoperator# reduce vs 内置函数能用内置就用内置numbers[1,2,3,4,5]# reduce求和total1reduce(operator.add,numbers)# 15# 内置sum()求和——更好total2sum(numbers)# 15# reduce求积product1reduce(operator.mul,numbers)# 120# Python 3.8 math.prod()——更好importmath product2math.prod(numbers)# 120# reduce找最值max1reduce(lambdaa,b:aifabelseb,numbers)# 5max2max(numbers)# 5 —— 更好# reduce拼接字符串words[a,b,c]concat1reduce(lambdaa,b:ab,words)# abcconcat2.join(words)# abc —— 更好# 经验法则# - 有内置函数 → 用内置函数# - 简单聚合 → 用内置函数或for循环# - 复杂聚合逻辑 → reduce()# - reduce让代码变难读 → 用for循环重写六、总结reduce()是函数式编程三件套中最后一个。它不像map()和filter()那么常用但在需要累积计算的场景中它比其他方式更自然。核心要点reduce(func, iterable, [initial])将序列累积为单个值始终提供initializer——避免空序列报错能用内置函数就用内置——sum()、max()、math.prod()比reduce更清晰也更高效reduce模拟map/filter仅作学习用途——实际不要用管道处理是reduce的亮点场景——在函数式数据流中非常有用✅reduce的精髓当你需要把一组数据折叠成一个结果时想到它。
延伸阅读

更多相关文章

2026/9/13 3:29:04

Airflow任务级补跑:精准可控的生产级数据修复实践

1. 项目概述:为什么“任务级补跑”比“DAG级补跑”更精准、更安全 在Airflow生产环境中,我见过太多团队把 catchupTrue 当成万能开关——DAG上线就开,调度一出问题就重启补跑,结果半夜收到告警:数据库连接池被打爆、…

2026/9/11 16:12:13

用思维赚钱

一、赚钱,和学历有关系,也没有关系,非必然 我的母亲,是个地地道道的农民,大约读过半年书,也就是小学一年级只读了约莫一个学期,那时家里穷、小孩子生得多,她在家里中孩子排行老二&am…

2026/9/13 8:57:38

九大网盘直链下载神器:LinkSwift让你的下载效率提升300%

九大网盘直链下载神器:LinkSwift让你的下载效率提升300% 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…

2026/9/13 23:58:22

python全栈考试作业 2017-03-30

2017年3月31日1、执行 脚本的两种方式(1)指令行加上文件, 名为hello.py, 通过运用全局变量来阐释这个脚本, 默认输入值是2, 要是有输入的话, 输入值则变为3。(2)下达指令, 于命令行输入“./”加上文件, 文件为“vim hello.py”, 此步骤是默认头部指定“#!/usr/bin/env”, 接着要…

2026/9/13 23:58:22

企业AI框架选Java还是Python

针对企业开展AI开发来说, 首先碰到的技术选型环节里那个绕不过去的问题便是, 是选用Java, 还是别的什么。此问题于小型企业或许并非难题, 因为其生态多样、容易上手且社区资源颇丰来着。然而在具备一定规模的Java企业当中,这可是个实实在在的工程问题。该Java领域的AI生态的确是…

2026/9/13 23:58:22

屠龙少年终成恶龙,前端转产品的我给前端挖了个坑

从前端转向产品大概三周左右, 借由《我转产品了 - 前端转产品是种怎样的体验》这篇文章, 将自身的一些感受分享给大家, 评论区突然出现好多厉害的人。因较为忙碌, 不知不觉间似乎一下子又过去了一个多月, 此次趁着周末没开成会议, 给大家讲讲最近的“有意思但又很奇特的事”。当…

2026/9/13 23:53:22

Python 中的布尔类型(bool):深入解析与高效使用

中的布尔类型(bool):深入解析与高效使用对于布尔类型(bool)而言, 它是一种基础的数据类型, 存在于特定范畴的编程环境里, 表示一种逻辑意义的真和假。布尔这个值, 在多个编程场景当中有着广泛的应用, 比如条件判断的相…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/13 11:18:28

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码