发布时间:2026/7/21 23:36:09
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/7/21 23:35:18

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

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

2026/7/19 10:46:51

用思维赚钱

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

2026/7/21 8:54:29

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

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

2026/7/21 23:32:14

栈的应用(括号匹配)

文章目录核心思想代码实现查考方式方式一:手动模拟栈的变化(考察“栈内元素”)方式二:考察“失败”的边界条件(三种失败模式)方式三:算法的时间/空间复杂度核心思想 逻辑本质:括号匹…

2026/7/21 23:32:14

Intel 13/14代酷睿电压问题解析与BIOS优化指南

1. Intel 13/14代酷睿"缩缸"事件始末2023年下半年开始,大量用户反馈搭载Intel第13代(Raptor Lake)和第14代(Raptor Lake Refresh)酷睿处理器的系统出现稳定性问题。主要表现为:高负载场景下&…

2026/7/21 23:32:14

手工焊接贴片芯片全攻略:从工具选择到实战避坑

最近在电子设计课程中,很多同学第一次接触PCB焊接,尤其是焊接STM32、51单片机这类核心芯片时,常常会遇到令人哭笑不得的状况。比如,本想焊出一个整洁的最小系统板,结果焊盘上的锡球堆得比芯片本体还大,一上…

2026/7/21 23:32:14

Android应用数据完整备份与恢复实战指南

1. APK备份恢复的核心价值每次换手机最头疼的就是应用数据迁移问题。作为Android用户,你可能遇到过这样的场景:新手机到手后,虽然应用商店能重新下载APP,但聊天记录、游戏进度、个性化设置全都消失了。传统的云备份方案往往只能保…

2026/7/21 23:27:13

树结构算法:核心价值与高频解题模板

1. 树结构刷题的核心价值在算法面试和编程竞赛中,树结构题目出现的频率仅次于数组和字符串。我完整刷完LeetCode树类题库后,发现这类题目具有独特的训练价值:它们能同时考察递归思维、边界条件处理能力,以及对空间/时间复杂度的精…

2026/7/20 6:33:00

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/21 0:08:52

华为OD机试 新系统真题 【酒店服务记录分析】

酒店服务记录分析(C++/Go/C/Js/Java/Py)题解 华为OD机试 新系统真题 华为OD上机考试 新系统真题 7月19号 100分题型 华为OD机试新系统真题目录点击查看: 华为OD机试新系统真题题库目录|机考题库 + 算法考点详解 题目内容 你是某连锁酒店的数据分析师,酒店每天都会用一串编…

2026/7/21 0:08:52

华为OD机试 新系统真题 【小明的顺风车】

小明的顺风车(C++/Go/C/Js/JAVA/Py)题解 华为OD机试新系统真题 华为OD上机考试新系统真题 7月19号 200分题型 华为OD机试新系统真题目录点击查看: 华为OD机试新系统真题题库目录|机考题库 + 算法考点详解 题目内容 小明自驾回家,为节省旅途成本,决定在网上挂出顺风车服务…

2026/7/21 20:02:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…