鱼C论坛

 找回密码
 立即注册
查看: 1518|回复: 4

[已解决]简单的python问题

[复制链接]
发表于 2023-7-28 17:29:56 | 显示全部楼层 |阅读模式

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

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

x
请解释一下为什么如下代码的结果是64?看不太懂。
代码如下:

def power(exp):
    def exp_of(base):
        return base ** exp
    return exp_of

cube = power(3)

print(cube(4))
最佳答案
2023-7-28 21:14:24
先给代码标上序号:
def power(exp):
    def exp_of(base):
        return base ** exp
    return exp_of

cube = power(3)

print(cube(4))

代码是这样运行的:

代码运行位置代码新增/更改的变量该框架中的所有变量备注
1def power(exp):power = <function power>
  • power = <function power>
6cube = power(3)
  • power = <function power>
6>2def exp_of(base):exp_of = <function power.<locals>.exp_of>
  • exp = 3
  • exp_of = <function power.<locals>.exp_of>
调用函数体
6>4return exp_of
  • exp = 3
  • exp_of = <function power.<locals>.exp_of>
返回闭包函数,退出函数体
6cube = power(3)cube = <function power.<locals>.exp_of>
  • cube = <function power.<locals>.exp_of>
  • power = <function power>
此时cube中是有exp变量的
7print(cube(4))
  • cube = <function power.<locals>.exp_of>
  • power = <function power>
7>3return base ** exp
  • base = 4
  • exp = 3
调用函数体,cube函数体内是有power函数体内的所有变量的,计算后退出函数体
7print(cube(4))
  • cube = <function power.<locals>.exp_of>
  • power = <function power>
cube(4)返回了64,输出64

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-28 17:30:05 | 显示全部楼层
这段代码涉及到Python中的闭包(closure)概念。

首先,我们定义了一个函数 power(exp) ,它接受一个参数 exp ,并返回另一个函数 exp_of(base) 。

在 exp_of(base) 函数中,我们计算 base 的 exp 次方并返回结果。

然后,我们调用 power(3) ,将3作为参数传递给 power 函数,这将返回一个新的函数,我们将其赋值给 cube 。

最后,我们调用 cube(4) ,这实际上就是调用了 exp_of(4) ,其中 base 被设定为4,而我们之前在 power(3) 中传递的 exp 为3。

所以, cube(4) 的结果是4的3次方,即4 * 4 * 4 = 64。

因此,代码的输出结果是64。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 17:30:08 | 显示全部楼层
这段代码中,函数power(exp)定义了一个内部函数exp_of(base),它返回baseexp次方。在主程序中,我们调用power(3)exp设为3,并将返回的函数对象赋给变量cube。然后,我们使用cube(4)来调用该函数并传入参数4。

因此,当执行cube(4)时,实际上是调用了内部函数exp_of(base),其中base的值为4,而exp的值为3(由于之前的power(3)调用)。所以,表达式base ** exp变成了4 ** 3,即4的3次方,结果为64。

总结:这段代码通过使用嵌套函数和闭包的方式,创建了一个计算指定次方的函数。调用power(3)并传入参数4,返回的函数对象可以计算4的3次方,最终结果为64。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 19:00:02 | 显示全部楼层
你的代码用到了闭包。你在power函数里定义了一个exp_of函数,并将它作为power函数的返回值。
cube = power(3),使得power函数的exp参数值为3,cube的值是函数exp_of。
此时,cube(4)相当于exp_of(4),那么base参数的值是4,exp参数在cube中值是3。
所以cube(4)返回值是4**3,即4的3次方64。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 21:14:24 | 显示全部楼层    本楼为最佳答案   
先给代码标上序号:
def power(exp):
    def exp_of(base):
        return base ** exp
    return exp_of

cube = power(3)

print(cube(4))

代码是这样运行的:

代码运行位置代码新增/更改的变量该框架中的所有变量备注
1def power(exp):power = <function power>
  • power = <function power>
6cube = power(3)
  • power = <function power>
6>2def exp_of(base):exp_of = <function power.<locals>.exp_of>
  • exp = 3
  • exp_of = <function power.<locals>.exp_of>
调用函数体
6>4return exp_of
  • exp = 3
  • exp_of = <function power.<locals>.exp_of>
返回闭包函数,退出函数体
6cube = power(3)cube = <function power.<locals>.exp_of>
  • cube = <function power.<locals>.exp_of>
  • power = <function power>
此时cube中是有exp变量的
7print(cube(4))
  • cube = <function power.<locals>.exp_of>
  • power = <function power>
7>3return base ** exp
  • base = 4
  • exp = 3
调用函数体,cube函数体内是有power函数体内的所有变量的,计算后退出函数体
7print(cube(4))
  • cube = <function power.<locals>.exp_of>
  • power = <function power>
cube(4)返回了64,输出64

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 07:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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