3 распространенных недостатка Python, которых нужно избегать

3 августа, 2020

Подписывайся на наш канал в Telegram, чтобы ежедневно совершенствоваться в Python. Там выходят задачи, полезные советы и сливы платных курсов - перейти

Несмотря на то, что Python является наиболее востребованным языком программирования с легким синтаксисом , он может иногда удивлять разработчиков. 

Вы можете быть гуру в Python или просто новичком. В обоих случаях вы, вероятно, допустили бы следующие ошибки. 

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

Доступ к значениям словаря с использованием синтаксиса квадратных скобок

Словари – это типы данных, используемые для хранения неупорядоченного набора пар ключ-значение.

Хотя словари принципиально сильно отличаются от списков, все же легко увязнуть и использовать обозначение в квадратных скобках для доступа к значениям.

Хотя вначале это не выглядит вредно, но при доступе к значениям в квадратных скобках можно легко получить следующее, KeyError как показано ниже:

>>> fruits = {'a': 'apple', 'b': 'banana'}
>>> fruits['a'] 
#apple
>>> fruits['c']
#raises KeyError: 'c'

В случае словарей KeyError означает, что искомый ключ не может быть найден. Такие ошибки довольно распространены, особенно если вы передаете динамический ключ.

Хотя вы можете избежать таких ошибок, используя try-exceptблоки, но это не Python. Кроме того, это приведет только к лишнему коду.

Решение: используйте метод get()

Вы можете просто получить доступ к значениям словаря, передав ключ внутри метода get(). Если ключ не найден, он просто вернет None вместо того, чтобы выдать ошибку.

При желании вы также можете передать значение по умолчанию в качестве второго аргумента метода.

fruits.get('m') #returns None
fruits.get('m', 'mango')

Для конкретных случаев, когда вы хотите изменить словарь, если ключ отсутствует, вы можете использовать метод setdefault().

Если ключ существует, setdefault() возвращает соответствующее значение. В противном случае он устанавливает значение по умолчанию (None или то, что вы указываете) для этого ключа и обновляет словарь на месте.


Примитивный C-стиль для циклов

Циклы for являются наиболее часто используемым потоком управления на любом языке программирования.

Часто разработчики, особенно при переходе с другого языка, заканчивают тем, что используют примитивный стиль для циклов довольно инстинктивно, как показано ниже:

numbers = [1,4,7,10,15]
for i in range(len(numbers)):   
    print(numbers[i])

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

Списки Python итеративны по умолчанию, поэтому вы можете напрямую использовать следующее:

for n in numbers:
    print(n)

Теперь вы можете получить доступ к значениям индекса. В таких случаях вы можете использовать функцию enumerate(), передавая список Python, как показано ниже:

for i, num in enumerate(numbers):
    print(i, num)

В случае словарей, если вы хотите получить доступ только к значениям, используйте .values(). В противном случае, вызовите items(), если вы хотите перебрать и ключ, и значение.

for k, fruit in fruits.items()

Другая встроенная функция zip() может использоваться, когда вы хотите выполнить итерацию по двум или более спискам одновременно и получить доступ к элементам в форме кортежа.

Изменяемые аргументы по умолчанию

Использование аргументов по умолчанию является довольно распространенной ошибкой в ​​Python, когда вы устанавливаете предопределенное значение в определении функции, чтобы предотвратить длинный список аргументов во время вызова.

Теперь со списками Python, словарями и наборами, которые являются изменяемыми типами, установка значения по умолчанию может удивить вас неожиданными результатами, как показано ниже:

def addElements(x, a=[]):
    a.append(x)
    return a
listA = addElements(5)
#prints [5]
listB = addElements(10)
# [5, 10]

Как вы можете видеть, мы надеялись, что второй список будет содержать только один элемент, но он также содержит предыдущий элемент.

Проблема с изменяемыми объектами по умолчанию в Python заключается в том, что они оцениваются только один раз, когда функция была определена.

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

Чтобы избежать таких неприятных ошибок, лучше установить значение None  по умолчанию и назначить изменяемую переменную внутри функции.

Вот что вы должны сделать вместо этого:

def addElements(x, a=None):
    if a is None:
        a = []
    a.append(x)
    return a

Вывод

Мы видели три довольно распространенных ошибки, которые делают программисты Python. Важно понимать и использовать идиоматическую силу языка.

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


Совершенствуй знания каждый день у нас в Телеграм-каналах

Вопросы, реклама — VK | Telegram