Тернарный оператор 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 инструкции присваивания будет быть.
аналогично, все returns должны фактически вернуться, даже если они условны returns. Например:
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