繁体   English   中英

需要解释带有 lambda 函数的 python 列表的输出

[英]Need explanation with output of a python list with lambda function

程序的输出

m = [1, 2, 3, 4, 5]
d = lambda y: (d(y[1:]) + y[:1] if y else [])
print(d(m))

是 [5, 4, 3, 2, 1]。

我可以理解print(d(m))将列表m作为参数并在 lambda 函数y = m中。 然后, y[1:] = [2, 3, 4, 5]y[:1] = [1] 但在那之后会发生什么? 谁能解释一下这个输出是怎么来的?

该函数正在使用递归反转作为输入的列表。

该算法的工作原理如下:

它采用列表的第一项并将其带到最后。 然后,剩下的部分将一遍又一遍地做同样的事情,直到它得到一个空列表。

Lambda d是一个纯函数,因此我们可以使用替换来评估表达式。 为了评估d(m) ,我们首先将dm替换为它们的值 -

d(m)
# d := lambda y: d(y[1:]) + y[:1] if y else []

(lambda y: d(y[1:]) + y[:1] if y else [])(m)
# m := [1,2,3,4,5]

然后我们将 lambda 应用于它的参数 -

(lambda y: d(y[1:]) + y[:1] if y else [])([1,2,3,4,5]) 
# y := [1,2,3,4,5]

d([1,2,3,4,5][1:]) + [1,2,3,4,5][:1] if [1,2,3,4,5] else []
d([1,2,3,4,5][1:]) + [1,2,3,4,5][:1]
d([2,3,4,5]) + [1]
# d := lambda y: d(y[1:]) + y[:1] if y else []

使用 Python 的热切评估策略,我们在应用函数之前评估所有参数。 继续这个策略,直到得到答案——

(lambda y: d(y[1:]) + y[:1] if y else [])([2,3,4,5]) + [1]
# y := [2,3,4,5]

(d([2,3,4,5][1:]) + [2,3,4,5][:1] if [2,3,4,5] else []) + [1]
(d([2,3,4,5][1:]) + [2,3,4,5][:1]) + [1]
(d([3,4,5]) + [2]) + [1]
d([3,4,5]) + [2] + [1]
# d := lambda y: d(y[1:]) + y[:1] if y else []
(lambda y: d(y[1:]) + y[:1] if y else [])([3,4,5]) + [2] + [1]
# y := [3,4,5]

(d([3,4,5][1:]) + [3,4,5][:1] if [3,4,5] else []) + [2] + [1]
(d([3,4,5][1:]) + [3,4,5][:1]) + [2] + [1]
(d([4,5]) + [3]) + [2] + [1]
d([4,5]) + [3] + [2] + [1]
# d := lambda y: d(y[1:]) + y[:1] if y else []
(lambda y: d(y[1:]) + y[:1] if y else [])([4,5]) + [3] + [2] + [1]
# y := [4,5]

(d([4,5][1:]) + [4,5][:1] if [4,5] else []) + [3] + [2] + [1]
(d([4,5][1:]) + [4,5][:1]) + [3] + [2] + [1]
(d([5]) + [4]) + [3] + [2] + [1]
d([5]) + [4] + [3] + [2] + [1]
# d := lambda y: d(y[1:]) + y[:1] if y else []
(lambda y: d(y[1:]) + y[:1] if y else [])([5]) + [4] + [3] + [2] + [1]
# y := [5]

(d([5][1:]) + [5][:1] if [5] else []) + [4] + [3] + [2] + [1]
(d([5][1:]) + [5][:1]) + [4] + [3] + [2] + [1]
(d([]) + [5]) + [4] + [3] + [2] + [1]
d([]) + [5] + [4] + [3] + [2] + [1]
# d := lambda y: d(y[1:]) + y[:1] if y else []
(lambda y: d(y[1:]) + y[:1] if y else [])([]) + [5] + [4] + [3] + [2] + [1]
# y := []

(d([][1:]) + [][:1] if [] else []) + [5] + [4] + [3] + [2] + [1]
([]) + [5] + [4] + [3] + [2] + [1]

此时达到了基本情况并且d不再扩展为具有另一个d的表达式。 我们可以开始折叠堆栈以获得最终输出 -

[] + [5] + [4] + [3] + [2] + [1]
[5] + [4] + [3] + [2] + [1]
[5,4] + [3] + [2] + [1]
[5,4,3] + [2] + [1]
[5,4,3,2] + [1]
[5,4,3,2,1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM