首页 文章

将if-elif-else语句放在一行上?

提问于
浏览
77

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

有没有更简单的方法来编写if-elif-else语句,以便它适合一行?
例如,

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

[UPDATE]

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]

8 回答

  • 2

    不,这是不可能的(至少不是任意陈述),也不可取 . 在一行上拟合所有内容很可能违反PEP-8,其中强制行的长度不应超过80个字符 .

    它也反对Python的禅宗:"Readability counts" . (在Python提示符下键入 import this 以阅读整个内容) .

    您可以在Python中使用三元表达式,但仅用于表达式,而不用于语句:

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

    Edit:

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

    >>> 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
    
  • 2

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

    expr1 if condition1 else expr2 if condition2 else expr
    

    例如:

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

    只需在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'
    
  • 3

    在我看来,有一个替代方案是非常难以理解的,但无论如何我都会分享好奇心:

    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

  • 42

    好吧,几个月前我遇到过类似的问题,然后有一天我意识到你实际上可以利用 dict 对象的 get 方法 .

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

    基本上 i>100i<100 不能都是真的,所以如果它们中的任何一个是 True 你得到你想要的值(2或1),如果它们都不是 True ,你得到 0 .

  • 3

    它还取决于你的表达的性质 . 关于“不做”的其他答案的一般建议对于泛型语句和泛型表达式非常有效 .

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

    就像是:

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

    (而不是

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

  • 0

    人们已经提到过三元表达 . 有时使用简单的条件赋值作为示例,可以使用数学表达式来执行条件赋值 . 这可能不会使您的代码具有可读性,但它确实可以在相当短的时间内完成 . 您的示例可以这样写:

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

    比较将为True或False,并且当与数字相乘时则为1或0.可以使用a而不是|在中间 .

  • 11

    您可以使用嵌套的三元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))
    

相关问题