Как лучше, в одну или несколько строк, писать на Python?
начал изучать python, и вот возник вопрос, стоит ли стараться писать код в одну строку? В пример привёл два кода, оба работают одинаково, но как по мне второй писать и читать легче.
print({i: i * i for i in range(1, 20) if not i % 2})
res = {}
for i in range(1, 20):
if i % 2 == 0:
res.setdefault(i, i * i)
print(res)
Ответы (3 шт):
Простые алгоритмы можно и нужно записывать сокращено, но только чтобы код был читаем
Такие вопросы отпадут сами собой, когда придется исправлять/дополнять свой код, написанный несколько лет назад.
Я не вижу ни одной причины писать в одну строку в реальных программах, которые будут использоваться более одного раза.
Для соревнований, в бумажных черновиках и для одноразовых скриптов запись в одну строку нормальна.
Ответ на вопрос
стоит ли стараться писать код в одну строку?
однозначно, да, стоит, но только там где это необходимо, или удобно, или читабельно, или соответствует философии python (собирательное состояние).
Однострочник?
это кусок кода, который это выполняет задачу, используя всего одну строку синтаксиса Python. Но можно, же, сказать, что каждая строка так или иначе выполняет некую задачу (присваивание, мат. операции, логические операции и проч.) и будете правы. Только под однострочниками (en. "one-liner") понимают более "сложные" операции, которые могут включать как множественные присваивания, так и целые циклы (генераторы итерируемых объектов)
Какие бывают, примеры
Присваивание
a, b, c = [1, 2, 3], 2, "howto"
Генераторы (comprehensions) списков, словарей, множеств
могут также включать условия
# list
squares_list = [x**2 for x in range(10)]
# dict
squares_dict = {x: x**2 for x in range(1, 6)}
# set
squares_set = {x**2 for x in range(10)}
; как инструмент для однострочников
Примеры обычно включают вызов из командной строки (shell, cmd, PowerShell etc.)
python -c "a, b, c = [1, 2, 3], 2, 'howto'; print(c)"
и еще много всяких примеров
можно заглянуть Powerful Python One-Liners
Где, когда и как использовать
На самом деле здесь достаточно сложно сказать, что в определенном случае просто необходимо писать однострочник, а другом случае ни в коем случае его писать нельзя. Но существует несколько ориентиров для определения необходимости
- Документация. Это основное на, что стоит опираться и хороший пример здесь будет как раз с генераторами. Например, для list comprehensions. В документации описаны случаи где и как применяются такие конструкции, и имеются примеры читабельности кода.
- Собственное восприятие кода. Поскольку это достаточно субъективное понятие, то здесь мой выбор придерживаться PEP8 и не вылазить за 79 символов. А так же еще пара правил (вот так чувствую): не больше 2 условий в генераторе, не создавать объекты самонаписанных классов в генераторе (не является паттерном и вижу в практике как такое используется и проблем с этим не вижу)
- Понимание конструкций и как используются ресурсы. Пример - генераторы. Можете провести проверку по времени использования разных конструкций и оценить результаты. Пример для возведения в степень
loop_time_1m = timeit.timeit(
"squares = []\nfor x in range(1_000_000): squares.append(x**2)",
number=1
listcomp_time_1m = timeit.timeit(
"squares=[x**2 for x in range(1_000_000)]",
number=1)
print(loop_time_1m, listcomp_time_1m)
#out
0.5330905802547932 0.4542330130934715
- Элегантность решений. Субъективно, но иногда действительно красиво и ты не можешь сказать, что это не так. Под рукой нет примера сейчас, увижу -> добавлю сюда