这个Python表达式的输出是如何生成的?

这个Python表达式的输出是如何生成的?,python,lambda,Python,Lambda,有人能解释一下这个表达式的输出是什么以及它是如何生成的吗。我知道我可以将其置于空闲状态并检查输出,但我想学习如何手动执行。具体来说,我想知道print语句是如何一步一步执行的 def f(x): return lambda y: (x, y(x)) def g(y): return lambda x: x(y) print(g(2)(f)(lambda x:x+1)) 这都是纯功能代码(除了打印本身),因此我们可以使用替换来可视化正在发生的事情: print(g(2)(f)(l

有人能解释一下这个表达式的输出是什么以及它是如何生成的吗。我知道我可以将其置于空闲状态并检查输出,但我想学习如何手动执行。具体来说,我想知道print语句是如何一步一步执行的

def f(x):
    return lambda y: (x, y(x))
def g(y):
    return lambda x: x(y)
print(g(2)(f)(lambda x:x+1))

这都是纯功能代码(除了打印本身),因此我们可以使用替换来可视化正在发生的事情:

print(g(2)(f)(lambda x:x+1))
#     ^^^^
步骤1:使用
2
调用
g
,将
g
的参数
y
绑定到
2

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。给出λx:x(2)

步骤2:使用
f
调用
lambda
函数(从
g
返回)

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。依次调用
f
2

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。给出λy:(2,y(2)):

步骤3:使用
lambda x:x+1
调用
lambda
函数(从
f
通过另一个
lambda
返回)

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。给出
(2,(lambda x:x+1)(2))
,这反过来调用带有
2
的参数
lambda
函数

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。给出
3
,然后将其合并到外部
lambda
的结果中,给出
(2,3)


这是调用
print
的最后一个点,将元组作为参数传递。

这都是纯功能代码(除了
print
本身),因此我们可以使用替换来可视化正在发生的事情:

print(g(2)(f)(lambda x:x+1))
#     ^^^^
步骤1:使用
2
调用
g
,将
g
的参数
y
绑定到
2

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。给出λx:x(2)

步骤2:使用
f
调用
lambda
函数(从
g
返回)

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。依次调用
f
2

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。给出λy:(2,y(2)):

步骤3:使用
lambda x:x+1
调用
lambda
函数(从
f
通过另一个
lambda
返回)

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。给出
(2,(lambda x:x+1)(2))
,这反过来调用带有
2
的参数
lambda
函数

def g(y):  # y = 2
    return lambda x: x(y)
(lambda x: x(2))  # x = f
#          ^^^^
def f(x):  # x = 2
    return lambda y: (x, y(x))
(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^
lambda x:x+1  # x = 2
。。。给出
3
,然后将其合并到外部
lambda
的结果中,给出
(2,3)

这是调用
print
的最后一个点,将元组作为参数传递