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

вопрос создан в Sat, Mar 23, 2019 12:00 AM

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

    
5269
  1. Несмотря на то, что питоны старше 2.5 лет медленно уходят в историю, вот список старых приемов троичных операторов до 2.5: « Идиомы Python », поиск текста« Условное выражение ». Википедия также весьма полезна Ж: -)
    2011-05-26 00: 48: 06Z
  2. В официальной документации Python 3.0, на которую есть ссылка в приведенном выше комментарии, это называется "conditional_expressions" и очень загадочно определено. Эта документация даже не включает термин «троичный», поэтому вам будет сложно найти его через Google, если вы точно не знаете, что искать. документация версии 2 несколько более полезна и содержит ссылку "PEP 308" , который включает в себя множество интересных исторических контекстов, связанных с на этот вопрос.
    2013-01-10 05: 57: 30Z
  3. "ternary" (имеющий три входа) является косвенным свойством этого применения, а не определяющим свойством концепции. Например: SQL имеет case [...] { when ... then ...} [ else ... ] end для аналогичного эффекта, но совсем не троичный.
    2014-12-15 21: 14: 24Z
  4. также раздел 6.5.15 ИСО /МЭК 9899 (стандарт языка программирования C) называет его "условным оператором"
    2014-12-15 21: 20: 22Z
  5. Википедия подробно описывает это в статье " ?: ".
    2016-06-09 08: 11: 03Z
21 ответ                              21                         

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

 
a if condition else b

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

Это допускает короткое замыкание, потому что, когда condition истинно, оценивается только a, а b вообще не оценивается, но когда ложно condition, оценивается только b, а 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 ++, Go, Perl, Ruby, Java, Javascript и т. Д.), Которые могут привести к ошибкам, когда люди, незнакомые с «удивительным» поведением Python, используют его (они могут изменить порядок аргументов).
  • Некоторые считают его "громоздким", поскольку он идет вразрез с нормальным потоком мыслей (сначала думая о состоянии, а затем о последствиях).
  • Стилистические причины. (Хотя встроенный if может быть действительно полезным и делает ваш сценарий более кратким, он действительно усложняет ваш код)

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

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

2019-05-18 10: 26: 57Z
  1. Порядок может показаться странным для кодировщиков, однако f(x) = |x| = x if x > 0 else -x звучит очень естественно для математиков. Вы также можете понимать это, как и A в большинстве случаев, кроме случаев, когда C, тогда вы должны вместо этого делать B ...
    2016-01-25 15: 07: 08Z
  2. Будьте осторожны с порядком операций при использовании этого. Например, линия z = 3 + x if x < y else y. Если x=2 и y=1, вы можете ожидать, что это даст 4, но на самом деле это даст 1. z = 3 + (x if x > y else y) - правильное использование.
    2016-03-06 09: 23: 11Z
  3. Суть заключалась в том, что если вы хотите выполнить дополнительные оценки после , то условное вычисляется, например, добавляя значение к результату, вы либо нужно добавить дополнительное выражение в обе стороны (z = 3 + x if x < y else 3 + y) или сгруппировать условное (z = 3 + (x if x < y else y) или z = (x if x < y else y) + 3)
    2016-04-15 00: 36: 05Z
  4. что, если существует несколько условий?
    2017-05-26 15: 31: 44Z
  5. @ MrGeek, я понимаю, что вы имеете в виду, поэтому вы в основном будете вкладывать операции: `" foo "if Bool else (" bar ", если Bool else" foobar " ) `
    2017-08-11 00: 04: 32Z

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

 
(falseValue, trueValue)[test]

test необходимо вернуть True или False .
Может быть безопаснее всегда реализовывать это как:

 
(falseValue, trueValue)[test == True]

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

 
(falseValue, trueValue)[bool(<expression>)]
    
689
2015-10-17 07: 35: 10Z
  1. Обратите внимание, что этот метод всегда вычисляет все, тогда как конструкция if /else оценивает только выигрышное выражение.
    2011-02-04 02: 25: 24Z
  2. (lambda: print("a"), lambda: print("b"))[test==true]()
    2012-03-08 19: 31: 48Z
  3. Следует отметить, что то, что находится в пределах [] с, может быть произвольным выражением. Кроме того, для безопасности вы можете явно проверить на правдивость, написав [bool(<expression>)]. Функция bool() существует с v2.2.1.
    2012-05-31 18: 20: 15Z
  4. Это отлично подходит для кода-гольфа, не так много для реального кода. Хотя я так привык к этому, что иногда использую его для краткостипри выполнении чего-то очевидного, например выбора между двумя строковыми константами.
    2014-12-05 17: 52: 12Z
  5. Я проделал похожий трюк - только один или два раза, но сделал это - путем индексации в словаре с True и False в качестве ключей: {True:trueValue, False:falseValue}[test] Я надеваю Не знаю, является ли это менее эффективным, но оно, по крайней мере, избегает целых «элегантных» и «некрасивых» дебатов. Нет никакой двусмысленности, что вы имеете дело с логическим значением, а не с int.
    2016-03-01 18: 43: 37Z

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

 
[expression] and [on_true] or [on_false]

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

1. Существует ли эквивалент С "?:" Троичный оператор?

    
289
2014-01-13 07: 16: 48Z
  1. Средство защиты должно использовать (test and [true_value] или [false_value]) [0], что позволяет избежать этой ловушки.
    2009-10-21 15: 33: 59Z
  2. Тернарный оператор обычно выполняется быстрее (иногда на 10-25%).
    2014-01-13 07: 52: 08Z
  3. @ volcano У вас есть источник для меня?
    2014-08-05 12: 30: 33Z
  4. 2018-03-19 20: 59: 54Z

<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
    
200
2019-05-15 15: 03: 41Z
  1. В чем разница между этим и главным ответом?
    2010-05-27 07: 59: 27Z
  2. Этот подчеркивает основной смысл троичного оператора: выбор значения. Это также показывает, что более одного троичного можно объединить в одно выражение.
    2010-10-04 21: 14: 21Z
  3. @ Крейг, я согласен, но также полезно знать, что произойдет, если нет скобок. В реальном коде я тоже склонен вставлять явные символы скобок.
    2014-12-01 21: 30: 51Z
  4. Почему-то я могу понять это лучше, чем верхний ответ.
    2018-03-23 ​​05: 46: 05Z

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

  

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

     

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

     

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

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

    
125
2015-10-17 07: 43: 53Z

Оператор для условного выражения в 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 в Википедии р>     

95
2017-08-07 14: 22: 32Z
  1. result = {1: x, 0: y}[a > b] - это еще один возможный вариант (True и False - это целые числа со значениями 1 и 0)
    2019-02-09 18: 07: 40Z

К сожалению,

 
(falseValue, trueValue)[test]

решение не имеет поведения короткого замыкания; таким образом, и falseValue, и trueValue оцениваются независимо от состояния. Это может быть неоптимальным или даже ошибочным (т.е. и trueValue, и falseValue могут быть методами и иметь побочные эффекты).

Одним из решений этого будет

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

(выполнение отложено до тех пор, пока победитель не станет известен;)), но оно вносит несоответствие между вызываемыми и не вызываемыми объектами. Кроме того, это не решает проблему при использовании свойств.

Итак, история продолжается: выбор между 3 упомянутыми решениями - это компромисс между наличием функции короткого замыкания, использованием как минимум Зython 2.5 (ИМХО больше не проблема) и отсутствием склонности к "trueValue -оценка-к" ложные ошибки.

    
86
2019-05-09 09: 45: 33Z
  1. Хотя кортеж лямбда-трюка работает, он занимает примерно 3 раза дольше, чем троичный оператор. Вероятно, будет разумной идеей, если она сможет заменить длинную цепочку из if else if.
    2018-10-11 17: 34: 51Z

Тернарный оператор на разных языках программирования

Здесь я просто попытаюсь показать важное различие в ternary operator между несколькими языками программирования.

  

Тернарный оператор в Javascript

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

Тернарный оператор в Ruby

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

Тернарный оператор в Scala

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

Тернарный оператор в R-программировании

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

Тернарный оператор в Python

 
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
    
56
2019-01-26 14: 05: 18Z
  1. 2017-02-15 23: 08: 50Z
  2. Ruby также работает с a = true ? 1 : 0
    2017-05-15 17: 50: 10Z
  3. "Теперь вы можете увидеть всю прелесть языка Python. Он легко читается и поддерживается." Я не вижу актуальности этого предложения и того, как его демонстрирует синтаксис троичного оператора.
    2017-12-08 15: 38: 17Z
  4. Это может звучать самоуверенно; но по сути это говорит о том, что синтаксис Python, вероятно, будет понят человеком, который никогда не видел троичного оператора, в то время как очень немногие люди поймут более обычный синтаксис, если им сначала не скажут, что он означает.
    2018-01-10 17: 12: 28Z
  5. Algol68: a = .if. .правда. .затем. 1. Еще. 0 .fi. Это также может быть выражено как a = (. True. | 1 | 0). Как обычно, Algol68 является улучшением по сравнению с его преемниками.
    2018-06-17 12: 55: 29Z

Для Python 2.5 и новее существует специальный синтаксис:

 
[on_true] if [cond] else [on_false]

В старых Pythons троичный оператор не реализован, но его можно смоделировать.

 
cond and on_true or on_false

Тем не менее, существует потенциальная проблема: если cond оценивается как True, а on_true оценивается как False, то вместо on_false возвращается on_true. Если вы хотите такое поведение, метод в порядке, в противном случае используйте это:

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

который можно обернуть в:

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

и использовал этот способ:

 
q(cond, on_true, on_false)

Он совместим со всеми версиями Python.

    
55
2012-04-25 12: 02: 06Z
  1. Поведение не идентично - q("blob", on_true, on_false) возвращает on_false, тогда как on_true if cond else on_false возвращает on_true. Обходной путь должен заменить cond на cond is not None в этих случаях, хотя это не идеальное решение.
    2012-09-26 09: 09: 29Z
  2. Почему бы не bool(cond) вместо cond is True? Первый проверяет достоверность cond, последний проверяет равенство указателей с объектом True. Как подчеркнул @AndrewCecil, "blob" - это правда, но это is not True.
    2013-11-11 16: 11: 06Z
  3. Ух ты, это выглядит действительно смешно! :) Технически вы можете даже написать [on_false, on_True][cond is True], чтобы выражение стало короче.
    2014-02-24 11: 51: 08Z
  4. В этом ответе нет короткого замыкания. Если on_true и on_false стоят дорого, это плохой ответ.
    2019-03-28 14: 08: 20Z

Вы часто можете найти

 
cond and on_true or on_false

но это приводит к проблеме, когда on_true == 0

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

где вы ожидаете для нормального троичного оператора этот результат

 
>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1
    
35
2013-01-14 15: 56: 09Z
  

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

Да. Из грамматикиле :

 
test: or_test ['if' or_test 'else' test] | lambdef

Интересующая часть:

 
or_test ['if' or_test 'else' test]

Итак, троичная условная операция имеет вид:

 
expression1 if expression2 else expression3

expression3 будет лениво оцениваться (то есть, оценивается, только если expression2 ложно в логическом контексте). А из-за рекурсивного определения вы можете связывать их бесконечно (хотя это может считаться плохим стилем).

 
expression1 if expression2 else expression3 if expression4 else expression5 # and so on

Примечание по использованию:

Обратите внимание, что за каждым if должен следовать else. Люди, изучающие списки и выражения-генераторы, могут найти этот урок трудным для изучения - следующее не сработает, так как Python ожидает третьего выражения для else:

 
[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

, который поднимает SyntaxError: invalid syntax. Таким образом, вышесказанное является либо неполной частью логики (возможно, пользователь ожидает запрета в ложном состоянии), либо может быть предназначено для использования expression2 в качестве фильтра - отмечает, что следующее является допустимым Python:

 
[expression1 for element in iterable if expression2]

expression2 работает как фильтр для понимания списка и не троичный условный оператор.

Альтернативный синтаксис для более узкого случая:

Вам может быть немного больно писать следующее:

 
expression1 if expression1 else expression2

expression1 должен быть оценен дважды с использованием вышеуказанного использования. Это может ограничить избыточность, если это просто локальная переменная. Тем не менее, распространенная и эффективная идиома Pythonic для этого варианта использования заключается в использовании быстродействия or:

 
expression1 or expression2

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

    
28
2016-08-08 18: 56: 31Z
  1. expression1 or expression2 аналогичен и имеет те же недостатки /позитивы, что и expression1 || expression2 в javascript
    2016-02-18 13: 05: 59Z
  2. Спасибо, @selurvedu - это может сбивать с толку, пока вы не поймете это прямо. Я выучил трудный путь, поэтому твой путь может быть не таким сложным. ;) Использование if без else в конце выражения генератора или списка будет фильтровать итерируемое. Спереди это троичная условная операция, и требуется другое. Ура !!
    2016-05-27 04: 37: 39Z
  3. @ AaronHall Хотя использование вами метасинтаксического expressionN для всех экземпляров является единообразным, это может быть проще для понимания с помощью именования, которое отличает выражение условного теста от двух выражений результата; например, result1 if condition else result2. Это особенно очевидно при вложении (он же цепочка): result1 if condition1 else result2 if condition2 else result3. Посмотрите, насколько лучше это выглядит?
    2019-01-26 14: 12: 47Z
  4. @ tchrist благодарит за обзор - если вы посмотрите историю изменений, у этого поста в настоящее время есть две версии. Большинство других моих ответов, особенно самые лучшие, были пересмотрены снова и снова. Этот ответ никогда не привлекает мое внимание, потому что статус вики сообщества не дает мне никакой оценки за содержание, и поэтому я никогда не вижу голосов по нему. Поскольку у меня сейчас нет времени на редактирование этого вопроса, лягушка знает, когда он снова привлечет мое внимание в будущем. Я вижу, что вы отредактировали верхний ответ, так что не стесняйтесь заимствовать /процитировать мой материал из этого поста в этом (и процитируйте меня, если уместно!)
    2019-01-26 18: 24: 21Z

Имитация тернарного оператора python.

Например

 
a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

выход: р>  

'b greater than a'
    
17
2013-11-20 10: 44: 12Z
  1. Почему бы просто не result = (y, x)[a < b] Почему вы используете функцию lambda ?
    2013-12-27 05: 50: 06Z
  2. @ GrijeshChauhan Поскольку по "компилированным" выражениям, e. г. включая вызов функции и т. д., это будет выполнено в обоих случаях. Это может быть не нужно.
    2014-02-13 08: 14: 33Z

вы можете сделать это: -

[condition] and [expression_1] or [expression_2] ;

Пример: - р>

print(number%2 and "odd" or "even")

При этом будет напечатано «нечетное», если число нечетное, или «четное», если число четное.

Результат: - Если условие истинно, выполняется exp_1, иначе выполняется exp_2.

Примечание. - 0, None, False, emptylist, emptyString оценивается как False. И любые данные, кроме 0, оцениваются как True.

Вот как это работает:

если условие [условие] становится "Истина", тогда выражение_1 будет оцениваться, но не выражение_2. Если мы "и" что-то с 0 (ноль), результат всегда будет быстрым. Так в приведенном ниже утверждении,

 
0 and exp

Выражение exp вообще не будет оцениваться, так как "и" с 0 всегда будут равны нулю, и нет необходимости оценивать выражение. Так работает сам компилятор на всех языках.

В

 
1 or exp

выражение exp вообще не будет оцениваться, так как «или» с 1 всегда будет 1. Поэтому не стоит беспокоиться о выражении exp, так как результат все равно будет равен 1. (методы оптимизации компилятора).

Но в случае

 
True and exp1 or exp2

Второе выражение exp2 не будет оцениваться, так как True and exp1 будет True, если exp1 не false.

Аналогично в

 
False and exp1 or exp2

Выражение exp1 не будет оцениваться, так как False эквивалентно записи 0 и выполнению «и» с 0 будет само 0, но после exp1, так как «или» используется, оно будет вычислять выражение exp2 после «или». р>

Примечание. - . Этот вид ветвления с использованием «или» и «и» можно использовать только в том случае, если выражение_1 не имеет значения «Истина», равного «Ложь» (или 0, «Нет» или «пустой список» []). или emptystring ''.) поскольку выражение_1 становится ложным, тогда выражение_2 будет оцениваться из-за наличия "или" между exp_1 и exp_2.

Если вы все еще хотите, чтобы он работал во всех случаях, независимо от того, какие значения истинности exp_1 и exp_2, сделайте следующее: -

[condition] and ([expression_1] or 1) or [expression_2] ;

    
15
2017-08-20 07: 48: 54Z
  1. Если вы хотите использовать это в контексте x = [condition] and ([expression_1] or 1) or [expression_2] и expression_1, оценивается как ложное, x будет 1, а не expression_1. Используйте принятый ответ.
    2017-10-20 06: 37: 01Z

Тернарный условный оператор просто позволяет тестировать условие в одной строке, заменяя многострочное if-else, делая код компактным.

Синтаксис:

  

[on_true] if [expression] else [on_false]

1- Простой метод использования тернарного оператора:

 
# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

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

 
# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- Тернарный оператор можно записать как вложенный if-else:

 
# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

Вышеуказанный подход можно записать так:

 
# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a
    
14
2018-04-04 14: 02: 17Z
  1. Обратите внимание, что троичный оператор меньше (в памяти) и быстрее, чем вложенный оператор if. Кроме того, ваш вложенный if-else на самом деле не является перезаписью тернарного оператора и будет выдавать различные выходные данные для значений выбора a и b (в частности, если один является типом, который реализует странный метод __ne__).
    2018-10-11 17: 28: 46Z

Больше подсказка, чем ответ (не нужно повторять очевидное в течение сотен раз), но я иногда использую его в качестве ярлыка в таких конструкциях:

 
if conditionX:
    print('yes')
else:
    print('nah')

становится:

 
print('yes') if conditionX else print('nah')

Некоторые (многие :) могут воспринимать это как непифоническое (даже ruby-ish :), но я лично нахожу это более естественным - то есть, как бы вы это выразили нормально, плюс немного более визуально привлекательным в больших блоках код.

    
12
2016-05-23 19: 16: 26Z
  1. Я предпочитаю print( 'yes' if conditionX else 'nah' ) вашему ответу. : -)
    2017-08-20 06: 07: 17Z
  2. То есть, если вы хотите print() в обоих случаях - и это выглядит немного более питоническим, я должен признать :) Но что, если выражения /функции не являются то же самое - как print('yes') if conditionX else True - чтобы получить print() только в истинных conditionX
    2017-10-26 11: 40: 17Z
  3. Чтобы добавить к замечанию Фредерика99, еще одна причина, по которой следует избегать print('yes') if conditionX else print('nah'), состоит в том, что он дает ошибку SyntaxError в Python2.
    2018-10-21 21: 51: 29Z
  4. Единственная причина, по которой он выдает синтаксическую ошибку, заключается в том, что в Python 2 print является оператором - print "yes", а в Python 3 - функцией - print("yes"). Это можно решить, используя его как утверждение или, что лучше, - from future import print_function.
    2018-10-22 04: 09: 00Z
 
a if condition else b

Просто запомните эту пирамиду, если у вас возникли проблемы с запоминанием:

 
     condition
  if           else
a                   b 
    
9
2018-12-06 14: 45: 27Z

ДА, в python есть троичный оператор, вот синтаксис и пример кода для демонстрации того же самого:)

 
#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")
    
4
2018-10-21 20: 46: 34Z
  1. Я добавил пример однострочного оператора, чтобы проверить, какое число большое, чтобы уточнить его далее
    2018-10-21 20: 45: 54Z
  2. print на самом деле не является хорошим выбором, так как это даст ошибку SyntaxError в Python2.
    2018-10-21 21: 52: 56Z
  3. @ Тьерри Латюль: здесь я использовал функцию print (), а не оператор print, функция print для Python 3, а оператор print для Python 2
    2018-10-21 21: 54: 21Z
  4. Вопрос уже был задан на SO, просто попробуйте его с Python 2, и вы увидите сами. 'print (' hello ') - это совершенно правильный синтаксис в Python 2.7, но из-за того, что он анализируется, ваш код выше выдает ошибку SyntaxError.
    2018-10-21 21: 58: 23Z
  5. Что правильно, пожалуйста, сообщите
    2018-10-21 22: 00: 52Z

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

 
<condition> ? <expression1> : <expression2>
  

Во-первых, Python B эневолентный D иктатор F или L иф (я имею в виду Гвидо ван Россума) , конечно) отверг это (как непифонический стиль), так как это довольно трудно понять людям, не привыкшим к C языку. Кроме того, знак двоеточия : уже используется в Python. После утверждения PEP 308 Python наконец получил собственное условное выражение (что мы используем сейчас):

 
<expression1> if <condition> else <expression2>

Итак, сначала он оценивает состояние. Если он вернет True, выражение1 будет оценено для получения результата, в противном случае выражение2 будет оценено. Из-за механики Lazy Evaluation - будет выполнено только одно выражение.

Вот несколько примеров (условия будут оцениваться слева направо):

 
pressure = 10
print('High' if pressure < 20 else 'Critical')

# Result is 'High'

Тернарные операторы могут быть соединены последовательно:

 
pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')

# Result is 'Normal'

Следующий такой же, как предыдущий:

 
pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'

Надеюсь, это поможет.

    
4
2019-01-04 22: 02: 14Z

Одна из альтернатив условного выражения Python это следующее:

 
{True:"yes", False:"no"}[boolean]

со следующим хорошим расширением:

 
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]

Самая короткая альтернатива остается:

 
("no", "yes")[boolean]

но альтернативы нет, если вы хотите избежать оценки как yes(), так и no() в следующем:

 
yes() if [condition] else no()
    
3
2019-02-09 18: 23: 18Z

Удобный способ объединения нескольких операторов:

 
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

    
0
2019-05-12 13: 03: 48Z

если переменная определена и вы хотите проверить, имеет ли она значение, вы можете просто a or b

 
def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

выведет

 
no Input
no Input
no Input
hello
['Hello']
True
    
- 1
2018-04-26 16: 22: 58Z
  1. Хотя это полезно для аналогичных задач, оно не является троичным условным выражением. Он работает вместо x if x else y, но не x if z else y.
    2018-10-11 17: 13: 50Z
источник размещен Вот