Тернарный оператор 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