Введение

Python относительно прост в освоении, но, учитывая его обширный функционал, в нём легко допустить ошибку. Кроме того, ошибки в течение длительного времени могут оставаться незамеченными. Эта статья написана в дополнение к предыдущей » Избегайте этих нелепых ошибок при работе сзнер Python «.

Сегодня я поделюсь ошибками, которые легко допустить при работе с Python 3.8.

№1: +=

И я зачастую пренебрегал += операндом. Кажется, слишком легко согласиться с тем, что сложение и присвоение должны выполняться разными операндами. К счастью, Python (как и многие другие языки программирования) поддерживает операторы, выполняющие одновременно математические операции и операции присвоения.

Вместо

x = x + 5

пишите

x += 5

№2: Обозначение позиционного аргумента

В большинстве современных сценарных языков существует два основных типа аргументов, используемых в качестве параметров функций:

  1. позиционный аргумент;
  2. ключевое слово.

До релиза Python 3.8 сделать аргумент позиционным по умолчанию было невозможно. Однако после обновления Python 3.8 с помощью знака \ можно обозначить все предыдущие аргументы как позиционные. Не пренебрегайте позиционными аргументами — это практичная часть хорошего кода Python с прекрасной производительностью. Если есть одна вещь, которую код должен компенсировать в Python, особенно в машинном обучении, так это производительность.

Аргументы ключевого слова вычисляются один раз при определении функции. Это может особенно пагубно сказаться на производительности рекурсивных алгоритмов. И, если вы пишете стоимостные функции, позиционные аргументы необходимы. Это не значит, что ключевые слова вообще нельзя использовать, но лучше заменять их позиционными параметрами, когда это возможно.

Вместо

def numbers(custom, five=5,ten=10,fifteen=15):
    total = five + ten + fifteen + custom
    return(total)

пишите

def numbers(custom,\,five=5,ten=10,fifteen=15):
    total = five + ten + fifteen + custom
    return(total)

Также важно помнить, что эта фича довольно новая, поэтому концепция использования позиционных аргументов для повышения производительности работает только для версий Python 3.8 и выше.

№3: Return в init

Хотя это и не очень распространённая ошибка и, возможно, свойственна только новичкам, но я встречал людей, пытавшихся выполнять return в функции инициализации. В объектно-ориентированном мире Python функция __init__ вызывается каждый раз при создании экземпляра класса. Функция init может быть невероятно полезна при задании переменных, перемещении данных и создании типов. С большой мощностью приходит большая ответственность. Функцию __init__ стоит использовать для инициализации класса, а не для мониторинга, циклов или управления. Пожалуйста, (я встречал опытных людей, совершавших эту ошибку!)

не выполняйте return в init!

Это попросту не имеет никакого смысла!

№4: Циклические зависимости

При написании большого пакета Python с различными частями, выполняющими сходные задачи, пакеты становятся связаны друг с другом. Из-за этого могут возникать проблемы и циклические зависимости. При этом различные ячейки, окружающие модуль, пытаются получить доступ друг к другу.

№5: Пробелы или отступы?

Как вы знаете, Python использует отступы, а не разделители для выделения кода внутри другого кода. Для многих это облегчает написание и чтение кода, хотя я брезгую этой практикой. В других языках, однако, я обычно использую отступы (клавишу табуляции). Но согласно PEP8 вы должны использовать для отступа четыре пробела. Честно говоря, это то правило, которому я подчиняюсь при работе над проектом, в котором задействовано много людей. Для меня не так важно, использовать пробелы или отступы, но официально мы должны использовать пробелы. Лучше соответствовать стандартам PEP8 при написании кода и при работе в крупном проекте со множеством пользователей.

№6: Итерация в блоках

При выполнении итеративного цикла for намного проще изложить свои мысли в коде с помощью написания полноформатного цикла. Но в целом, если производимые операции занимают только одну строку, лучше и цикл писать в одну строку. Это не только сделает код намного изящнее, но и повысит производительность. 

Вместо

for i in x:
    i += 5

Пишите

[i + 5 for i in x]

№7: Интернированные строки

В последнем примере коснёмся интернированных строк. В некоторых случаях Python пытается повторно использовать неизменяемый объект, и интернирование строки является именно таким случаем. Все строки длины 1 интернированы. Строка, содержащая что-либо, кроме символов ASCII, цифр и нижнего подчёркивания, не интернируется.

Я попытался создать два различных объекта, a и b, однако Python сделал нечто другое — он фактически сделал b указателем на a вместо создания новой строки. Но не сделал этого при добавлении символа ASCII:

Имейте это в виду при создании неизменяемых строк, в своё время этот нюанс вызвал у меня немало головной боли.

Читайте также:


Перевод статьи Emmett Boudreau: 7 Modern Python Mistakes To Fix NOW!

Предыдущая статьяХватит использовать Pandas, пора переходить на Spark + Scala!
Следующая статьяИспользование хуков Git для улучшения процесса разработки