9 вещей, которые показывают, что вы не являетесь профессиональным разработчиком Python

Python – один из самых популярных языков программирования, его используют в веб-разработке, науке о данных, искусственном интеллекте, робототехнике и многих других областях. В этой статье вы узнаете, как исправить вредные привычки, которые вы закрепили с годами или принесли из других языков программирования.
Форматирование строк вручную
Чаще всего начинающие питонисты используют знак + при объединении двух строк.
>>> name = "Ridwan"
>>> age = "22"
>>> print("My Name is " + name + " and I am " + age + " years old")
My Name is Ridwan and I am 22 years old
Вместо знака + используйте строку f, которая сделает ваш код более читаемым, лаконичным и менее склонным к ошибкам.
>>> print(f"My Name is {name} and I am {age} years old")
My Name is Ridwan and I am 22 years old
Использование изменяемых аргументов по умолчанию
В Python, когда вы передаете в функцию в качестве аргумента изменяемое значение, аргумент по умолчанию изменяется при каждом вызове функции. Такими изменяемыми аргументами обычно являются списки или словари.
Взгляните на пример ниже:
>>> def append(n, l=[]):
... l.append(n)
... return l
...
После определения функции append с изменяемым аргументом l = [] каждый раз, когда вы вызываете функцию со значением n, она изменяет значение l по умолчанию.
>>> l1 = append(0)
>>> l1
[0]
При следующем вызове функции с другим значением n вы увидите, что предыдущее значение было добавлено к аргументу пустого списка.
>>> l2 = append(1)
>>> l2
[0, 1]
Эту проблему можно решить, переписав код в виде,
>>> def append(n, l = None):
... if l is None:
... l = []
... l.append(n)
... return l
...
>>> l1 = append = [0]
>>> l2 = append = [1]
>>> l1,l2
([0], [1])
Теперь аргумент l установлен в None, при любом вызове функции, даже если l изменяется, он переназначается как None, а затем ему присваивается значение пустого списка.
Отказ от использования понятий
Python comprehension предоставляет вам короткий и лаконичный способ построения последовательностей. Насколько я знаю, Python поддерживает 4 типа comprehension:
- Списочные постижения
- Словарные постижения
- Постижения множеств
- Постижения генератора
Приведенный ниже код делит значения в словаре на 2:
>>> numbers = {}
>>> for i in range(10):
... numbers[i] = i/2
...
>>> numbers
{0: 0.0, 1: 0.5, 2: 1.0, 3: 1.5, 4: 2.0, 5: 2.5, 6: 3.0, 7:
3.5, 8: 4.0, 9: 4.5}
Приведенный выше код можно записать в виде одной строки,
>>> {i: i/2 for i in range(10)}
{0: 0.0, 1: 0.5, 2: 1.0, 3: 1.5, 4: 2.0, 5: 2.5, 6: 3.0, 7:
3.5, 8: 4.0, 9: 4.5}
Так что перестаньте усложнять себе жизнь и начните пользоваться пониманием.
Проверка на равенство вместо идентичности
Учитывая,
a = [1, 2, 3]
b = [1, 2, 3]
Если я попрошу вас проверить, идентичны ли две переменные, первое, что придет вам в голову, – это,
>>> a == b
True
Дело в том, что вам нужно знать разницу между тождеством и равенством.
Две переменные могут быть равны, но не идентичны.
Если проверить адреса памяти a и b,
>>> id(a), id(b)
(1838093945856, 1838093487488)
Вы можете видеть, что у них разные адреса, несмотря на то, что они имеют один и тот же объект.
Именно по этой причине, когда вы запускаете,
>>> a == b
True
Вы получаете True, но когда вы запускаете
>>> a is b
False
Вы получаете False, a и b равны, но не одинаковы.
В случае, когда у вас есть,
>>> c = [1,2,3]
>>> d = c
>>> id(c), id(d)
(1838089019712, 1838089019712)
Вы видите, что c и d равны и идентичны, объект в c также назначен в d.
>>> c == d
True
>>> c is d
True
Это означает, что у c и d одинаковые значения и адреса памяти.
Следовательно, можно сказать, что c идентичен и равен d.
Все это я написал для того, чтобы вы поняли разницу между is и ==. Первое используется при проверке идентичности, а второе – при проверке равенства.
Все идентичные переменные равны, но не все равные переменные идентичны
Не использовать распаковку кортежей
Каждый раз, когда вы создаете кортеж в Python, это называется упаковкой кортежа,
>>> a_tuple = 1,2,3
>>> a_tuple
(1, 2, 3)
Эти значения могут быть извлечены обратно в различные переменные путем распаковки
>>> x = a_tuple[0]
>>> y = a_tuple[1]
>>> z = a_tuple[2]
>>> print(x, y, z)
1, 2, 3
Вместо того чтобы распаковывать элементы кортежа с помощью нескольких строк кода, вы можете сделать это в одной строке кода.
>>> x,y,z = a_tuple
>>> print(x, y, z)
1, 2, 3
Создание собственной переменной Index Counter
Это обычное дело для тех, кто пришел из других языков программирования: вас просят создать переменную index counter, и вы вводите что-то вроде;
>>> a_list = [1,2,3,4,5,6,7,8,9,10]
>>> index = 0
>>> for elem in a_list:
... print(index, elem)
... index += 1
...
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
Вместо этого используйте функцию enumerate, чтобы ваш код выглядел по-питоновски;
>>> for index, elem in enumerate(a_list):
... print(index, elem)
...
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
Использование Print Statement вместо модуля ведения журнала
Это может не иметь значения в небольших проектах, но обязательно поможет вам в больших.
Вместо того чтобы засорять свой код операторами печати, используйте протоколирование.
>>> print('This is a warning message')
This is a warning message
>>> print('This is an error message')
This is an error message
>>> print('This is a critical message')
This is a critical message
Ведение журнала помогает отображать полезные сообщения для пользователей, чтобы добавить больше контекста и понимания того, что происходит в кодовой базе.
>>> import logging
>>> logging.warning('This is a warning message')
WARNING:root:This is a warning message
>>> logging.error('This is an error message')
ERROR:root:This is an error message
>>> logging.critical('This is a critical message')
CRITICAL:root:This is a critical message
Импорт функций и классов в именованный модуль с помощью import *.
Эта вредная привычка чаще всего встречается среди новичков.
Импорт с использованием import * повреждает ваше пространство имен, импортируя все функции и классы из этого именованного модуля в ваш код, что может привести к конфликту с функциями, которые вы определяете, или функциями других импортируемых библиотек.
Не следовать за pep8
Большинство из нас виновны в этом,
Прежде чем меня отменят 😂 , я знаю, что некоторые из моих кодов в этой статье могут нарушать правила PEP-8, но правда горька и должна быть сказана, следование стилю и рекомендациям PEP-8 облегчает другим людям чтение и понимание вашего кода.
Не рекомендуется
>>> def function():
... x = [1,2,3]
... y= [2,3,5]
... z = [1, 2,3]
...
>>> def value(x = 7):
... ...
...
Рекомендуется
>>> def function():
... x = [1, 2, 3]
... y = [2, 3, 5]
... z = [1, 2, 3]
...
>>> def number(x=7):
... ...
...
Вот и всё!