[value](x) 在此 lambda 代码中做了什么?

What does [value](x) do in this lambda code?

这是 this question 中的一段代码,它是 Python 中 switch 语句的替代方法。

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}[value](x)

我是 Python 的新手,我不明白它在做什么。所以我知道第一部分是变量赋值 - 但是 [value](x) 做什么?

大括号{}之间定义了一个字典,关键字为'a'、'b'和'c'。这些键的值是 lambda,它们是匿名函数(没有名称的函数)。每个 lambda 定义 x 到 x 函数的映射,具有三种不同的映射,每个键一个。

'[value]' 在字典中查找值。所以如果 value = 'b',它会 return lambda x: x + 7。这个 x 与 (x) 中的 x 无关。例如,lambda 可以定义为 lambda y: y + 7。

'(x)' 然后将该 lambda 应用于 x 的任何值。

所以如果 value = 'b' 且 x = 8,上面的表达式将给出 15 作为答案。

复制 switch 语句的方式很复杂。一种更简洁的方法是定义一个辅助函数,让您可以更直接地表达正在发生的事情:

def switch(v):yield lambda *c: v in c

你可以像这样使用它来获得等效的结果:

for case in switch(value):
    if   case('a'): result = x + 5
    elif case('b'): result = x + 7
    elif case('c'): result = x - 2

这是一个非常简单的例子,只是让代码更清晰。当您在每种情况下都有更复杂或不同的事情要做时,这种切换模式就会变得更有价值。您还可以以更像 C 的风格使用它:

for case in switch(letter):

    if case('a','A'): 
        y = complexCalculation(12,4) 
        result = y + 5
        print(y)
        break

    if case('b','c','d'): 
        z = factorial(y) **2 
        result = z + 5
        print(z)
        break

else: # otherwise (all other cases)
    print("invalid value provided")