Вопрос-Ответ

Does Python have a ternary conditional operator?

Есть ли в Python троичный условный оператор?
Переведено автоматически
Ответ 1

Да, он был добавлен в версии 2.5. Синтаксис выражения:

a if condition else b

Сначала condition вычисляется, затем вычисляется и возвращается ровно одно из a или b на основе логического значения condition. Если condition вычисляется как True, то a вычисляется и возвращается, но b игнорируется, или же когда b вычисляется и возвращается, но a игнорируется.

Это допускает короткое замыкание, потому что при condition значении true вычисляется только a и b не вычисляется вообще, но при condition значении false вычисляется только b и a не вычисляется вообще.

Например:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

Обратите внимание, что условные выражения - это выражение, а не оператор. Это означает, что вы не можете использовать операторы, такие как pass, или присваивания с = (или "расширенные" присваивания, такие как +=), в условном выражении:

>>> pass if False else pass
File "<stdin>", line 1
pass if False else pass
^
SyntaxError: invalid syntax

>>> # Python parses this as `x = (1 if False else y) = 2`
>>> # The `(1 if False else x)` part is actually valid, but
>>> # it can't be on the left-hand side of `=`.
>>> x = 1 if False else y = 2
File "<stdin>", line 1
SyntaxError: cannot assign to conditional expression

>>> # If we parenthesize it instead...
>>> (x = 1) if False else (y = 2)
File "<stdin>", line 1
(x = 1) if False else (y = 2)
^
SyntaxError: invalid syntax

(В версии 3.8 и выше, := оператор "walrus" позволяет просто присваивать значения в виде выражения, которое затем совместимо с этим синтаксисом. Но, пожалуйста, не пишите подобный код; это быстро станет очень трудным для понимания.)

Аналогично, поскольку это выражение, else часть является обязательной:

# Invalid syntax: we didn't specify what the value should be if the 
# condition isn't met. It doesn't matter if we can verify that
# ahead of time.
a if True

Однако вы можете использовать условные выражения для присвоения переменной следующим образом:

x = a if True else b

Или, например, для возврата значения:

# Of course we should just use the standard library `max`;
# this is just for demonstration purposes.
def my_max(a, b):
return a if a > b else b

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


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


  • Порядок аргументов отличается от классического condition ? a : b троичного оператора из многих других языков (таких как C , C ++, Go, Perl, Ruby, Java, JavaScript и т.д.), Что может приводить к ошибкам, когда люди, незнакомые с "удивительным" поведением Python, используют его (они могут изменить порядок аргументов на противоположный).

  • Некоторые считают его "громоздким", поскольку он противоречит нормальному ходу мыслей (сначала думается об условии, а затем о последствиях).

  • Стилистические соображения. (Хотя 'inline if' может быть действительно полезным и сделать ваш скрипт более кратким, он действительно усложняет ваш код)

Если у вас возникли проблемы с запоминанием порядка, то помните, что при чтении вслух вы (почти) говорите то, что имеете в виду. Например, x = 4 if b > 8 else 9 читается вслух как x will be 4 if b is greater than 8 otherwise 9.

Официальная документация:

Ответ 2

Вы можете индексировать в виде кортежа:

(falseValue, trueValue)[test]

test должен возвращать True или False.

Возможно, было бы безопаснее всегда реализовывать его как:

(falseValue, trueValue)[test == True]

или вы можете использовать встроенный bool() для обеспечения логического значения:

(falseValue, trueValue)[bool(<expression>)]
Ответ 3

Для версий до 2.5 есть хитрость:

[expression] and [on_true] or [on_false]

Он может давать неправильные результаты, когда on_true имеет ложное логическое значение.1

Хотя у него есть преимущество в вычислении выражений слева направо, что, на мой взгляд, более понятно.

1. Существует ли эквивалент троичного оператора C ”?:”?

Ответ 4

<expression 1> if <condition> else <expression 2>

a = 1
b = 2

1 if a > b else -1
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1
python