Все мы через это проходили. Вот 10 ошибок, которые делает почти каждый начинающий Python-разработчик — и как их избежать.
1. Изменяемый аргумент по умолчанию
Одна из самых коварных ловушек Python:
# ❌ Неправильно
def add_item(item, items=[]):
items.append(item)
return items
print(add_item("a")) # ["a"]
print(add_item("b")) # ["a", "b"] — сюрприз!
# ✅ Правильно
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
Список создаётся один раз при определении функции, а не при каждом вызове. Используйте None как значение по умолчанию.
2. Сравнение с None через ==
# ❌ Работает, но неправильно
if value == None:
pass
# ✅ Правильно — None единственный, используйте is
if value is None:
pass
3. Изменение списка во время итерации
numbers = [1, 2, 3, 4, 5]
# ❌ Пропустит элементы
for num in numbers:
if num % 2 == 0:
numbers.remove(num)
# ✅ Итерируйте по копии
for num in numbers[:]:
if num % 2 == 0:
numbers.remove(num)
# ✅ Или используйте list comprehension
numbers = [num for num in numbers if num % 2 != 0]
4. Неправильное использование except
# ❌ Ловит ВСЕ исключения, включая KeyboardInterrupt
try:
do_something()
except:
pass
# ✅ Ловите конкретные исключения
try:
do_something()
except ValueError as e:
print(f"Ошибка значения: {e}")
except FileNotFoundError:
print("Файл не найден")
5. Конкатенация строк в цикле
# ❌ Медленно — создаёт новую строку на каждой итерации
result = ""
for word in words:
result += word + " "
# ✅ Используйте join — намного быстрее
result = " ".join(words)
6. Не использовать enumerate()
fruits = ["яблоко", "груша", "банан"]
# ❌ По-старинке
i = 0
for fruit in fruits:
print(f"{i}: {fruit}")
i += 1
# ✅ Pythonic way
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
7. Проверка типа через type() вместо isinstance()
# ❌ Не учитывает наследование
if type(x) == int:
pass
# ✅ Правильно
if isinstance(x, int):
pass
# isinstance также проверяет несколько типов сразу
if isinstance(x, (int, float)):
pass
8. Игнорирование list comprehension
# ❌ Многословно
squares = []
for x in range(10):
if x % 2 == 0:
squares.append(x ** 2)
# ✅ Лаконично и быстрее
squares = [x**2 for x in range(10) if x % 2 == 0]
9. Неправильное копирование списков
original = [1, 2, 3]
# ❌ Это не копия — оба имени указывают на один список
copy = original
copy.append(4)
print(original) # [1, 2, 3, 4] — изменился!
# ✅ Мелкая копия
copy = original[:]
copy = original.copy()
copy = list(original)
# ✅ Глубокая копия для вложенных структур
import copy
deep_copy = copy.deepcopy(original)
10. Не читать сообщения об ошибках
Это не ошибка кода, но самая частая «ошибка» новичков — игнорировать traceback. Python даёт точную информацию о том, что пошло не так и где. Читайте снизу вверх: последняя строка — ошибка, выше — где она произошла.
Хочешь отработать эти паттерны на практике? На Algolit — задачи по Python с мгновенной проверкой и разбором типичных ошибок.