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

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

27.12.2008 08:32:18
В официальной документации Python 3.0, упомянутой в комментарии выше, это упоминается как «conditional_expressions» и очень загадочно определено. Эта документация даже не включает термин «троичный», поэтому вам будет сложно найти его через Google, если вы точно не знаете, что искать. Документация версии 2 является несколько более полезной и содержит ссылку на «PEP 308» , которая включает в себя много интересного исторического контекста, связанного с этим вопросом.
nobar 10.01.2013 05:57:30
«троичный» (имеющий три входа) является косвенным свойством этого побуждения, а не определяющим свойством концепции. Например: SQL имеет case [...] { when ... then ...} [ else ... ] endаналогичный эффект, но никак не троичный.
user313114 15.12.2014 21:14:24
также раздел 6.5.15 стандарта ISO / IEC 9899 (стандарт языка программирования C) называет его «условным оператором»
user313114 15.12.2014 21:20:22
Википедия подробно рассказывает об этом в статье " ?: ".
HelloGoodbye 9.06.2016 08:11:03
За годы, прошедшие после комментария nobar, документация по условным выражениям была обновлена ​​и теперь содержит условные выражения (иногда называемые «троичным оператором») ...
Scott Martin 15.08.2018 13:25:07
25 ОТВЕТОВ
РЕШЕНИЕ

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

a if condition else b

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

Это допускает короткое замыкание, потому что, когда значение conditiontrue только aоценивается и bвообще не оценивается, а когда значение conditionfalse только 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 " «Удивительно» поведение использовать его (они могут изменить порядок аргументов).
  • Некоторые считают его «громоздким», поскольку он идет вразрез с нормальным потоком мысли (сначала думая о состоянии, а затем о последствиях).
  • Стилистические причины. (Хотя «inline if» может быть очень полезным и сделать ваш сценарий более кратким, он действительно усложнит ваш код)

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

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

6936
20.04.2020 17:27:59
Порядок может показаться странным для программистов, однако f(x) = |x| = x if x > 0 else -xдля математиков это звучит очень естественно. Вы также можете понять это, как и A в большинстве случаев, за исключением случаев, когда C, тогда вы должны вместо этого делать B ...
yota 25.01.2016 15:07:08
Будьте осторожны с порядком операций при использовании этого. Например, линия z = 3 + x if x < y else y. Если x=2и y=1, вы можете ожидать, что это даст 4, но на самом деле это приведет к 1. z = 3 + (x if x > y else y)это правильное использование.
Kal Zekdor 6.03.2016 09:23:11
Смысл был в том, что если вы хотите выполнить дополнительные вычисления после вычисления условного выражения, например добавить значение к результату, вам нужно либо добавить дополнительное выражение в обе стороны ( 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)
Kal Zekdor 15.04.2016 00:36:05
@MrGeek, я понимаю, что вы имеете в виду, так что вы в основном будете вкладывать операции: `" foo ", если Bool else (" bar ", если Bool else" foobar ")`
Dimesio 11.08.2017 00:04:32
Программисты нуждаются в точной правильной формулировке даже больше, чем математик, потому что в математике всегда прибегают к базовым понятиям. Убедительным аргументом является оператор%, имитирующий то, как «мод» используется в математике, был бы катастрофой. Так что нет, я не принимаю ваш аргумент. Это как придерживаться имперских единиц. Groetjes Альберт
Albert van der Horst 17.06.2018 12:50:52

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

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

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

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

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

157
17.10.2015 07:43:53

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

[expression] and [on_true] or [on_false]

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

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

337
13.01.2014 07:16:48
Для этого нужно использовать (test and [true_value] или [false_value]) [0], что позволяет избежать этой ловушки.
ThomasH 21.10.2009 15:33:59
Троичный оператор обычно выполняется быстрее (иногда на 10-25%).
volcano 13.01.2014 07:52:08
@ Volcano У тебя есть источник для меня?
OrangeTux 5.08.2014 12:30:33
@OrangeTux Вот разобранный код . Использование метода, предложенного ThomasH, будет еще медленнее.
mbomb007 19.03.2018 20:59:54

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

(falseValue, trueValue)[test]

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

(falseValue, trueValue)[test == True]

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

(falseValue, trueValue)[bool(<expression>)]
790
17.10.2015 07:35:10
Обратите внимание, что этот всегда оценивает все, тогда как конструкция if / else оценивает только выигрышное выражение.
SilverbackNet 4.02.2011 02:25:24
(lambda: print("a"), lambda: print("b"))[test==true]()
Dustin Getz 8.03.2012 19:31:48
Следует отметить, что то, что находится внутри []s, может быть произвольным выражением. Кроме того, для безопасности вы можете явно проверить на правдивость, написав [bool(<expression>)]. Эта bool()функция существует с v2.2.1.
martineau 31.05.2012 18:20:15
Я проделал подобный трюк - только один или два раза, но сделал это - путем индексации в словаре с ключами Trueи Falseв качестве ключей: {True:trueValue, False:falseValue}[test] я не знаю, является ли это менее эффективным, но он, по крайней мере, избегает всего "элегантный" против "некрасивых" дебатов. Нет никакой двусмысленности, что вы имеете дело с логическим, а не с int.
JDM 1.03.2016 18:43:37

К сожалению,

(falseValue, trueValue)[test]

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

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

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

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

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

96
9.05.2019 09:45:33
Хотя кортеж лямбда-трюка работает, он занимает примерно 3 раза дольше, чем троичный оператор. Вероятно, будет разумной идеей, если она сможет заменить длинную цепочку if else if.
Perkins 11.10.2018 17:34:51

<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
260
15.05.2019 15:03:41
Этот подчеркивает основной смысл троичного оператора: выбор значения. Это также показывает, что более одного троичного можно объединить в одно выражение.
Roy Tinker 4.10.2010 21:14:21
@ Крейг, я согласен, но также полезно знать, что произойдет, если нет скобок. В реальном коде я тоже склонен вставлять явные скобки.
Jon Coombs 1.12.2014 21:30:51

Для 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.

64
25.04.2012 12:02:06
Поведение не идентично - q("blob", on_true, on_false)возвращает on_false, тогда как on_true if cond else on_falseвозвращает on_true. Обойти это можно заменить condс cond is not Noneв этих случаях, несмотря на то, что не является идеальным решением.
user3317 26.09.2012 09:09:29
Почему не bool(cond)вместо cond is True? Первый проверяет достоверность cond, последний проверяет равенство указателей с Trueобъектом. Как подчеркнул @AndrewCecil, "blob"это правда, но это is not True.
Jonas Kölker 11.11.2013 16:11:06
Ничего себе, это выглядит очень смешно! :) Технически вы можете даже написать, [on_false, on_True][cond is True]чтобы выражение стало короче.
Arseny 24.02.2014 11:51:08
В этом ответе нет короткого замыкания. Если on_true и on_false стоят дорого, это плохой ответ.
Hucker 28.03.2019 14:08:20

Вы можете часто находить

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
45
14.01.2013 15:56:09

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

Например

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'
24
20.11.2013 10:44:12
Почему не просто result = (y, x)[a < b]Почему вы используете lambdaфункцию ?
Grijesh Chauhan 27.12.2013 05:50:06
@GrijeshChauhan Поскольку для «компилированных» выражений, например, с использованием вызова функции и т. Д., Это будет выполняться в обоих случаях. Это может быть не нужно.
glglgl 13.02.2014 08:14:33

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

<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 в Википедии

118
7.08.2017 14:22:32
result = {1: x, 0: y}[a > b]другой возможный вариант ( Trueи Falseна самом деле являются целыми числами со значениями 1и 0)
Walter Tross 9.02.2019 18:07:40

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

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

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

Интересная часть:

or_test ['if' or_test 'else' test]

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

expression1 if expression2 else expression3

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

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

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

38
8.08.2016 18:56:31
expression1 or expression2быть похожим и иметь те же недостатки / позитивы, что и expression1 || expression2в javascript
JSDBroughton 18.02.2016 13:05:59
Спасибо, @selurvedu - это может сбить с толку, пока вы не поймете это прямо Я выучил трудный путь, поэтому твой путь может быть не таким сложным. ;) Использование if без else, в конце выражения генератора или списка будет фильтровать итерируемое. Спереди это троичная условная операция, и требуется другое. Ура !!
Aaron Hall♦ 27.05.2016 04:37:39
@AaronHall Хотя использование вами метасинтаксического expressionNдля всех экземпляров непротиворечиво, это может быть проще для понимания с помощью имен, отличающих выражение условного теста от двух выражений результата; например, result1 if condition else result2. Это особенно очевидно при вложении (он же цепочка) result1 if condition1 else result2 if condition2 else result3. Видите, насколько лучше это звучит так?
tchrist 26.01.2019 14:12:47
@tchrist спасибо за обзор - если вы посмотрите на историю изменений, у этого поста в настоящее время есть две версии. Большинство других моих ответов, особенно самые лучшие, были пересмотрены снова и снова. Этот ответ никогда не привлекает мое внимание, потому что статус вики сообщества не дает мне никакой оценки за содержание, и поэтому я никогда не вижу голосов по нему. Поскольку у меня сейчас нет времени на редактирование этого вопроса, лягушка знает, когда он снова привлечет мое внимание в будущем. Я вижу, что вы отредактировали верхний ответ, так что не стесняйтесь заимствовать / процитировать мой материал из этого поста в этом (и процитируйте меня, если уместно!)
Aaron Hall♦ 26.01.2019 18:24:21

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

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

, становится:

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

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

19
23.05.2016 19:16:26
Я предпочитаю print( 'yes' if conditionX else 'nah' )ваш ответ. :-)
frederick99 20.08.2017 06:07:17
То есть, если вы хотите print()в обоих случаях - и это выглядит немного более питоническим, я должен признать :) Но что, если выражения / функции не одинаковы - как print('yes') if conditionX else True- чтобы получить print()единственное правдивоеconditionX
Todor Minakov 26.10.2017 11:40:17
Чтобы добавить к замечанию Фредерика99, еще одна причина, по которой следует избегать, print('yes') if conditionX else print('nah')это то, что он дает ошибку SyntaxError в Python2.
Thierry Lathuille 21.10.2018 21:51:29
Единственная причина, по которой он дает синтаксическую ошибку, заключается в том, что в Python 2 print - это оператор - print "yes", а в Python 3 - это функция - print("yes"). Это можно решить, используя это как утверждение, или лучше - from future import print_function.
Todor Minakov 22.10.2018 04:09:00

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

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

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

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

Троичный оператор в рубине

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

Тернарный оператор в Скале

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
72
26.01.2019 14:05:18
Это может звучать самоуверенно; но в сущности это говорит о том, что синтаксис Python, вероятно, будет понятен человеку, который никогда не видел троичного оператора, в то время как очень немногие люди поймут более обычный синтаксис, если им сначала не скажут, что он означает.
fralau 10.01.2018 17:12:28
Алгол68: a = .if. .правда. .тогда. 1. Еще. 0 .fi. Это может быть выражено также как a = (. True. | 1 | 0). Как обычно, Algol68 является улучшением по сравнению с его преемниками.
Albert van der Horst 17.06.2018 12:55:29

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

[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 не имеет значения Истина False (или 0, или Нет, или emptylist [], или emptystring ''.), Поскольку, если выражение_1 становится Ложь, тогда выражение_2 будет оцениваться из-за наличия «или» между exp_1 и exp_2.

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

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

20
20.08.2017 07:48:54
Если вы хотите использовать это в контексте x = [condition] and ([expression_1] or 1) or [expression_2]и имеет expression_1значение ЛОЖЬ, xбудет 1, не expression_1. Используйте принятый ответ.
moi 20.10.2017 06:37:01

Тернарный условный оператор просто позволяет тестировать условие в одной строке, заменяя многострочное 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
20
4.04.2018 14:02:17
Обратите внимание, что троичный оператор меньше (в памяти) и быстрее, чем вложенный if. Кроме того, ваше вложенное if-elseв действительности не является перезаписью тернарного оператора, и будет выдавать разные выходные данные для значений выбора a и b (в частности, если один является типом, который реализует странный __ne__метод).
Perkins 11.10.2018 17:28:46

если переменная определена, и вы хотите проверить, имеет ли она значение, вы можете просто 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
26.04.2018 16:22:58
Хотя это полезно для подобных проблем, это не троичная условность. Это работает, чтобы заменить x if x else y, но нет x if z else y.
Perkins 11.10.2018 17:13:50

ДА, у 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")
7
21.10.2018 20:46:34
Я добавил пример однострочного оператора, чтобы проверить, какое число является большим, чтобы уточнить его
PythonLover 21.10.2018 20:45:54
printдействительно не очень хороший выбор, так как это даст SyntaxError в Python2.
Thierry Lathuille 21.10.2018 21:52:56
@ Thierry Lathuille здесь я использовал функцию print (), а не оператор print, функция print для Python 3, а оператор print для Python 2
PythonLover 21.10.2018 21:54:21
Вопрос уже был задан на SO, просто попробуйте его с Python 2, и вы увидите сами. 'print (' hello ') - это совершенно правильный синтаксис в Python 2.7, но способ синтаксического анализа заставляет ваш код выше выдавать SyntaxError.
Thierry Lathuille 21.10.2018 21:58:23
a if condition else b

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

     condition
  if           else
a                   b 
18
6.12.2018 14:45:27

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

<condition> ? <expression1> : <expression2>

Во - первых, Python B enevolent D ictator 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'

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

9
4.01.2019 22:02:14

Одна из альтернатив условному выражению Python

"yes" if boolean else "no"

является следующим:

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

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

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

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

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

но нет альтернативы

yes() if boolean else no()

если вы хотите избежать оценки yes() и no() , потому что в

(no(), yes())[boolean]  # bad

оба no()и yes()оцениваются.

11
22.02.2020 13:03:35

Аккуратный способ связать несколько операторов:

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
-2
12.05.2019 13:03:48

Как уже ответили, да, в python есть троичный оператор:

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

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

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

a = True
b = False

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

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

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

10
16.10.2019 08:37:26
Upvote для этой short-circuitоценки.
CodeIt 20.10.2019 07:18:40
is_spacial=True if gender = "Female" else (True if age >= 65 else False)

**

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

**

-3
23.10.2019 07:22:58

Python имеет троичную форму для заданий; однако может быть даже более короткая форма, о которой люди должны знать.

Очень часто нужно присваивать переменной то или иное значение в зависимости от условия.

>>> li1 = None
>>> li2 = [1, 2, 3]
>>> 
>>> if li1:
...     a = li1
... else:
...     a = li2
...     
>>> a
[1, 2, 3]

^ Это длинная форма для выполнения таких заданий.

Ниже представлена ​​троичная форма. Но это не самый лаконичный способ - см. Последний пример.

>>> a = li1 if li1 else li2
>>> 
>>> a
[1, 2, 3]
>>> 

С Python вы можете просто использовать orдля альтернативных назначений.

>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

Вышеприведенное работает, поскольку li1is Noneи interp интерпретирует это как False в логических выражениях. Затем interp перемещается и оценивает второе выражение, которое не является Noneи не является пустым списком - поэтому оно присваивается a.

Это также работает с пустыми списками. Например, если вы хотите назначить aсписок, в котором есть элементы.

>>> li1 = []
>>> li2 = [1, 2, 3]
>>> 
>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

Зная это, вы можете просто выполнять такие задания, когда сталкиваетесь с ними. Это также работает со строками и другими итерациями. Вы можете назначить aлюбую строку, которая не является пустой.

>>> s1 = ''
>>> s2 = 'hello world'
>>> 
>>> a = s1 or s2
>>> 
>>> a
'hello world'
>>> 

Мне всегда нравился троичный синтаксис Си, но Python делает еще один шаг вперед!

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

1
15.03.2020 06:42:19

Я считаю громоздким синтаксис Python по умолчанию val = a if cond else b, поэтому иногда я делаю это:

iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)

Конечно, у него есть недостаток - всегда оценивать обе стороны (a и b), но синтаксис мне понятнее

0
26.03.2020 21:59:43