![](/img/trans.png)
[英]How to search matched list in Json output using python in lambda function?
[英]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)
,我们首先将d
和m
替换为它们的值 -
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.