鱼C论坛

 找回密码
 立即注册
查看: 1730|回复: 5

[已解决]python问题

[复制链接]
发表于 2023-8-2 15:54:24 | 显示全部楼层 |阅读模式

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

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

x
代码如下:
A = lambda x : (lambda y : x ** y)

print(A(3)(4))

问:
为什么x和y(即3和4)是并列关系啊?
或者说为什么不是print(3,4)
最佳答案
2023-8-2 21:34:56
本帖最后由 hellomyprogram 于 2023-8-2 21:38 编辑

lambda 表达式其实是一种函数,我们可以将你的代码拆解成这样:
def A(x):
        def B(y):
                return x ** y
        return B # 由于 lambda 函数会返回冒号后面的结果,所以返回的是 B

print(A(3)(4))

很明显, B 函数是一个闭包函数,它包含了 A 函数的所有局部变量。

在第 6 行,A(3) 返回的是 B 函数,也就可以被继续调用。

在下面将列举出调用层级:
代码位置代码备注
1def A(x):
6print(A(3)(4))先调用 A 函数
6>2def B(y):
6>4return B这里返回的是 B 函数,能够被进一步调用
6print(A(3)(4))此时这一行代码等效于 print(B(4))
6>3return x ** yB 函数调用后返回 81
6print(A(3)(4))此时这一行代码等效于 print(81) ,自然会输出 81


如果用 print(A(3, 4)),那么 A 会收到两个参数,而 A 最多只能有一个参数,所以会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-2 15:54:41 | 显示全部楼层
在这段代码中, A  是一个带有两个嵌套的 lambda 函数的组合。让我们逐步解释代码并回答你的问题:

1.  A = lambda x : (lambda y : x ** y)  创建了一个名为  A  的 lambda 函数,它接受一个参数  x ,并返回另一个 lambda 函数  (lambda y : x ** y) 。

2. 当你调用  A(3)  时,传递了参数  3  给外部的 lambda 函数。这个 lambda 函数的内部函数  y : x ** y  会“捕获”外部函数的参数  x (在这里是  3 ),并返回一个新的函数。

3. 然后,你调用内部 lambda 函数  A(3)(4) ,传递了参数  4 。这个内部 lambda 函数捕获了之前传递给外部 lambda 函数的参数  x ,也就是  3 ,以及它自己的参数  y ,也就是  4 。

现在回答你的问题:

·  x  和  y  在这里不是并列关系,而是嵌套的关系。 x  是外部 lambda 函数  A  的参数,而  y  是内部 lambda 函数  (lambda y : x ** y)  的参数。因为内部函数可以捕获外部函数的参数,所以它们可以在嵌套的情况下使用。

·  print(3, 4)  会直接输出两个并列的值,而不会进行函数的嵌套计算。在你的代码中,通过使用嵌套的 lambda 函数,你实现了对参数进行连续的数学操作,这样可以更灵活地处理不同的计算需求。

因此, A(3)(4)  的输出是 3 的 4 次方,即 81。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-8-2 15:54:45 | 显示全部楼层
关于lambda函数中x和y的关系:

在给定的代码中,lambda函数被用于创建了一个嵌套的函数。首先,我们定义了一个lambda函数A,该函数接受一个参数x,并返回另一个lambda函数。这个内部的lambda函数接受一个参数y,并返回x的y次方。

当我们调用A(3)(4)时,首先A(3)将返回一个函数,然后我们对返回的函数再次调用(4)来计算结果。这个过程实际上是一种闭包(closure)的应用,它允许内部函数引用外部函数中定义的变量。

换句话说,x和y并不是并列关系,而是通过嵌套的方式形成了一个函数闭包。x作为外层函数A的参数,传递给内层函数,成为内层函数的自由变量。y则是内层函数的参数。

这种嵌套的lambda函数能够灵活地创建可调用的函数对象,因为内层函数可以访问和使用外层函数中定义的参数和变量。这样的设计使得我们能够动态地生成和组合函数,具有一定的灵活性和表达能力。

至于为什么不是使用print(3, 4),这是因为lambda函数的目的是创建并返回一个函数对象,而不是直接输出结果。当我们需要在特定的上下文中多次使用这个函数时,lambda函数的形式可以更加简洁和方便。而print(3, 4)则是直接将两个值打印出来,不涉及函数的定义和返回。

希望这个解答能够帮助您理解lambda函数中x和y的关系以及为什么使用lambda函数来实现特定的功能。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 15:58:51 | 显示全部楼层
关于lambda函数中x和y的关系:

在给定的代码中,lambda函数被用于创建了一个嵌套的函数。首先,我们定义了一个lambda函数A,该函数接受一个参数x,并返回另一个lambda函数。这个内部的lambda函数接受一个参数y,并返回x的y次方。

当我们调用A(3)(4)时,首先A(3)将返回一个函数,然后我们对返回的函数再次调用(4)来计算结果。这个过程实际上是一种闭包(closure)的应用,它允许内部函数引用外部函数中定义的变量。

换句话说,x和y并不是并列关系,而是通过嵌套的方式形成了一个函数闭包。x作为外层函数A的参数,传递给内层函数,成为内层函数的自由变量。y则是内层函数的参数。

这种嵌套的lambda函数能够灵活地创建可调用的函数对象,因为内层函数可以访问和使用外层函数中定义的参数和变量。这样的设计使得我们能够动态地生成和组合函数,具有一定的灵活性和表达能力。

至于为什么不是使用print(3, 4),这是因为lambda函数的目的是创建并返回一个函数对象,而不是直接输出结果。当我们需要在特定的上下文中多次使用这个函数时,lambda函数的形式可以更加简洁和方便。而print(3, 4)则是直接将两个值打印出来,不涉及函数的定义和返回。

希望这个解答能够帮助您理解lambda函数中x和y的关系以及为什么使用lambda函数来实现特定的功能。如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 16:50:52 | 显示全部楼层
这种写法叫做"lambda的嵌套",是为了实现更复杂的函数功能。

在A = lambda x : (lambda y : x ** y)中,lambda x是外层函数,它接收一个参数x,然后返回一个函数,这个返回的函数是一个新的lambda函数,记作lambda y。所以,你看到的并列关系其实是函数嵌套的关系。

解析如下:

1.A = lambda x : (lambda y : x ** y) 创建了一个lambda函数 A ,这个函数接收一个参数 x 和 返回一个新的lambda函数 lambda y : x ** y(这个函数又接收一个参数y并返回x的y次方)。

2.A(3) 代表我们调用 A 函数并且传递参数 3 给 x ,所以返回的是函数 (lambda y : 3 ** y)。

3.接着我们又对这个返回的函数传递了参数 4 ,所以是 A(3)(4) ,相当于 ((lambda y : 3 ** y))(4),也就得到 3 ** 4,结果是 81。

4.print(3,4) 的意思是直接打印数字 3 和 4,而不涉及到任何函数调用,所以它的结果会是 3 4。

这种技巧在Python编程中经常被用来创建定制的函数,是一种非常有用的编程技巧

求最佳答案楼主给个最佳呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 21:34:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hellomyprogram 于 2023-8-2 21:38 编辑

lambda 表达式其实是一种函数,我们可以将你的代码拆解成这样:
def A(x):
        def B(y):
                return x ** y
        return B # 由于 lambda 函数会返回冒号后面的结果,所以返回的是 B

print(A(3)(4))

很明显, B 函数是一个闭包函数,它包含了 A 函数的所有局部变量。

在第 6 行,A(3) 返回的是 B 函数,也就可以被继续调用。

在下面将列举出调用层级:
代码位置代码备注
1def A(x):
6print(A(3)(4))先调用 A 函数
6>2def B(y):
6>4return B这里返回的是 B 函数,能够被进一步调用
6print(A(3)(4))此时这一行代码等效于 print(B(4))
6>3return x ** yB 函数调用后返回 81
6print(A(3)(4))此时这一行代码等效于 print(81) ,自然会输出 81


如果用 print(A(3, 4)),那么 A 会收到两个参数,而 A 最多只能有一个参数,所以会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 21:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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