代码之家  ›  专栏  ›  技术社区  ›  zipa

具有嵌套if奇怪语法的lambda

  •  0
  • zipa  · 技术社区  · 9 年前

    我更喜欢使用lambdas,所以我不止一次想用它来解决嵌套if语句,但使用标准语法失败了。

    但后来我尝试了这样的方法:

    lambda x: 1 if x > 100 else 2 if x > 50 else 3
    

    elif :

    def foo(x):
        if x > 100:
            return 1
        elif x > 50:
            return 2
        else:
            return 3
    

    知道为什么吗?

    5 回复  |  直到 9 年前
        1
  •  4
  •   user2285236    9 年前

    你不必使用elif。您可以使用 if else 这与lambda函数的作用相同:

    def foo(x):
        if x > 100:
            return 1
        else:
            if x > 50:
               return 2
            else:
               return 3
    
        2
  •  1
  •   Gribouillis    9 年前

    lambda x: 1 if x > 100 else (2 if x > 50 else 3)
    

    因为显式优于隐式。

    def f(a, b):
        return 1 if a else 2 if b else 3
    
    def left(a, b):
        return (1 if a else 2) if b else 3
    
    def right(a, b):
        return 1 if a else (2 if b else 3)
    
    tpl = "{:^8}{:^8}{:^6}{:^6}{:^6}"
    print(tpl.format('a', 'b', 'f', 'left', 'right'))
    for (a, b) in [(False, False),(False, True),(True, False),(True, True)]:
        print(tpl.format(repr(a), repr(b), f(a,b), left(a,b), right(a,b)))
    
    """ my output ->
    
    a       b      f    left right 
    False   False    3     3     3   
    False    True    2     2     2   
    True   False    1     3     1   
    True    True    1     1     1  
    
    """
    

    三元表达式总是给出与表达式相同的结果,其中在第一个其他表达式之后的所有内容都用括号括起来。

    当条件满足时 (x>100) (x>50) ,案例 True, False 不可能发生,所以这三个表达式给出了相同的结果。然而 显式优于隐式

        3
  •  0
  •   Amol B.    9 年前

    你实际上是在通过写作使用像elif这样的东西

    else 2 if x > 50
    

    在里面

    lambda x: 1 if x > 100 else 2 if x > 50 else 3
    

    这只是一种不同的写作方式,就像《兰姆达》中的艾利夫

        4
  •  0
  •   Unatiel    9 年前
    lambda x: 1 if x > 100 else 2 if x > 50 else 3
    

    指:

    # 1 if x > 100 
    if x > 100:
        return 1 
    # else 2 if x > 50 else 3
    else:
        # 2 if x > 50 else 3
        if x > 50:
            return 2
        else:
            return 3
    

    elif .

    否则如果 在lambda表达式中。据我所知,它应该引起一个 SyntaxError .

        5
  •  0
  •   wwii    9 年前

    你有 conditional expressions .

    2 if x > 50 else 3
    

    提供 else条款 另一个。

    1 if x > 100 else ...
    

    你有条件表达式

    x if C else y
    

    哪里

    x = 1
    C = 100
    

    y = 2 if x > 50 else 3
    

    docs , y y 可以是条件表达式。