【问题标题】:Putting an if-elif-else statement on one line?将 if-elif-else 语句放在一行上?
【发布时间】:2012-12-11 08:12:37
【问题描述】:

我已阅读下面的链接,但它没有解决我的问题。
Does Python have a ternary conditional operator?(问题是将 if-else 语句压缩为一行)

是否有更简单的方法来编写 if-elif-else 语句以使其适合一行?
例如,

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

或者一个真实的例子:

if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

我只是觉得如果上面的例子可以这样写,它看起来会更简洁。

x=2 if i>100 elif i<100 1 else 0 [WRONG]

【问题讨论】:

    标签: python if-statement syntax


    【解决方案1】:

    不,这是不可能的(至少不是任意陈述),也不是可取的。将所有内容放在一行很可能违反PEP-8,其中规定行的长度不得超过 80 个字符。

    这也违背了 Python 的禅宗:“可读性很重要”。 (在 Python 提示符下键入 import this 以阅读全文)。

    可以在 Python 中使用三元表达式,但只能用于表达式,不能用于语句:

    >>> a = "Hello" if foo() else "Goodbye"
    

    编辑:

    您修改后的问题现在表明,除了分配的值之外,这三个语句是相同的。在这种情况下,链式三元运算符确实有效,但我仍然认为它的可读性较差:

    >>> i=100
    >>> a = 1 if i<100 else 2 if i>100 else 0
    >>> a
    0
    >>> i=101
    >>> a = 1 if i<100 else 2 if i>100 else 0
    >>> a
    2
    >>> i=99
    >>> a = 1 if i<100 else 2 if i>100 else 0
    >>> a
    1
    

    【讨论】:

    • 为什么第二个表达式没有返回 0? i 大于 100
    • @AstralWolf:非常感谢!这完美地说明了我试图提出的观点 - 链式三元表达式是可能的,但可读性较差,显然容易误解。
    • 如果你需要它更具可读性,你可以在它周围加上括号,像这样:a = 1 if i &lt; 100 else (2 if i &gt; 100 else 0)(未经测试,但我认为它应该可以工作)
    • @TimPietzcker 您如何描述表达式和语句之间的区别?
    【解决方案2】:

    如果您只需要针对不同情况使用不同的表达式,那么这可能对您有用:

    expr1 if condition1 else expr2 if condition2 else expr
    

    例如:

    a = "neg" if b<0 else "pos" if b>0 else "zero"
    

    【讨论】:

    • "pos" 不是语句,而是表达式。
    • @TimPietzcker 谢谢,我更新了帖子以更准确。
    【解决方案3】:

    尽管有一些其他答案:是的,这是可能的

    if expression1:
       statement1
    elif expression2:
       statement2
    else:
       statement3
    

    翻译成以下一行:

    statement1 if expression1 else (statement2 if expression2 else statement3)
    

    事实上,您可以将它们嵌套到无穷大。享受;)

    【讨论】:

    • 花费的时间怎么样?我想,这些多循环将更加耗时。那么是否有替代嵌套循环的方法,以提高使用速度。
    • 嗨@loveR,这不是循环,它只是一个嵌套的 if else 语句,因此时间可以忽略不计
    【解决方案4】:

    只需在 else 语句中嵌套另一个 if 子句。但这并没有让它看起来更漂亮。

    >>> x=5
    >>> x if x>0 else ("zero" if x==0 else "invalid value")
    5
    >>> x = 0
    >>> x if x>0 else ("zero" if x==0 else "invalid value")
    'zero'
    >>> x = -1
    >>> x if x>0 else ("zero" if x==0 else "invalid value")
    'invalid value'
    

    【讨论】:

    • 对我来说,这比公认的答案更具可读性,因为它保持了第一个子句的结构和概念;只是主观问题。
    【解决方案5】:

    在我看来,还有一个非常难以理解的替代方案,但我还是会出于好奇分享:

    x = (i>100 and 2) or (i<100 and 1) or 0
    

    更多信息在这里:https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not

    【讨论】:

    • 这看起来像规范的 javascript ;-)
    【解决方案6】:

    您可以选择实际使用dictget 方法:

    x = {i<100: -1, -10<=i<=10: 0, i>100: 1}.get(True, 2)
    

    如果保证其中一个键的计算结果为True,则不需要get 方法:

    x = {i<0: -1, i==0: 0, i>0: 1}[True]
    

    理想情况下,最多有一个键应为True。如果多个键的计算结果为 True,则结果可能无法预测。

    【讨论】:

      【解决方案7】:
      if i > 100:
          x = 2
      elif i < 100:
          x = 1
      else:
          x = 0
      

      如果要在一行中使用上述代码,可以使用以下代码:

      x = 2 if i > 100 else 1 if i < 100 else 0
      

      这样做时,如果 i > 100,x 将被分配 2,如果 i

      【讨论】:

        【解决方案8】:

        ternary operator 是简洁表达的最佳方式。语法为variable = value_1 if condition else value_2。因此,对于您的示例,您必须应用三元运算符两次:

        i = 23 # set any value for i
        x = 2 if i > 100 else 1 if i < 100 else 0
        

        【讨论】:

          【解决方案9】:

          这还取决于您的表达方式。关于“不这样做”的其他答案的一般建议对于泛型语句和泛型表达式非常有效。

          但如果您只需要一个“调度”表,例如根据给定选项的值调用不同的函数,您可以将要调用的函数放在字典中。

          类似:

          def save(): 
             ...
          def edit():
             ...
          options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}
          
          option = get_input()
          result = options[option]()
          

          而不是 if-else:

          if option=="save":
              save()
          ...
          

          【讨论】:

            【解决方案10】:

            是的,你可以这样做:

            i = int(input('type your num here : '))
            
            x = 2 if i > 100 else ( 1 if i < 100 else 0)
            print (x)
            

            【讨论】:

              【解决方案11】:

              人们已经提到了三元表达式。有时以简单的条件赋值为例,可以使用数学表达式来执行条件赋值。这可能不会使您的代码非常易读,但它确实可以在相当短的一行中得到它。你的例子可以这样写:

              x = 2*(i>100) | 1*(i<100)
              

              比较结果为 True 或 False,当与数字相乘时为 1 或 0。可以使用 + 而不是 |在中间。

              【讨论】:

                【解决方案12】:

                嵌套三元运算符是最好的解决方案--

                示例案例-

                4 = 1
                
                3 = 2
                
                2 = 3
                
                1 = 4
                
                a = 4
                
                prio = 4 if a == 1 else (3 if a == 2 else (2 if a == 3 else 1))
                

                【讨论】:

                  【解决方案13】:

                  您可以使用嵌套的三元 if 语句。

                  # if-else ternary construct
                  country_code = 'USA'
                  is_USA = True if country_code == 'USA' else False
                  print('is_USA:', is_USA)
                  
                  # if-elif-else ternary construct
                  # Create function to avoid repeating code.
                  def get_age_category_name(age):
                      age_category_name = 'Young' if age <= 40 else ('Middle Aged' if age > 40 and age <= 65 else 'Senior')
                      return age_category_name
                  
                  print(get_age_category_name(25))
                  print(get_age_category_name(50))
                  print(get_age_category_name(75))
                  

                  【讨论】:

                    【解决方案14】:
                    MESSAGELENGHT = 39
                    "A normal function call using if elif and else."
                    if MESSAGELENGHT == 16:
                        Datapacket = "word"
                    elif MESSAGELENGHT == 8:
                         Datapacket = 'byte'
                    else:
                         Datapacket = 'bit'
                    
                    #similarly for a oneliner expresion:
                        
                    
                    Datapacket = "word" if MESSAGELENGHT == 16 else 'byte' if MESSAGELENGHT == 8 else 'bit'
                    print(Datapacket)
                    

                    谢谢

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2017-07-03
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-08-18
                      • 2015-05-16
                      • 2017-08-17
                      • 2022-10-01
                      相关资源
                      最近更新 更多