Подтвердить что ты не робот

Ввод инструкции 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]
4b9b3361

Ответ 1

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

Это также против Zen Python: "Чтение рассчитывается". (Введите 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

Ответ 2

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

expr1 if condition1 else expr2 if condition2 else expr

Например:

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

Ответ 3

Просто вставьте другое предложение 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'

Ответ 4

При желании вы можете фактически использовать метод get из dict:

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

Вам не нужен метод get если один из ключей гарантированно оценивается как True:

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

Максимум один из ключей в идеале должен иметь значение True. Если более чем один ключ оценивается как True, результаты могут показаться непредсказуемыми.

Ответ 6

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

При этом x будет присвоен 2, если i> 100, 1, если я <100, и 0, если я = 100.

Ответ 7

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

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

Что-то вроде:

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

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

(что вместо

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

)

Ответ 8

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

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

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

Ответ 9

Тернарный оператор является лучшим способом для краткого выражения. Синтаксис: 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

Ответ 10

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

Ответ 11

Как правило, нет. Однако, если все содержимое if-elif-else является выражением, оно может быть записано в одну строку с использованием троичных операторов, что соответствует синтаксису expr1 if cond1 else expr2. Объединяя их в цепочку, вы можете сжать if-elif-else следующим образом:

x = 1 if i>0 (else 1 if i<0 else 0)

Обычно стандартный if-elif-else считается лучшим стилем и более читаемым, чем цепные троичные операторы.

Ответ 12

Несмотря на некоторые другие ответы: ДА, ЭТО ВОЗМОЖНО (я делаю это время от времени, если чувствую слабость):

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

переводится на следующий вкладыш:

statement1 if expression1 else (statement2 if expression2 else statement3)

на самом деле вы можете вкладывать их до бесконечности. Наслаждаться ;)

Ответ 13

firstNumber = float(input("What is your first number?"))
secondNumber = float(input("What is your second number?"))
if (firstNumber / secondNumber) :
    print("The result is:" + str(float(firstNumber / secondNumber)))       
elif (firstNumber / secondNumber) :
    print("" + str(float(firtNumber / secondNumber) + " ==" + "0"))
else :
    print("Zero is not allowed in Math.")