Тернарный оператор Python без else
можно ли сделать это в одну строку в Python?
if <condition>:
myList.append('myString')
я попробовал троичный оператор:
myList.append('myString' if <condition>)
но моя IDE (MyEclipse) не понравилось, без else
.
5 ответов
Да, вы можете сделать это:
<condition> and myList.append('myString')
если <condition>
ложно, тогда короткое замыкание будет пинать, и правая сторона не будет оценена. Если <condition>
истинно, тогда будет оценена правая сторона, и элемент будет добавлен.
Я просто отмечу, что делать выше это довольно непифоническое, и, вероятно, было бы лучше написать это, независимо:
if <condition>: myList.append('myString')
демонстрация:
>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']
причина, по которой язык не позволяет использовать синтаксис
variable = "something" if a_condition
без else
это, в случае, когда a_condition == False
, variable
внезапно неизвестно. Возможно, он может по умолчанию None
, но Python требует, чтобы все назначения переменных фактически приводили к явным назначениям. Это также относится к таким случаям, как вызов функции, поскольку значение, переданное функции, оценивается так же, как RHS инструкции присваивания будет быть.
аналогично, все return
s должны фактически вернуться, даже если они условны return
s. Например:
return variable if a_condition
не допускается, но
return variable if a_condition else None
разрешено, так как второй пример гарантированно явно возвращает что-то.
if <condition>: myList.append('myString')
в противном случае, нет. Зачем ставить его на одну линию?
обратите внимание, что "тернарный оператор" является оператор. Как и любой оператор, он должен вернуть что-то, так как же вы можете иметь троичный оператор без else
предложения? Что он должен вернуть, если условие не является истинным?
myList.extend(['myString'] if condition else [])
также будет работать, хотя это больше работы, чем другие решения.
вы в основном просят do_thing() if <condition> else pass
построить (который будет бросать SyntaxError
, ИФ РАН). Как я обнаружил во время исследования (несколько) аналогичный вопрос do_thing() if condition else None
настолько близко, насколько вы можете получить (что является еще одним способом сделать <condition> and do_thing()
). Итак, чтобы обобщить эту идею и другие ответы, вот ваши варианты:
-
if <condition>: myList.append('myString')
- кажется, наименее "хакерский" (и, следовательно, предпочтительный) способ <condition> and myList.append('myString')
myList.append('myString') if <condition> else None