7 ошибок в коде на Python, которые нужно исправить
Python — один из самых популярных языков программирования, который завоевал доверие разработчиков благодаря своей простоте, читабельности и мощным возможностям. Но, как и в любом другом языке, при работе с Python можно столкнуться с рядом распространенных ошибок, которые могут не только замедлить процесс разработки, но и привести к неожиданным результатам.
В этой статье мы рассмотрим частые ошибки, которые допускают как новички, так и опытные программисты, и разберем, как их избежать.
1. Не использовать итераторы
Почти все так или иначе совершали эту ошибку, вне зависимости от опыта в других языках программирования.
Типовая задача: пробежаться посписку в цикле for
.
Стандартный подход - создать счетчик i
и получить каждый элемент списка.
Правильный подход - вспомнить, что list
- итерируемый объект.
Правильно:
for element in list_: foo(element)
Неправильно:
for i in range(len(list_)):
foo(list_[i])
2. Не использовать ELSE в цикле
Python позволяет использовать блок else
в циклах for
.
Если цикл for
завершился без прерывания операторами break
или return
, то будет выполнен блок else
.
Правильно:
l = [1, 2, 3]
num = 4
for n in l:
if n == num :
print("num found")
break
else:
print("num not found")
Неправильно:
l = [1, 2, 3]
num = 4
found = False
for n in l:
if n == num:
found = True
print("num found")
break
if not found:
print("num not found")
3. Неправильное использование IF-ELSE
Когда вы проверяете некоторое условие внутри функции, иногда нет необходимости писать блок if-else
- порой достаточно использовать только if
.
Правильно:
def func(a):
if a > 5:
return True
return False
Неправильно:
def func(a):
if a > 5:
return True
else:
return False
4. Возвращать разные типы данных в RETURN
Если вы возвращаете разные типы данных в блоке return
в зависимости от ситуации, то это приводит к усложнению кода и ошибкам. Чтобы избежать таких ситуаций, при возникновении ошибки возбуждайте исключение.
Правильно:
def get_code(pswrd):
if pswrd != "bicycle":
raise ValueError
else:
return "42"
try:
code = get_code("car")
print(f"code is {code}")
except ValueError:
print("Wrong pswrd")
Неправильно:
def get_code(pswrd):
if pswrd != "bicycle":
return None
else:
return "42"
code = get_code("car")
if code is None:
print("Wrong pswrd")
else:
print(f"The code is {code}")
5. Неверное сравнение с TRUE
Самый лучший способ проверить, является ли переменная или выражение True
> - использовать паттерн if cond: expr
. Шаблоны if cond == True: expr
и if cond is True: expr
менее предпочтительны.
Правильно:
flag = True
if flag:
print("PEP 8 Style Guide prefers this pattern")
Неправильно:
flag = True
if flag == True:
print("This works, but is not the PEP 8 pattern")
6. Не использовать ZIP при итерировании списков
При итерировании нескольких списков возникает желание завести счетчик i
с помощью range
и получать элементы списков по индексу. Так делать не стоит - используйте функцию zip
.
Правильно:
num = [1, 2, 3]
let = ["A", "B", "C"]
for n, l in zip(num, let):
print(n, l)
Неправильно:
num = [1, 2, 3]
let = ["A", "B", "C"]
for index in range(len(num)):
print(num[index], let[index])
7. Использовать KEY IN LIST
Если вы хотите проверить, встречается ли значение key
в списке list
, то не стоит всегда слепо использовать конструкцию key in list
, т.к. это не всегда оптимально. Используйте множества - так вы пробежитесь не по всему списку, а только по уникальным элементам.
Правильно:
l = [1, 2, 3, 4, 1, 1, 2]
if 3 in set(l):
print("3 is in the list.")
else:
print("3 is NOT in the list.")
Неправильно:
l = [1, 2, 3, 4, 1, 1, 2]
if 3 in l:
print("3 is in the list.")
else:
print("3 is NOT in the list.")