10 распространенных ошибок в Python в 2023 году

Кортежи в Python Изучение

В этой статье мы поделимся 10 наиболее распространенными ошибками Python в 2023 году. Но что это за распространенные ошибки Python? И что еще более важно, вы их делаете?

Будь то ошибка новичка, например, забывание двоеточий, или что-то более сложное, например, изменение списка во время итерации по нему, мы углубимся в ошибки новичков, которых вам следует избегать!

Мы также включили подробные объяснения каждой из этих распространенных ошибок Python, а также примеры кода и рекомендации по их предотвращению.

Итак, новичок вы или профессионал, переходящий на Python, читайте дальше, чтобы узнать, как избежать этих распространенных ошибок Python!

Как избежать распространенных ошибок Python?

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

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

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

Вы даже можете использовать помощника по кодированию с использованием искусственного интеллекта, такого как GitHub Copilot или Amazon CodeWhisperer, чтобы запросить проверку работоспособности вашей кодовой базы, и это может помочь вам обнаружить распространенные ошибки.

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

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

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

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

Давайте теперь углубимся в наш список из 10 наиболее распространенных ошибок Python, чтобы увидеть, допускаете ли вы какую-нибудь из них!

1. Назначение ключей изменяемого словаря

В Python ключи словаря должны быть неизменяемыми. Это означает, что вы не можете использовать изменяемые типы, такие как списки, в качестве ключей словаря. Если вы попытаетесь это сделать, вы увидите ошибку TypeError.

Почему это? Все просто: словари полагаются на хеширование, требуя, чтобы ключи имели постоянные значения, чтобы обеспечить предсказуемость процесса хеширования.

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

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

»’
Hackr.io: 10 Most Common Python Mistakes:
Assigning Mutable Dictionary Keys: Example
»’
my_lst = [1, 2, 3]
my_dct = {my_lst: ‘value’} # This will raise a TypeError

Как мы можем это исправить? Что ж, если вам нужно использовать коллекцию в качестве словарного ключа, используйте кортеж! По сути, это неизменяемый список, что делает его идеальной заменой.

Тем не менее, важно помнить, что элементы кортежа также должны быть неизменяемыми, чтобы кортеж можно было хешировать!

Например, если бы у вас был кортеж списков, это тоже было бы проблемой.

»’
Hackr.io: 10 Most Common Python Mistakes:
Assigning Mutable Dictionary Keys: Solution
»’
my_tup = (1, 2, 3)
my_dct = {my_tup: ‘value’} # This is the correct approach

2. Забываем скобки при вызове функций

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

Но когда вы ссылаетесь на функцию без круглых скобок, вы ссылаетесь на объект функции, а не вызываете ее.

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

Давайте рассмотрим простой пример, чтобы проиллюстрировать это. Вы можете видеть, что когда мы ссылаемся на объект функции и печатаем, мы получаем местоположение объекта функции в памяти.

’’’

»’
Hackr.io: 10 Most Common Python Mistakes:
Forgetting Parentheses To Call Functions: Example
»’
def greet():
return ‘Hello!’

message = greet
# This assigns the function object to the variable, not its return value
print(message)
# This will print something like: <function greet at 0x7f4c6d0d59d0>

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

»’
Hackr.io: 10 Most Common Python Mistakes:
Forgetting Parentheses To Call Functions: Solution
»’
def greet():
return ‘Hello!’

message = greet()
# This calls the function and assigns its return value to the variable
print(message)
# This will print: Hello!

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

3.Забываем двоеточия

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

Читайте также:  Учебник о массивах в C++ — от основ до примеров кода

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

Но без двоеточия Python не распознает последующий блок с отступом как принадлежащий управляющей структуре, что вызывает синтаксическую ошибку. Нет, буэно!

Давайте посмотрим на некоторые примеры этой распространенной ошибки Python.

»’
Hackr.io: 10 Most Common Python Mistakes:
Forgetting Colons: Example
»’
def greet() # Missing colon here
return ‘Hello!’

if True # Missing colon here
print(‘This is true!’)

for i in range(3) # Missing colon here
print(i)

Но, к счастью, все это очень легко исправить, как показано в кодовом решении ниже.

»’
Hackr.io: 10 Most Common Python Mistakes:
Forgetting Colons: Solution
»’
def greet(): # Corrected with a colon
return ‘Hello!’

if True: # Corrected with a colon
print(‘This is true!’)

for i in range(3): # Corrected with a colon
print(i)

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

4. Объединение строк и целых чисел

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

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

Давайте рассмотрим простой пример, иллюстрирующий эту ошибку. Вы можете видеть, что мы попытались объединить два строковых объекта с целым числом.

На первый взгляд это выглядит нормально, поскольку мы просто хотим создать новый строковый объект, но при таком подходе мы всегда будем видеть ошибку TypeError.

»’
Hackr.io: 10 Most Common Python Mistakes:
Concatenating Strings And Integers: Example
»’
age = 25
message = ‘I am ‘ + age + ‘ years old.’ # This will raise a TypeError

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

Начнем с приведения типов целочисленной переменной, поскольку при этом целое число преобразуется в строку, что позволяет нам осуществлять объединение без ошибок.

Второй, иногда более удобный подход — использование форматированного строкового литерала или, более кратко, f-строки.

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

Это определенно одна из тех концепций Python, о которых мне хотелось бы знать раньше!

’’’

Hackr.io: 10 Most Common Python Mistakes:

Concatenating Strings And Integers: Solution

»’
Hackr.io: 10 Most Common Python Mistakes:
Concatenating Strings And Integers: Solution
»’
age = 25

# Using str() to convert the integer
message_1 = ‘I am ‘ + str(age) + ‘ years old.’
print(message_1) # Outputs: I am 25 years old.

# Using formatted string (f-string in Python 3.6+)
message_2 = f’I am {age} years old.’
print(message_2) # Outputs: I am 25 years old.

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

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

5. Путаница с операторами равенства и присваивания

Поскольку это два наиболее широко используемых оператора Python, новички в программировании могут легко спутать операторы равенства (==) и присваивания (=).

Проблема здесь в том, что оператор равенства проверяет, являются ли два значения одинаковыми, а оператор присваивания присваивает значение переменной.

Это означает, что один вернет логическое значение, а другой просто выполнит присваивание.

Вы, наверное, уже это знаете!

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

И если вы все же допустите эту ошибку Python, вы внесете в свою программу труднообнаружимые ошибки или синтаксические ошибки, а это совсем не весело!

Давайте рассмотрим простой пример, чтобы увидеть, как эта распространенная ошибка Python может проникнуть в ваше программирование.

В этом примере мы хотим проверить, равна ли переменная целочисленному значению, но мы использовали оператор присваивания в условном операторе.

»’
Hackr.io: 10 Most Common Python Mistakes:
Confusing Equality And Assignment Operators: Example
»’

x = 5
if x = 10: # This will raise a syntax error
print(‘x is 10’)
else:
print(‘x is not 10’)

К счастью, эту ошибку Python очень легко исправить, поскольку нам просто нужно заменить оператор присваивания на оператор равенства.

»’
Hackr.io: 10 Most Common Python Mistakes:
Confusing Equality And Assignment Operators: Solution
»’

x = 5

# Correctly using the equality operator
if x == 10:
print(‘x is 10’)
else:
print(‘x is not 10’)

6. Непонимание области видимости переменных

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

Для новичков в Python, особенно для тех, кто перешел с языков с другими правилами области видимости, понимание областей видимости Python может оказаться сложной задачей!

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

Давайте рассмотрим простой пример, чтобы более четко понять эту ошибку Python.

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

В этом сценарии мы определили глобальную и локальную переменную с одинаковым именем. Это всегда плохая идея, но давайте посмотрим, что будет дальше.

Читайте также:  "Основы и использование чисто виртуальных функций и абстрактных типов в программировании"

Когда мы вызываем функцию, оператор печати указывает, что значение переменной было изменено.

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

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

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

»’
Hackr.io: 10 Most Common Python Mistakes:
Misunderstanding Variable Scopes: Example
»’

x = 10 # Global variable

def change_x():
x = 5 # Local variable with the same name
print(f’Inside function: x = {x}’)

change_x() # Output: Inside function: x = 5

print(f’Outside function: x = {x}’) # Output: Outside function: x = 10

Как мы можем исправить эту распространенную ошибку Python? Давайте рассмотрим решение кода с двумя разными подходами.

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

Это позволяет нам без проблем изменять глобальную переменную.

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

Мы также решили не использовать одинаковые имена для локальных и глобальных переменных, поскольку это всегда хорошая практика!

»’
Hackr.io: 10 Most Common Python Mistakes:
Misunderstanding Variable Scopes: Solution
»’

# Solution 1: Using the ‘global’ keyword
x = 10

def change_global_x():
global x
x = 5
print(f’Inside function (global x changed): x = {x}’)
# Output: Inside function (global x changed): x = 5

change_global_x()
print(f’Outside function: x = {x}’) # Output: Outside function: x = 5

# Solution 2: Using different names to avoid confusion
y = 10

def change_local_y(local_y):
local_y = 5
print(f’Inside function: local_y = {local_y}’)
# Output: Inside function: local_y = 5
return local_y

y = change_local_y(y)
print(f’Outside function: y = {y}’) # Output: Outside function: y = 5

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

Если вам нужно изменить глобальную переменную внутри функции, используйте ключевое слово global или передайте переменную в качестве аргумента функции.

7. Изменение списка во время итерации по нему

Это одна из ошибок Python, о которой вы не заметите, пока не столкнетесь с ней, но когда вы это сделаете, вам захочется ее избежать!

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

Поверьте, вы захотите избежать этой проблемы!

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

Чтобы помочь вам избежать этой распространенной ошибки Python, давайте рассмотрим простой пример.

В этой программе мы просто хотим удалить из списка все четные элементы и делаем это с помощью условной проверки и оператора del.

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

Почему это происходит? Ну, список сжимается каждый раз, когда элемент удаляется, но цикл продолжается с исходными индексами из исходной длины списка.

’’’

Hackr.io: 10 Most Common Python Mistakes:

Modifying A List While Iterating Over It: Example

’’’

numbers = [1, 2, 3, 4, 5]

for i in range(len(numbers)):

if numbers[i] % 2 == 0: # Remove even numbers

del numbers[i]

Как мы можем исправить эту ошибку Python? Самый простой способ избежать этой проблемы — перебрать копию списка, как показано в решении ниже.

»’
Hackr.io: 10 Most Common Python Mistakes:
Modifying A List While Iterating Over It: Solution
»’

numbers = [1, 2, 3, 4, 5]
for num in numbers.copy():
if num % 2 == 0: # Remove even numbers
numbers.remove(num)

print(numbers) # Outputs: [1, 3, 5]

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

8. Использование циклов для понимания списков

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

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

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

Давайте рассмотрим простой пример, чтобы проиллюстрировать этот момент.

В этой программе мы хотим создать список квадратов из другого списка чисел, и для выполнения этой работы мы выбрали стандартный цикл for.

»’
Hackr.io: 10 Most Common Python Mistakes:
Using Loops Over List Comprehensions: Example
»’

numbers = [1, 2, 3, 4, 5]
squares = []
for num in numbers:
squares.append(num * num)
print(squares) # Outputs: [1, 4, 9, 16, 25]

Теперь, хотя код и правильный, он гораздо более многословен, чем необходимо, что делает его менее Pythonic и, следовательно, ошибкой!

Для таких простых преобразований мы можем использовать понимание списка, чтобы предложить более лаконичное и Pythonic решение, как показано ниже.

Посмотрите, какой красивый короткий и простой код! Само определение Pythonic!

»’
Hackr.io: 10 Most Common Python Mistakes:
Using Loops Over List Comprehensions: Solution
»’

# Using a list comprehension
numbers = [1, 2, 3, 4, 5]
squares = [num ** 2 for num in numbers]
print(squares) # Outputs: [1, 4, 9, 16, 25]

9. Не использовать строки документации

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

Читайте также:  "SIMD технология - применение и уникальные особенности"

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

Это облегчит другим разработчикам (и вам в будущем) понимание того, как работают определенные функции, классы или модули.

Но, несмотря на очевидные преимущества, на самом деле код без документации встречается чаще, чем вы думаете.

Это ошибка Python, которую вам следует избегать! Если не только для себя, а на благо своей команды!

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

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

»’
Hackr.io: 10 Most Common Python Mistakes:
Not Using Docstrings: Example
»’

def rectangle_area(width, height):
return width * height

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

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

»’
Hackr.io: 10 Most Common Python Mistakes:
Not Using Docstrings: Solution
»’

def rectangle_area(width, height):
«»»
Calculates the area of a rectangle.

Params:
— width (float): The rectangle width.
— height (float): The rectangle height.

Returns:
— float value: The area of the rectangle.
«»»
return width * height

Главный урок — выработать привычку документировать свой код с помощью строк документации, особенно для функций, классов и модулей.

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

В профессиональной среде хорошо документированный код часто является признаком качества.

10. Необработка исключений

Давайте закончим наш список распространенных ошибок Python обработкой исключений.

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

Если вы не предвидите и не обработаете потенциальные исключения корректно, ваш код может сломаться. Это плохо!

На самом деле нет оправдания пропуску этого этапа процесса разработки.

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

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

Давайте рассмотрим простой пример, иллюстрирующий проблемы, связанные с этой распространенной ошибкой Python.

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

»’
Hackr.io: 10 Most Common Python Mistakes:
Not Handling Exceptions: Example
»’

def divide_numbers(numerator, denominator):
return numerator / denominator

result = divide_numbers(10, 0)
print(result) # Throws ZeroDivisionError

Как мы можем избежать этого? Давайте рассмотрим решение, которое использует блоки try-Exception для перехвата потенциальных исключений и корректной их обработки.

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

»’
Hackr.io: 10 Most Common Python Mistakes:
Not Handling Exceptions: Solution
»’

def divide_numbers(numerator, denominator):
try:
return numerator / denominator
except ZeroDivisionError:
return «Denominator cannot be zero.»

result = divide_numbers(10, 0)
print(result) # Outputs: Denominator cannot be zero.

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

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

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

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

Заключение

Итак, вот и 10 самых распространенных ошибок Python в 2023 году. Как вы справились? Допускали ли вы какие-либо из этих ошибок Python в своем собственном коде?

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

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

Мы надеемся, что вы нашли это полезным! Удачи, избегая этих распространенных ошибок Python в будущем!

Часто задаваемые вопросы

Каковы наиболее распространенные ошибки в Python?

Если мы говорим о категориях ошибок, то это могут быть синтаксические ошибки или исключения во время выполнения.

Если мы говорим об ошибках, то наиболее распространенными из них являются назначение изменяемых ключей словаря, забывание круглых скобок для вызова функций, забывание двоеточий, объединение строк и целых чисел, путаница с операторами равенства и присваивания, а также другие, которые мы рассмотрели выше.

Как найти ошибки в коде Python?

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

Оцените статью
Блог о программировании
Добавить комментарий