Умскул учебник стремится стать лучше! Если вы наткнулись на ошибку или неточность в нашем материале - просто сообщите нам, мы будем благодарны!
Информатика

Ошибки Python

14.5.2022
1262

На этой странице вы узнаете

  • Какой язык, кроме Python, поможет с написанием кода на Python?
  • Как отличить “с” от “c”?
  • Как писать код без единой ошибки?

Программа не может работать неправильно.

Код — это последовательный набор команд, и компьютер просто не может ошибиться в их выполнении. Как бы грустно это ни звучало, все ошибки программы порождает сам программист. Но нас спасет компьютер-помощник. Он знает, что конкретно ему не нравится, и скажет нам об этом. Цель этой статьи — создать «разговорник» между человеком и недовольной машиной.

Формат вывода ошибки

В отличие от некоторых обидчивых людей, которые просто перестают с вами разговаривать, если что-то сделать не так, компьютер никогда не оставит вас в смятении и непонимании. Он всегда подскажет вам, что именно ему не нравится, и сейчас мы разберемся с тем, как он это делает. Но перед этим советуем ознакомиться с базовыми навыками программирования на Python в статье  «Основы программирования на языке Python. Часть 1».

Если мы сделаем ошибку в коде, из-за чего он даже не сможет запуститься, мы получим сообщение примерно такого формата:


Traceback (most recent call last):
    File "D:\Programs\program.py", line 1, in <module>
      c += 1
NameError: name 'c' is not defined

На что здесь стоит обратить внимание?

  1. Самая первая строка сообщения об ошибке — сам факт того, что произошла ошибка.
  2. Вторая строка содержит путь до файла программы и номер строки с ошибкой.
  1. Третья строка продублирует строку кода с ошибкой. В некоторых ситуациях прямо показывает место ошибки в строке.
  2. Последняя строка содержит тип ошибки и ее конкретное описание.
Какой язык, кроме Python, поможет с написанием кода на Python?

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

Давайте дословно переведем ошибку из примера выше: «Ошибка имени: имя “с” не определено». Это значит, что программа не нашла переменной с именем “с”, а мы с ней собрались что-то делать. Действительно, непорядок.

Ошибка имени NameError 

Представьте себе, что у вашего соседа есть огромная черная собака бойцовской породы по кличке Снежок. Звучит абсурдно, правда? Имя совершенно не подходит ни внешности собаки, ни ее породе. Видимо, у соседа своеобразное чувство юмора. Эту ситуацию можно сравнить с ошибкой NameError.

NameError возникает при неправильном обращении к функциям или переменным по имени.

Самые частые примеры возникновения этой ошибки:

  1. Опечатка. Если мы дали переменной сложное название или случайно записали ее имя неправильно при повторном использовании, программа ее не найдет.

variable = 256
print(varable * 2)

Вывод:
Traceback (most recent call last):
    File "D:\Programs\program.py", line 2, in <module>
      print(varable * 2)
NameError: name 'varable' is not defined

В том числе это касается и функций — как встроенных, так и написанных нами.


variable = 256
prnt(variable)

Вывод:
Traceback (most recent call last):
    File "D:\Programs\program.py", line 2, in <module>
      print(ln(variable))
NameError: name 'prnt' is not defined

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

Как отличить “с” от “c”?

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

с = 256
print(c)

Скопируйте код и запустите его. Не работает? Не находит переменную с именем “c”? Проблема в раскладке клавиатуры. Первая “с” была написана на русском языке, вторая — на английском. Для компьютера это принципиально разные вещи.

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

Если вы работаете в среде разработки PyCharm, нажмите на переменную c, тогда в коде будут подсвечены все буквы с, а вот переменная, написанная кириллицей, подсвечена не будет. Таким образом можно определить, правильно ли вы написали имя переменной. На практике подобных именований стоит избегать, а как правильно называть переменную, вы можете посмотреть в статье «Основы программирования на языке Python. Часть 1».
  1. Переменной вовсе не существует. Иногда можно просто забыть создать переменную в начале кода, но в дальнейшем работать с ней так, как будто она есть.

for i in range(1, 6):
	count += i

Вывод:
Traceback (most recent call last):
    File "D:\Programs\program.py", line 2, in <module>
      count += i
NameError: name 'count' is not defined

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


count = 0
for i in range(1, 6):
	count += i

Из-за опечаток также могут возникнуть ошибки импорта. При появлении сообщения типа “ModuleNotFoundError” или “ImportError”, перепроверяем, правильно ли записаны импортируемые библиотеки и функции.

Отдельно стоит упомянуть ошибку синтаксиса, или SyntaxError. Именно о ней мы и поговорим далее.

Ошибка синтаксиса SyntaxError 

«Я нипанимаю пачиму! у миня два па рускаму?» На это сообщение учитель русского языка, скорее всего, никак не ответит. Даже если он и поймет смысл написанного, он просто не захочет отвечать.

Если игнорировать основы синтаксиса и «пунктуации» языка Python, программа тоже не станет с нами разговаривать, лишь выдаст ошибку SyntaxError.

SyntaxError возникает при неправильном использовании языковых конструкций.

  1. Неправильно расставленные скобки. Лишние и не закрытые круглые, квадратные и фигурные скобки — все вызовут ошибку синтаксиса.

a = [1, 2, 3]
for i in a:
    print(i

Вывод:
  File "D:\Programs\program.py", line 3
    print(a[i]
         ^
SyntaxError: '(' was never closed

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

a = [1, 2, 3]
fro i in a:
    print(i)

Вывод:
  File "D:\Programs\program.py", line 2
    fro i in a:
        ^
SyntaxError: invalid syntax

  1. Отсутствие двоеточия после создания цикла или условной конструкции.

a = [1, 2, 3]
for i in a
    print(i)

Вывод:
  File "D:\Programs\program.py", line 2
    for i in a
              ^
SyntaxError: expected ':'

  1. Чуть более частный случай — использование знака присваивания “=” вместо знака сравнения “==”. 

a = 5
b = 5
if a = b:
	print("a и b равны")

Вывод:
  File "D:\Programs\program.py", line 3
    if a = b:
       ^^^^^
SyntaxError: invalid syntax

А что будет, если мы не проконтролируем типы данных, с которыми мы работаем? Какая ошибка возникнет в данном случае?

Ошибки типа данных TypeError, атрибутов AttributeError и значений ValueError

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

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

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

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

a = "123"
a[0] = "a"

Вывод:
Traceback (most recent call last):
  File "D:\Programs\program.py", line 2, in <module>
    a[0] = "a"
TypeError: 'str' object does not support item assignment

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

print(“123” + 4)

Вывод:
Traceback (most recent call last):
  File "D:\Programs\program.py", line 1, in <module>
    print("123" + 4)
TypeError: can only concatenate str (not "int") to str

  1. Применение функций не к тем типам данных вызовет уже AttributeError. Это будет значить одно из двух — либо мы забыли, с каким типом данных работаем, либо забыли, как работать с указанным типом данных. В частности, функция append неприменима к строке, а попытка этого приведет к ошибке.

a = "123"
a.append("4")

Вывод:
Traceback (most recent call last):
  File "D:\Programs\program.py", line 2, in <module>
    a.append("4")
AttributeError: 'str' object has no attribute 'append'

  1. Слишком много/мало значений передано функции. Например, append добавляет в список ровно 1 значение, попытка передать больше или меньше приведет к ошибке.

a = []
a.append(1, 2, 3)

Вывод:
Traceback (most recent call last):
  File "D:\Programs\program.py", line 2, in <module>
    a.append(1, 2, 3)
TypeError: list.append() takes exactly one argument (3 given)

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

a = []
print(max(a))

Вывод:
Traceback (most recent call last):
  File "D:\Programs\program.py", line 2, in <module>
    print(max(a))
ValueError: max() arg is an empty sequence

Давайте рассмотрим, какие ошибки мы можем допустить, при написании кода для задания 12 ЕГЭ.

Задание. Какая строка получится в результате применения приведенной ниже программы к строке, состоящей из цифры 1, за которой следуют 80 идущих подряд цифр 8? В ответе запишите полученную строку.
НАЧАЛО
  ПОКА нашлось (18) ИЛИ нашлось (288) ИЛИ нашлось (3888)     ЕСЛИ нашлось (18)
      ТО заменить (18, 2)
       ИНАЧЕ ЕСЛИ нашлось (288)
        ТО заменить (288, 3)
        ИНАЧЕ заменить (3888, 1)
      КОНЕЦ ЕСЛИ
    КОНЕЦ ЕСЛИ
  КОНЕЦ ПОКА
КОНЕЦ

Решение.
s = ‘1’ + ‘8’ * 80
while ’18’ in s or ‘288’ in s or ‘3888’ in s:
if ’18’ in s:
     s = s.replace(’18’,’2′,1)
elif ‘288’ in s:
     s = s.replace(‘288′,’3’,1)
else:
     s = s.replace(‘3888’, ‘1’,1)
print(s)
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
При написании данного кода возможны следующие ошибки:

1. Ошибка NameError возникает, если имя переменной использовано до того, как оно было определено или если имя переменной не существует. В данном коде ошибка может быть, если забыть указать саму строку s.

2. Ошибка синтаксиса SyntaxError может возникнуть, если код не соответствует корректному синтаксису языка. Например, если здесь отсутствует двоеточие после условия if, это приведет к SyntaxError: if ’18’ in s:. Кроме того, неправильное выравнивание отступов в блоке else также может вызвать SyntaxError.

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

Ошибка табуляции IndentationError

О том, что такое табуляция, мы говорили в статье «Основы программирования. Часть 2».

Ошибиться в ней можно несколькими способами:

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

for i in range(1, 6):
print(i)

Вывод:
  File "D:\Programs\program.py", line 2
    print(i)
    ^
IndentationError: expected an indented block after 'for' statement on line 1

  1. Совместно использовать табы и пробелы. Табуляцию можно проставить двумя способами — с помощью пробелов (по традиции используются 4 пробела) или с помощью табов, которые проставляются нажатием клавиши Tab. Использование обоих способов одновременно приведет к ошибке.

for i in range(1, 6):
	i1 = i * 2
        print(i1)

Вывод:
  File "D:\Programs\program.py", line 3
    print(i1)
             ^
IndentationError: unindent does not match any outer indentation level

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

for i in range(1, 6):
       i1 = i
       if i1 > 2:
          i1 = i * 2
     print(i1)

Вывод: 
  File "D:\Programs\program.py", line 5
    print(i1)
             ^
IndentationError: unindent does not match any outer indentation level

 Лучше использовать именно табы. Это проще.

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

Ошибка индекса IndexError

Если до сдачи проекта осталось 4 секунды, а у вас спрашивают, когда он уже будет готов, ответ «Через минуту» будет нетактичным. Рамки очень важно соблюдать, и индексы в Python знают это, как никто другой.

IndexError возникает при попытке взять значение из массива или строки под несуществующим индексом.

Вспомнить информацию по индексам и индексации можно в статье «Работа со строками в Python».

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


s = "12345"
print(s[5])

Вывод:
Traceback (most recent call last):
  File "D:\Programs\program.py", line 2, in <module>
    print(s[5])
IndexError: string index out of range

Как писать код без единой ошибки?

Никак. Ошибки — это естественный процесс как обучения, так и работы. Без них вряд ли обойдется хоть сколько-то большая программа. Главное — не бояться ошибок, научиться их принимать, понимать и исправлять.

Программированием можно решить ⅔ от всего ЕГЭ по информатике. Но даже в программах для самых простых задач можно допустить опечатку, которую будет непросто найти. Если научиться понимать программу и ее сообщения об ошибках, у вас больше никогда не возникнет вопрос: «Да почему не работает?!», и вы сэкономите очень много времени.

Давайте рассмотрим, какие ошибки мы можем допустить, при написании кода для задания 15.2 ОГЭ.

Задание. Напишите программу, которая в последовательности натуральных чисел определяет максимальное число, кратное 4. Программа получает на вход количество чисел в последовательности, а затем сами числа. В последовательности всегда имеется число, кратное 4. Количество чисел не превышает 1000. Введенные числа не превышают 30 000. Программа должна вывести одно число.

Решение.
n = int(input())
maxi = 0
for i in range(n):
a = int(input())
if a %  == 0 and a > maxi:
     maxi = a
print(maxi)
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
При написании данного кода возможны следующие ошибки:

1. Ошибка NameError возникает, если имя переменной использовано до того, как оно было определено. В данном коде, если бы переменная maxi не была определена до строки maxi = a, то возникла бы ошибка NameError.

2. Ошибка синтаксиса SyntaxError может возникнуть, если код не соответствует корректному синтаксису языка. Например, если здесь отсутствует двоеточие после условия if, это приведет к SyntaxError: if a % 5 == 0 and a > maxi.

3. Ошибка TypeError возникает, когда операция применяется к объекту неправильного типа. В данном коде, если бы переменные n или a не являлись целыми числами (int), то возникла бы ошибка TypeError.

4. Ошибка отступа IndentationError возникает, когда отступы в коде не соответствуют правильной синтаксической структуре. Если бы отступы в строках после if a % 5 == 0 and a > maxi: были бы заданы неправильно, то возникла бы ошибка IndentationError.

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

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

Если вы хотите узнать больше о Python, рекомендуем ознакомиться со статьей «Основы программирования на языке Python. Часть 1».  

Фактчек

  • Ошибка имени NameError может возникнуть при ошибке или опечатке в имени функции или переменной.
  • Ошибка синтаксиса SyntaxError говорит об ошибке в конструкции языка — неправильных скобках или ошибках в ключевых словах.
  • Ошибки типа данных TypeError, атрибутов AttributeError и значений ValueError выходят при неправильной работе с типами данных и возникают при неправильном взаимодействии или совершении ошибок в их функциях.
  • Ошибка табуляции IndentationError возникает при неправильной расстановке отступов в коде.
  • Ошибка индекса IndexError возникает при обращении к несуществующим индексам строк и массивов.

Проверь себя

Задание 1.
Выберите верное утверждение:

  1. Если допустить опечатку в имени переменной или функции, программа все равно заработает.
  2. При опечатке сообщение об ошибке не выводится, так как это незначительная ошибка.
  3. Сообщение об ошибке “NameError: name ‘count’ is not defined” говорит, что программа не смогла найти переменную count в коде.
  4. Сообщение об ошибке “NameError: name ‘count’ is not defined” говорит, что переменная count имеет неверный тип данных.

Задание 2.
Сообщение об ошибке типа TypeError говорит об…

  1. использовании несуществующего типа данных.
  2. опечатке в имени переменной.
  3. ошибке со скобками.
  4. неправильной работе с типами данных или их функциями.

Задание 3.
Для строки s = «abcdefg» выберите индекс, который вызовет ошибку

  1. s[0]
  2. s[-1]
  3. s[6]
  4. s[7]

Задание 4.
Что может вызвать ошибку табуляции?

  1. Использование пробелов для нее.
  2. Использование клавиши “Tab” для нее.
  3. Использование двух предыдущих способов одновременно.
  4. Использование символа точки с запятой.

Ответы: 1. — 3; 2. — 4; 3. — 4; 4. — 3.

Понравилась статья? Оцени:
Читайте также:

Читать статьи — хорошо, а готовиться к экзаменам
в самой крупной онлайн-школе — еще эффективнее.

50 000
Количество
учеников
1510
Количество
стобальников
>15000
Сдали на 90+
баллов