Есть ли в Python троичный условный оператор? - PullRequest
5237 голосов
/ 27 декабря 2008

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

Ответы [ 21 ]

28 голосов
/ 17 ноября 2015

Имеет ли 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

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

17 голосов
/ 20 ноября 2013

Имитация троичного оператора 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'
15 голосов
/ 20 августа 2017

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

[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 или Нет или пустой список [] или emptystring ''.), поскольку если expression_1 становится False, то выражение_2 будет оцениваться из-за наличия "или" между exp_1 и exp_2.

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

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

14 голосов
/ 04 апреля 2018

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

Синтаксис:

[on_true] if [выражение] 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
12 голосов
/ 11 мая 2016

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

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

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

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

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

9 голосов
/ 06 декабря 2018
a if condition else b

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

     condition
  if           else
a                   b 
4 голосов
/ 25 декабря 2018

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

<condition> ? <expression1> : <expression2>

Во-первых, Python B неуверенный D иктатор F или L ife (я имею в виду Guido van Rossum конечно) отверг это (как непифонический стиль), так как это довольно трудно понять людям, не привыкшим к 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 голосов
/ 21 октября 2018

ДА, у 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")
3 голосов
/ 09 февраля 2019

Одной из альтернатив условному выражению в 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()
0 голосов
/ 12 мая 2019

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

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

...