Python (bool)? then: else синтаксис?

Возможный дубликат:
Терминальный оператор Python

На некоторых языках, включая Java, C/С++, С# и т.д., вы можете назначить значение на основе результата встроенного булевого выражения.

Например,

return (i < x) ? i : x

Это вернет i, если я < x, иначе он вернет x. Мне это нравится, потому что во многих случаях он намного компактнее, чем более длинный синтаксис, который следует за ним.

if (i < x)
  return i
else
  return x

Можно ли использовать этот синтаксис в python, и если да, то как?

Ответ 1

Вы можете использовать (x if cond else y), например.

>>> x = 0
>>> y = 1
>>> print("a" if x < y else "b")
a

Это будет работать лямбда-функция.

Ответ 2

Да, это выглядит так:

return i if i < x else x

Он называется условным оператором в python.

Ответ 3

Попробуйте это в Python:

return i if i < x else x

Это точно эквивалент следующего выражения в Java, C, С++ С#

return i < x ? i : x;

Подробнее о Python условные выражения.

Ответ 4

Тернарный оператор в python.

a, если b else c

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

Ответ 5

Синтаксис

a if b else c был введен в Python 2.5. Большинство пользователей уже обновлены до последней версии, но в устаревшем коде вы можете найти другой подход:

some_var = a<b and a or c

Если вы когда-нибудь будете использовать этот синтаксис, помните, что a не должен оценивать значение False.

Ответ 6

Как утверждают другие ответы, версия Python для этого:

i if i < x else x

(конечно, для этого конкретного примера, хотелось бы   min(i, x), так как это проще на глазах)

Однако этот синтаксис выражения был просто доступен на Python 2.5 (я думаю, что это было около 2004 года). до этого использовалась следующая идиома, но следует соблюдать осторожность, поскольку она подвержена ошибкам:

i < x and i or x - потому что логический оператор "и" фактически оценивает последнее истинное значение в своей цепочке, поэтому, если выражение истинно, i < x and i оценивается как i - и оператор or оценивает первое истинное значение в цепочке. В этом случае, если i < x будет ложным, то будет i< x and i, а первое истинное значение будет x.

Легко видеть, как ошибка была подвержена этой конструкции, поскольку если логическое значение i было бы ложным (например, если я == 0), то оно возвращало бы x, даже если i < x где true.

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

(x, i) [i < x]

Выражение "i < x" имеет численное значение "1" (true) или "0" (false), и я использовал этот метод, чтобы он работал как индекс предыдущего кортежа. Проблема с этим подходом заключалась в том, что он всегда оценивал оба выражения на кортеже, хотя он использовал бы один из них (если выражения, в которых вызовы функции могут быть дорогими или даже противоречивыми)