Какой лучший способ заменить тернарный оператор в 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, но это требует больше магии кортежей)