Вопрос: У Python есть тернарный условный оператор?


Если Python не имеет тернарного условного оператора, можно ли имитировать его с использованием других языковых конструкций?


4300


источник


Ответы:


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

a if condition else b

Первый conditionоценивается, то либо aили bвозвращается на основании логический значение condition
Если conditionоценивает Правда aвозвращается, иначе bвозвращается.

Например:

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

Обратите внимание, что условные обозначения выражение , а не заявление , Это означает, что вы не можете использовать назначения или passили других операторов в условном выражении:

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

В таком случае вам нужно использовать обычный ifвместо условного.


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

  • Порядок аргументов отличается от многих других языков (таких как C, Ruby, Java и т. Д.), Что может привести к ошибкам, когда люди, незнакомые с «неожиданным» поведением Python, используют его (они могут отменить порядок).
  • Некоторые считают это «громоздким», так как оно противоречит нормальному потоку мысли (сначала думая о состоянии, а затем о последствиях).
  • Стилистические причины.

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

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


5143



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

(falseValue, trueValue)[test]

testдолжен вернуться Правда или Ложь ,
Было бы безопаснее всегда выполнять его как:

(falseValue, trueValue)[test == True]

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

(falseValue, trueValue)[bool(<expression>)]

581



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

[expression] and [on_true] or [on_false]

Это может привести к неправильным результатам, когда on_trueимеет ложное логическое значение. 1
Хотя это имеет смысл оценить выражения слева направо, что яснее, на мой взгляд.

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


241



выражение1 если состояние еще выражения2

>>> a = 1
>>> b = 2
>>> 1 if a > b else -1 
-1
>>> 1 if a > b else -1 if a < b else 0
-1

151



Из документация :

Условные выражения (иногда называемые «тернарным оператором») имеют самый низкий приоритет всех операций Python.

Выражение x if C else yсначала оценивает условие, С ( не x ); если С правда, Икс оценивается и возвращается его значение; в противном случае, Y оценивается и возвращается его значение.

Видеть PEP 308 для более подробной информации об условных выражениях.

Новое с версии 2.5.


103



Оператор условного выражения в Python был добавлен в 2006 году как часть Предложение по улучшению Python 308 , Его форма отличается от обычной ?:оператора, и это:

<expression1> if <condition> else <expression2>

что эквивалентно:

if <condition>: <expression1> else: <expression2>

Вот пример:

result = x if a > b else y

Другой синтаксис, который можно использовать (совместимый с версиями до 2.5):

result = (lambda:y, lambda:x)[a > b]()

где операнды лениво оценивается ,

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

result = (y, x)[a > b]

или явно построенный словарь:

result = {True: x, False: y}[a > b]

Другой (менее надежный), но более простой метод - использовать andа также orоператоры:

result = (a > b) and x or y

однако это не сработает, если xбыло бы False,

Возможным обходным путем является xа также yсписков или кортежей, как показано ниже:

result = ((a > b) and [x] or [y])[0]

или:

result = ((a > b) and (x,) or (y,))[0]

Если вы работаете со словарями, вместо использования тернарного условного выражения, вы можете воспользоваться преимуществами get(key, default), например:

shell = os.environ.get('SHELL', "/bin/sh")

Источник: ?: в Python в Википедии


78



@up:

Unfortunately, the

(falseValue, trueValue)[test]

solution doesn't have short-circuit behaviour; thus both falseValue and trueValue are evaluated regardless of the condition. This could be suboptimal or even buggy (i.e. both trueValue and falseValue could be methods and have side-effects).

One solution to this would be

(lambda: falseValue, lambda: trueValue)[test]()

(execution delayed until the winner is known ;)), but it introduces inconsistency between callable and non-callable objects. In addition, it doesn't solve the case when using properties.

And so the story goes - choosing between 3 mentioned solutions is a trade-off between having the short-circuit feature, using at least python 2.5 (IMHO not a problem anymore) and not being prone to "trueValue-evaluates-to-false" errors.


70



For Python 2.5 and newer there is a specific syntax:

[on_true] if [cond] else [on_false]

In older Pythons a ternary operator is not implemented but it's possible to simulate it.

cond and on_true or on_false

Though, there is a potential problem, which if cond evaluates to True and on_true evaluates to False then on_false is returned instead of on_true. If you want this behavior the method is OK, otherwise use this:

{True: on_true, False: on_false}[cond is True] # is True, not == True

which can be wrapped by:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

and used this way:

q(cond, on_true, on_false)

It is compatible with all Python versions.


47



Ternary Operator in different programming Languages

Here I just try to show some important difference in ternary operator between a couple of programming languages.

Ternary Operator in Javascript

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

Ternary Operator in Ruby

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Ternary operator in Scala

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

Ternary operator in R programming

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

Ternary operator in Python

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

Now you can see the beauty of python language. its highly readable and maintainable.


38



You might often find

cond and on_true or on_false

but this lead to problem when on_true == 0

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

where you would expect for a normal ternary operator this result

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1

31