【问题标题】:What does [value](x) do in this lambda code?[value](x) 在这个 lambda 代码中做了什么?
【发布时间】:2021-04-25 23:57:11
【问题描述】:

这是来自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) 是做什么的?

【问题讨论】:

  • [value] 将返回与键 value 对应的值。然后(x)将调用带有参数x的lambda e表达式
  • 请不要使用这个。使用if 条件
  • @DeepSpace 为什么不呢?这对我来说似乎是一个不错的开关替代品
  • @Nullman 因为它给代码增加了噪音,并且有巨大的开销(与它实现的相比):创建一个字典,3个函数,散列value并执行其中一个函数。 ..几乎没有理由,可以通过3个elif分支来实现
  • 这是一个 dict 存储函数作为值。所以,dict['a'] 将返回一个函数,dict['a'](x) 将执行该函数

标签: python lambda switch-statement variable-assignment


【解决方案1】:

复制 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")

        

 

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2020-12-17
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多