initializer(可选):初始值。如果提供,则作为第一次调用 function 时的第一个参数,且 iterable 中的第一个元素将作为第二个参数参与计算。如果不提供,则 iterable 的第一个元素作为初始值。
使用场景
累加、累乘
求最大值/最小值
字符串拼接
将多个值合并为一个值
工作原理
无initializer:
python复制代码
reduce(f, [x1, x2, x3, x4])
取x1与x2传入f,得到result1
取result1与x3传入f,得到result2
取result2与x4传入f,得到result3
返回result
有initializer:
python复制代码
reduce(f, [x1, x2, x3], initializer=v0)
如果取v0与x1传入f,得到result1
取result1与x2传入f,得到result2
取result2与x3传入f,得到result3
返回result3
reduce函数的运用
常见试题类型
累加
例如,在古老的山谷里,小小勇者一路打开五个沉睡多年的宝箱:
第一个宝箱只有 5 枚金币,但他依旧微笑收下;
第二个宝箱闪出 10 枚金币,瞬间让他的口袋更鼓;
接着是 20 枚、15 枚......直到最后一个沉甸甸的宝箱,里面整整 50 枚金币!
他把所有金币加起来,总共收获了 100 枚金币,足够在王都买下一把新的长剑。
python复制代码
from functools import reduce
gold_coins = [5, 10, 20, 15, 50] # 每个宝箱的金币数
total_gold = reduce(lambda a, b: a + b, gold_coins)
print(total_gold)
对代码进行运行测试:
累乘
例如,决战前夕,小小勇者为自己做足了准备:
先换上一把锋利度提升 20% 的新剑;
再喝下一瓶能让力量提升 50% 的药水;
最后在战场上发出战吼,额外提升 10% 的战力。
三重加成叠加后,他的攻击力几乎翻倍,从 100 提升到 198,足以迎战巨龙。
python复制代码
from functools import reduce
multipliers = [1.2, 1.5, 1.1] # 武器加成、药水加成、战吼加成
total_multiplier = reduce(lambda a, b: a * b, multipliers)
print(total_multiplier)
对代码进行运行测试:
最大值
例如,冒险公会举办了年度挑战赛,小小勇者连续参加了五场比拼:
第一场稳扎稳打,拿下 350 分;
第二场突破自我,提升到 480 分;
第三场状态神勇,一举冲到 720 分;
后两场虽然保持高分,但仍没能超过那次的巅峰发挥。
最终,他以 720 分 的最佳成绩站上了金色领奖台。
python复制代码
from functools import reduce
battle_scores = [350, 480, 720, 610, 500]
best_score = reduce(lambda a, b: a if a > b else b, battle_scores)
print(best_score)
对代码进行运行测试:
字符串拼接
例如,那一年,勇者背上行囊,从宁静的村庄出发:
他先踏过一片笼罩在迷雾中的黑森林,
途中遇到一伙山贼,凭借机智与剑法将其击退;
最终,他看见了王都城墙上飘扬的旗帜------冒险的终点与新篇章的起点。
他的旅途被记录成:"踏出村庄 → 穿过黑森林 → 击败山贼 → 到达王都"。
python复制代码
from functools import reduce
events = ["踏出村庄", "穿过黑森林", "击败山贼", "到达王都"]
journey = reduce(lambda a, b: a + " → " + b, events)
print(journey)