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):
...     ...
...

Вот и всё!

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *