Какой лучший способ заменить тернарный оператор в Python?

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

Если у меня есть код вроде:

x = foo ? 1 : 2

Как мне перевести его на Python? Я могу это сделать?

if foo:
  x = 1
else:
  x = 2

Будет ли х оставаться в области действия вне блоков if / then? Или я должен сделать что-то подобное?

x = None
if foo:
  x = 1
else:
  x = 2

6 ответов

Решение

Используйте тернарный оператор (формально условное выражение) в Python 2.5+.

x = 1 if foo else 2

Хороший трюк с питоном использует это:

foo = ["ifFalse","ifTrue"][booleanCondition]

Он создает 2-членный список, и логическое значение становится либо 0 (false), либо 1 (true), что выбирает правильный член. Не очень читабельно, но пифония:)

Упомянутый троичный оператор доступен только из Python 2.5. От WeekeePeedeea:

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

Тернарный оператор Python отличается от обычного?: Оператор в порядке своих операндов; общая форма op1 if condition else op2, Эта форма предлагает рассматривать op1 как нормальное значение и op2 как исключительный случай.

До 2.5 можно было использовать уродливый синтаксис (lambda x:op2,lambda x:op1)[condition]() которая также заботится только об оценке выражений, которые действительно необходимы для предотвращения побочных эффектов.

Дубликат этого.

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

x = foo and 1 or 2

Я все еще использую 2.4 в одном из моих проектов и сталкивался с этим несколько раз. Самое элегантное решение, которое я вижу для этого:

x = {True: 1, False: 2}[foo is not None]

Мне это нравится, потому что он представляет собой более понятный логический тест, чем использование списка со значениями индекса 0 и 1 для получения возвращаемого значения.

Вы можете использовать что-то вроде:

val = float(raw_input("Age: "))
status = ("working","retired")[val>65]
print "You should be",status

хотя это не очень питонический

(другие варианты ближе к C/PERL, но это требует больше магии кортежей)

Другие вопросы по тегам