我不明白foo()函数如何处理这2个lambda,这3个函数由togheter执行阶乘计算。
5/10/2020 更新:我修改了代码,以使用每个函数中的全局变量和计数器更好地了解这些lambda如何工作。
"""7. What math operation does the following perform?"""
foo_counter = 0
bar_counter = 0
baz_counter = 0
def foo(f):
global foo_counter
foo_counter += 1
print("foo = %d" % foo_counter)
return (lambda x: x(x))(lambda x: f(lambda *args: x(x)(*args)))
def bar(f):
global bar_counter
bar_counter += 1
print("bar = %d" % bar_counter)
return lambda n: (1 if n < 2 else n * f(n - 1))
def baz(n):
global baz_counter
baz_counter += 1
print("baz = %d" % baz_counter)
return foo(bar)(n)
print(baz(7))
输出:
baz = 1
foo = 1
bar = 1
bar = 2
bar = 3
bar = 4
bar = 5
bar = 6
bar = 7
5040
Process finished with exit code 0
[因此,基本上baz()
使用怪异的double()()表示法bar()
调用foo(bar)(n)
,然后正如@所说,foo()
使用2个lambda将值传递给bar()
并定义了函数f(lambda *args: x(x)(*args)))
]内部,最后调用bar()
,这是执行阶乘的函数。但是,即使我不理解其背后的逻辑,也希望有人能帮助我们理解。
让我们从语法开始。此调用foo(bar)
返回一个函数。然后使用参数7
:foo(bar)(7)
调用它。您可以将print(foo(bar)(7))
改写为
我发现这样做: