有人可以解释这个表达式的输出是什么以及它是如何生成的。我知道我可以将它放入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))
答案 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
函数(通过另一个lambda
从lambda 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
的点,将元组作为参数传递。