简体   繁体   English

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

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

The output of the program程序的输出

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

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

I can understand print(d(m)) is taking list m as a parameter and in the lambda function y = m .我可以理解print(d(m))将列表m作为参数并在 lambda 函数y = m中。 Then, y[1:] = [2, 3, 4, 5] and y[:1] = [1] .然后, y[1:] = [2, 3, 4, 5]y[:1] = [1] But what is happening after that?但在那之后会发生什么? Can anyone explain how this output is coming?谁能解释一下这个输出是怎么来的?

The function is reversing the list taked as input with recursion.该函数正在使用递归反转作为输入的列表。

The algorithm works like this:该算法的工作原理如下:

It takes the first item of the list and it takes it to the end.它采用列表的第一项并将其带到最后。 Then, the part that is left, will do the same thing over and over until it gets an empty list.然后,剩下的部分将一遍又一遍地做同样的事情,直到它得到一个空列表。

Lambda d is a pure function and so we can evaluate the expression using substitution. Lambda d是一个纯函数,因此我们可以使用替换来评估表达式。 To evaluate d(m) we first start by substituting d and m for their values -为了评估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]

Then we apply the lambda to its argument -然后我们将 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 []

Using Python's eager evaluation strategy, we evaluate all arguments before applying functions.使用 Python 的热切评估策略,我们在应用函数之前评估所有参数。 Continue this strategy until the answer is reached -继续这个策略,直到得到答案——

(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]

At this point the base case is reached and d no longer expands to an expression with another d .此时达到了基本情况并且d不再扩展为具有另一个d的表达式。 We can start to collapse the stack for the final output -我们可以开始折叠堆栈以获得最终输出 -

[] + [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