Положить оператор if-elif-else в одну строку?


Я прочитал ссылки ниже, но это не решает мой вопрос.
есть ли у Python тернарный условный оператор? (речь идет о конденсации оператора 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]
8 71

8 ответов:

нет, это невозможно (по крайней мере, не с произвольными утверждениями), и это не желательно. Установка всего на одной линии, скорее всего, нарушит PEP-8 где требуется, чтобы длина строк не превышала 80 символов.

Это также против Дзен питона:"считываемость подсчитывается". (Тип import this в приглашении Python, чтобы прочитать все это).

вы можете используйте тернарное выражение в 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

Если вам нужны только разные выражения для разных случаев, то это может работать для вас:

expr1 if condition1 else expr2 if condition2 else expr

например:

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

просто вложите другое предложение if в оператор else. Но это не делает его более красивым.

>>> 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'

есть альтернатива, которая, на мой взгляд, совершенно нечитабельна, но я все равно поделюсь, как любопытство:

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

Ну, я столкнулся с подобными проблемами несколько месяцев назад, а затем в один прекрасный день я понял, что вы действительно можете воспользоваться get метод a

Это также зависит от характера ваших выражений. Общие рекомендации по другим ответам "не делать этого" вполне справедливы для общих утверждений и общих выражений.

но если все, что вам нужно, это таблица "dispacth", например, вызывающая другую функцию в зависимости от значения данного параметра, вы можете поместить функции для вызова внутри словаря.

что-то типа:

def save(): 
   ...
def edit():
   ...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}

option = get_input()
result = options[option]()

(вместо

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

)

люди уже упоминали троичные выражения. Иногда с простым условным назначением в качестве примера можно использовать математическое выражение для выполнения условного назначения. Это может не сделать ваш код очень читаемым, но он получает его на одной довольно короткой строке. Ваш пример может быть написан так:

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

сравнение будет истинным или ложным, а при умножении на числа будет либо 1, либо 0. Можно использовать + вместо из | в середине.

можно использовать вложенные тернарные операторы 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))