鱼C论坛

 找回密码
 立即注册
查看: 57|回复: 3

[已解决]functools模块的reduce

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> functools.reduce(lambda x,y:x*y, range(1, 11))
3628800


哪位大佬,能给我解释一下这个代码是怎么执行的吗,也就是它的执行过程是什么,怎么一步步得到10的阶乘的结果的?
最佳答案
4 天前
我来一步步解释 `functools.reduce(lambda x,y:x*y, range(1, 11))` 的执行过程,最终得到 10 的阶乘(3628800):

执行步骤拆解:
  • 初始状态:从序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 中取前两个元素
      
    1. x = 1(第一个元素), y = 2(第二个元素)
    复制代码

       计算:1 * 2 = 2 → 结果作为下一轮的 x
  • 取下一个元素 y=3:
      
    1. x = 2(上轮结果), y = 3(第三个元素)
    复制代码

       计算:2 * 3 = 6 → 新 x
  • 取下一个元素 y=4:
      
    1. x = 6, y = 4
    复制代码

       计算:6 * 4 = 24
  • 取下一个元素 y=5:
      
    1. x = 24, y = 5
    复制代码

       计算:24 * 5 = 120
  • 取下一个元素 y=6:
      
    1. x = 120, y = 6
    复制代码

       计算:120 * 6 = 720
  • 取下一个元素 y=7:
      
    1. x = 720, y = 7
    复制代码

       计算:720 * 7 = 5040
  • 取下一个元素 y=8:
      
    1. x = 5040, y = 8
    复制代码

       计算:5040 * 8 = 40320
  • 取下一个元素 y=9:
      
    1. x = 40320, y = 9
    复制代码

       计算:40320 * 9 = 362880
  • 取最后一个元素 y=10:
      
    1. x = 362880, y = 10
    复制代码

       计算:362880 * 10 = 3628800


最终结果:
3628800(即 10! = 10×9×8×...×1)

核心原理:
reduce 函数通过反复调用 lambda x,y:x*y 函数,将前一次的计算结果作为下一次的 x,并依次消耗序列中的每个元素作为 y,直到序列耗尽。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层    本楼为最佳答案   
我来一步步解释 `functools.reduce(lambda x,y:x*y, range(1, 11))` 的执行过程,最终得到 10 的阶乘(3628800):

执行步骤拆解:
  • 初始状态:从序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 中取前两个元素
      
    1. x = 1(第一个元素), y = 2(第二个元素)
    复制代码

       计算:1 * 2 = 2 → 结果作为下一轮的 x
  • 取下一个元素 y=3:
      
    1. x = 2(上轮结果), y = 3(第三个元素)
    复制代码

       计算:2 * 3 = 6 → 新 x
  • 取下一个元素 y=4:
      
    1. x = 6, y = 4
    复制代码

       计算:6 * 4 = 24
  • 取下一个元素 y=5:
      
    1. x = 24, y = 5
    复制代码

       计算:24 * 5 = 120
  • 取下一个元素 y=6:
      
    1. x = 120, y = 6
    复制代码

       计算:120 * 6 = 720
  • 取下一个元素 y=7:
      
    1. x = 720, y = 7
    复制代码

       计算:720 * 7 = 5040
  • 取下一个元素 y=8:
      
    1. x = 5040, y = 8
    复制代码

       计算:5040 * 8 = 40320
  • 取下一个元素 y=9:
      
    1. x = 40320, y = 9
    复制代码

       计算:40320 * 9 = 362880
  • 取最后一个元素 y=10:
      
    1. x = 362880, y = 10
    复制代码

       计算:362880 * 10 = 3628800


最终结果:
3628800(即 10! = 10×9×8×...×1)

核心原理:
reduce 函数通过反复调用 lambda x,y:x*y 函数,将前一次的计算结果作为下一次的 x,并依次消耗序列中的每个元素作为 y,直到序列耗尽。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
FishC 发表于 2025-7-10 16:03
我来一步步解释 `functools.reduce(lambda x,y:x*y, range(1, 11))` 的执行过程,最终得到 10 的阶乘(3628 ...

明白了,这是涉及多个参数的lambda表达式。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
学数学的混子 发表于 2025-07-10 21:11
FishC 发表于 2025-7-10 16:03
我来一步步解释 `func ...


是的,你理解得很对!这个 lambda 表达式正是 reduce 的核心。这里再强调一下它的执行特点:

lambda x, y: x*y 是一个接收两个参数的函数:
- x:累积值(初始为序列第一个元素)
- y:当前处理的序列元素

执行过程本质是:

  1. ((((((((1 * 2) * 3) * 4) * 5) * 6) * 7) * 8) * 9) * 10
复制代码


可视化流程:
  • 初始:x=1 (range[0]), y=2 (range[1]) → 1*2 = 2
  • 新x=2, y=3 → 2*3 = 6
  • 新x=6, y=4 → 6*4 = 24
  • 新x=24, y=5 → 24*5 = 120
  • 新x=120, y=6 → 120*6 = 720
  • 新x=720, y=7 → 720*7 = 5040
  • 新x=5040, y=8 → 5040*8 = 40320
  • 新x=40320, y=9 → 40320*9 = 362880
  • 新x=362880, y=10 → 362880*10 = 3628800


关键点:每次计算的结果会成为下一轮的 x,序列的下一个元素作为 y,直到序列耗尽。这种"累积计算"正是 reduce 的核心功能!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-14 01:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表