Есть ли в Python троичный условный оператор?

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

5397
задан 20 revs, 16 users 43% 9 August 2019 в 14:12
поделиться

6 ответов

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

a if condition else b

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

Это позволяет закорачивать, потому что то, когда condition верно, что только [1 115] оценены и b, не оценено вообще, но когда condition ложь только [1 118] оценены, и a не оценен вообще.

, Например:

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

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

x = a if True else b

Думают об условном выражении как переключающийся между двумя значениями. Очень полезно, когда Вы находитесь в 'одном значении или другой' ситуации, этом, но еще не делает многого.

, Если необходимо использовать операторы, необходимо использовать нормальное if оператор вместо условного выражения , выражение .

<час>

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

  • порядок аргументов отличается от тех из классика condition ? a : b тернарный оператор со многих других языков (таких как C, C++, Пойдите, Perl, Ruby, Java, JavaScript, и т.д.), который может привести к ошибкам, когда люди, незнакомые с "удивительным" поведением Python, используют его (они могут инвертировать порядок аргументов).
  • Некоторые находят это "громоздким", так как это идет вопреки нормальному потоку мысли (думающий об условии сначала и затем эффектах).
  • Стилистические причины. (Хотя 'встроенный if' может быть действительно полезны, и сделать Ваш сценарий более кратким, он действительно усложняет Ваш код)

при наличии затруднений при запоминании порядка затем помните, что при чтении вслух Вы (почти) говорите, что Вы имеете в виду. Например, x = 4 if b > 8 else 9 читается вслух как [1 125].

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

6434
ответ дан 17 revs, 13 users 28% 10 August 2019 в 00:12
поделиться
  • 1
    @stevenmw в этом случае, Вы могли бы найти легче просто продвинуть все незаконченные изменения от различного локального repos, удостоверьтесь, что все находится в синхронизации, затем переименуйте и возвратитесь и просто повторно клонируйтесь – SheetJS 24 June 2013 в 16:17

Можно индексировать в кортеж:

(falseValue, trueValue)[test]

test потребности возвратиться Верный или Ложь .
могло бы быть более безопасно всегда реализовать его как:

(falseValue, trueValue)[test == True]

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

(falseValue, trueValue)[bool(<expression>)]
705
ответ дан Landon Kuhn 9 August 2019 в 14:12
поделиться
  • 1
    @downvoter я прошу, чтобы Вы сказали мне, что Вы не согласовываете, потому что, возможно, я имею, пропускают что-то здесь. – Aristos 10 June 2012 в 22:23

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

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

выражение x if C else y сначала оценивает условие, C ( не x ); если C верен, , x оценен, и его значение возвращено; иначе y оценен, и его значение возвращено.

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

Новый начиная с версии 2.5.

132
ответ дан Michael Burr 10 August 2019 в 00:12
поделиться
  • 1
    Это могло быть полезно, если я владею каждым хостом в домене *.company.com, включая рабочие станции. Любой домен присоединился к рабочей станции , в теории, мог разместить веб-сервер и выполнить это нападение, ограничив эффективность этого решения. – goodguys_activate 11 March 2012 в 00:52

Для версий до 2,5, существует прием:

[expression] and [on_true] or [on_false]

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

1. там эквивалент C’s ”?: Тернарный оператор ”?

303
ответ дан James Brady 10 August 2019 в 00:12
поделиться
  • 1
    Я didn' t downvote, но по-видимому Вы записали очень длинный ответ это doesn' t на самом деле отвечают на исходный вопрос. – Niklas B. 11 June 2012 в 09:35

Как уже отвечено, да в Python существует тернарный оператор:

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

Дополнительная информация:

, Если <expression 1> условие, можно использовать Короткая-cirquit оценка :

a = True
b = False

# Instead of this:
x = a if a else b

# You could use Short-cirquit evaluation:
x = a or b

пз: Конечно, Короткая-cirquit оценка не является тернарным оператором, но часто троичное используется в случаях, где короткое замыкание было бы достаточно.

1
ответ дан 22 November 2019 в 19:37
поделиться
is_spacial=True if gender = "Female" else (True if age >= 65 else False)

**

это может быть вложено как Ваша потребность. всего наилучшего

**

-1
ответ дан 22 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: