如何生成此Python表达式的输出?

时间:2018-05-06 09:34:06

标签: python lambda

有人可以解释这个表达式的输出是什么以及它是如何生成的。我知道我可以将它放入IDLE并检查输出但我想学习如何手动完成。具体来说,我想知道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))

1 个答案:

答案 0 :(得分:2)

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

print(g(2)(f)(lambda x:x+1))
#     ^^^^

第1步:使用g致电2,将g的参数y绑定到2 ...

def g(y):  # y = 2
    return lambda x: x(y)

......给予lambda x: x(2)

print((lambda x: x(2))(f)(lambda x:x+1))
#     ^^^^^^^^^^^^^^^^^^^

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

(lambda x: x(2))  # x = f
#          ^^^^

...反过来用f ...

调用2
def f(x):  # x = 2
    return lambda y: (x, y(x))

......给予lambda y: (2, y(2))

print((lambda y: (2, y(2)))(lambda x:x+1))
#     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

(lambda y: (2, y(2))  # y = lambda x:x+1
#              ^^^^

...提供(2, (lambda x:x+1)(2)),后者又将参数lambda调用2 ...

lambda x:x+1  # x = 2

...提供3,然后将其合并到外部lambda的结果中,并提供(2, 3)

print((2, 3))
#^^^^^^^^^^^^

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