Меню

Invalid syntax python ошибка на двоеточие

Моя программа не работает! Что делать? В данной статье я постараюсь собрать наиболее частые ошибки начинающих программировать на python 3, а также расскажу, как их исправлять.

Проблема: Моя программа не запускается. На доли секунды появляется чёрное окошко, а затем исчезает.

Причина: после окончания выполнения программы (после выполнения всего кода или при возникновении исключения программа закрывается. И если вы её вызвали двойным кликом по иконке (а вы, скорее всего, вызвали её именно так), то она закроется вместе с окошком, в котором находится вывод программы.

Решение: запускать программу через IDLE или через консоль.


Проблема: Не работает функция input. Пишет SyntaxError.

Пример кода:

>>> a = input()
hello world
  File "<string>", line 1
    hello world
              ^
SyntaxError: unexpected EOF while parsing

Причина: Вы запустили Python 2.

Решение: Установить Python 3.


Проблема: Где-то увидел простую программу, а она не работает.

Пример кода:

name = raw_input()
print name

Ошибка:

  File "a.py", line 3
    print name
             ^
SyntaxError: invalid syntax

Причина: Вам подсунули программу на Python 2.

Решение: Прочитать об отличиях Python 2 от Python 3. Переписать её на Python 3. Например, данная программа на Python 3 будет выглядеть так:

name = input()
print(name)

Проблема: TypeError: Can’t convert ‘int’ object to str implicitly.

Пример кода:

>>> a = input() + 5
8
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

Причина: Нельзя складывать строку с числом.

Решение: Привести строку к числу с помощью функции int(). Кстати, заметьте, что функция input() всегда возвращает строку!

>>> a = int(input()) + 5
8
>>> a
13

Проблема: SyntaxError: invalid syntax.

Пример кода:

a = 5
if a == 5
    print('Ура!')

Ошибка:

  File "a.py", line 3
    if a == 5
            ^
SyntaxError: invalid syntax

Причина: Забыто двоеточие.

Решение:

a = 5
if a == 5:
    print('Ура!')

Проблема: SyntaxError: invalid syntax.

Пример кода:

a = 5
if a = 5:
    print('Ура!')

Ошибка:

  File "a.py", line 3
    if a = 5
         ^
SyntaxError: invalid syntax

Причина: Забыто равно.

Решение:

a = 5
if a == 5:
    print('Ура!')

Проблема: NameError: name ‘a’ is not defined.

Пример кода:

print(a)

Причина: Переменная «a» не существует. Возможно, вы опечатались в названии или забыли инициализировать её.

Решение: Исправить опечатку.

a = 10
print(a)

Проблема: IndentationError: expected an indented block.

Пример кода:

a = 10
if a > 0:
print(a)

Причина: Нужен отступ.

Решение:

a = 10
if a > 0:
    print(a)

Проблема: TabError: inconsistent use of tabs and spaces in indentation.

Пример кода:

a = 10
if a > 0:
    print(a)
    print('Ура!')

Ошибка:

  File "a.py", line 5
    print('Ура!')
                 ^
TabError: inconsistent use of tabs and spaces in indentation

Причина: Смешение пробелов и табуляции в отступах.

Решение: Исправить отступы.

a = 10
if a > 0:
    print(a)
    print('Ура!')

Проблема: UnboundLocalError: local variable ‘a’ referenced before assignment.

Пример кода:

def f():
    a += 1
    print(a)

a = 10
f()

Ошибка:

Traceback (most recent call last):
  File "a.py", line 7, in <module>
    f()
  File "a.py", line 3, in f
    a += 1
UnboundLocalError: local variable 'a' referenced before assignment

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

Решение:

def f():
    global a
    a += 1
    print(a)

a = 10
f()

Проблема: Программа выполнилась, но в файл ничего не записалось / записалось не всё.

Пример кода:

>>> f = open('output.txt', 'w', encoding='utf-8')
>>> f.write('bla')
3
>>>

Причина: Не закрыт файл, часть данных могла остаться в буфере.

Решение:

>>> f = open('output.txt', 'w', encoding='utf-8')
>>> f.write('bla')
3
>>> f.close()
>>>

Проблема: Здесь может быть ваша проблема. Комментарии чуть ниже 🙂


Также вам может быть полезно это описание:

Мой код не работает :-(

I am new to python, and am making a sort-of game as one of my first projects that guesses a number between 1 and 10, then the user guesses it. They have three guesses, and the program tells the user if they need to go higher or lower on their next guess. The part of the code with the error in isn’t crucial, as it only makes a guess not be wasted if the user puts in the same answer twice, allowing them to redo their guess the first time but not allowing a re-take the second. On the code, I have marked where the problem is. Like I said, I am really new to python and this is probably some amateur noobie mistake. Thanks in advance.

import time # This imports the time module.
import random # This imports the random module.

MyNumber = random.randrange(1,10) # This picks a number for the variable 'MyNumber'

firstGuess = int(input('Ok then, we shall begin! What is your first guess?'))
print()
if firstGuess == (MyNumber):
 print('Well done! You win!')
 time.sleep(3)
 exit()
if firstGuess < MyNumber:
 print('Go Higher!')
 time.sleep(1)
if firstGuess > MyNumber:
 print('Go Lower!')
 time.sleep(1)

print()
secondGuess = int(input('Better luck this time! What is your second guess?'))
print()
if secondGuess == firstGuess:
 print('You tried that one last time! Don't worry, I won't count that one!')
 bungled = (1)
 secondGuess = int(input('What is your second guess?')
 if secondGuess == firstGuess:  # This colon is causing the problem. <===========
  print('You've already tried that one twice!')
  bungled = (2)
if secondGuess == MyNumber:
 print('Well done! You win!')
 time.sleep(3)
 exit()
if secondGuess < MyNumber:
 print('Go Higher!')
 time.sleep(1)
if secondGuess > MyNumber:
 print('Go Lower!')
 time.sleep(1)

print()
thirdGuess = int(input('This is your final chance! What is your third guess?'))
print()
if thirdGuess == MyNumber:
 print('Well done! You win!')
 time.sleep(3)
 exit()
if thirdGuess < MyNumber:
 MyNumber = str(MyNumber)
 print('Sorry! You lost! The number was '+MyNumber)
 time.sleep(1)
 exit()
if thirdGuess > MyNumber:
 MyNumber = str(MyNumber)
 print('Sorry! You lost! The number was '+MyNumber)
 time.sleep(1)
 exit()

I am new to python, and am making a sort-of game as one of my first projects that guesses a number between 1 and 10, then the user guesses it. They have three guesses, and the program tells the user if they need to go higher or lower on their next guess. The part of the code with the error in isn’t crucial, as it only makes a guess not be wasted if the user puts in the same answer twice, allowing them to redo their guess the first time but not allowing a re-take the second. On the code, I have marked where the problem is. Like I said, I am really new to python and this is probably some amateur noobie mistake. Thanks in advance.

import time # This imports the time module.
import random # This imports the random module.

MyNumber = random.randrange(1,10) # This picks a number for the variable 'MyNumber'

firstGuess = int(input('Ok then, we shall begin! What is your first guess?'))
print()
if firstGuess == (MyNumber):
 print('Well done! You win!')
 time.sleep(3)
 exit()
if firstGuess < MyNumber:
 print('Go Higher!')
 time.sleep(1)
if firstGuess > MyNumber:
 print('Go Lower!')
 time.sleep(1)

print()
secondGuess = int(input('Better luck this time! What is your second guess?'))
print()
if secondGuess == firstGuess:
 print('You tried that one last time! Don't worry, I won't count that one!')
 bungled = (1)
 secondGuess = int(input('What is your second guess?')
 if secondGuess == firstGuess:  # This colon is causing the problem. <===========
  print('You've already tried that one twice!')
  bungled = (2)
if secondGuess == MyNumber:
 print('Well done! You win!')
 time.sleep(3)
 exit()
if secondGuess < MyNumber:
 print('Go Higher!')
 time.sleep(1)
if secondGuess > MyNumber:
 print('Go Lower!')
 time.sleep(1)

print()
thirdGuess = int(input('This is your final chance! What is your third guess?'))
print()
if thirdGuess == MyNumber:
 print('Well done! You win!')
 time.sleep(3)
 exit()
if thirdGuess < MyNumber:
 MyNumber = str(MyNumber)
 print('Sorry! You lost! The number was '+MyNumber)
 time.sleep(1)
 exit()
if thirdGuess > MyNumber:
 MyNumber = str(MyNumber)
 print('Sorry! You lost! The number was '+MyNumber)
 time.sleep(1)
 exit()

Отладка¶

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

  1. Синтаксические ошибки — ошибки, обнаруживаемые Python в ходе трансляции
    исходного кода в байт-код. Такие ошибки вызваны тем, что что-то не так с
    синтаксисом программы. Пример: забыв поставить двоеточие в конце строки def,
    получим такое сообщение об ошибке: SyntaxError: invalid syntax.
  2. Ошибки времени выполнения — ошибки, возникающие при выполнении программы
    в случае, если происходит что-то неожиданное. Большинство ошибок времени выполнения
    включают информацию о том, где произошла ошибка и какие функции при этом выполнялись.
    Пример: бесконечная рекурсия в конце концов приводит к ошибке времени выполнения
    из-за превышения максимальной разрешенной глубины рекурсии.
  3. Семантические ошибки — логические ошибки в программе, которая компилируется и выполняется,
    но делает не то, что от нее ожидается. Пример: Выражение может быть вычислено не в том
    порядке, как ожидает программист, не позаботившийся о скобках.

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

Синтаксические ошибки¶

Синтаксическую ошибку легко исправить, как только вы поняли, в чем она состоит. К сожалению, сообщения об ошибках часто оказываются не очень полезны. Наиболее частые сообщения SyntaxError: invalid syntax и SyntaxError: invalid token не очень информативны.

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

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

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

Вот несколько советов, как избежать самых распространенных синтаксических ошибок:

  1. Убедитесь, что вы не используете одно из ключевых слов Python как идентификатор
    (имя переменной или функции).
  2. Проверьте, что не забыли поставить двоеточие в конце заголовка каждого составного
    предложения, включая for, while, if и def.
  3. Проверьте, что отступы в вашей программе сделаны единообразно. Можете
    пользоваться пробелами или табуляцией, но лучше не смешивать одно с другим.
    Все строки каждого уровня вложенности кода должны иметь одинаковый отступ.
  4. Убедитесь, что все строковые литералы в коде имеют открывающие и закрывающие кавычки.
  5. Если в программе имеются строковые литералы в тройных кавычках,
    занимающие несколько строк в файле, убедитесь, что они корректно
    завершены. Незавершенная строка может привести к ошибке invalid token в конце
    вашей программы, или к тому, что последующая часть программы будет восприниматься
    как продолжение строки (пока не встретится другая строка). В последнем случае
    может даже не быть сообщения об ошибке!
  6. Незакрытая скобка – (, { или [ – заставляет Python полагать, что следующая строка
    является продолжением текущей. В этом случае Python почти всегда сообщает об ошибке в
    следующей строке.
  7. Проверьте, что в условии используется оператор ==, а не =.

Если ничто из этого не помогло, переходите к следующему разделу…

Не могу запустить программу, что бы я ни делал¶

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

Если это случилось, можно создать новую программу (вроде Hello World!) и убедиться, что она-то запускается. Затем постепенно добавляйте необходимый код к работающей программе.

Ошибки времени выполнения¶

Если ваша программа синтаксически корректна, Python, как минимум, начнет ее выполнение. Что теперь может пойти не так?

Моя программа совсем ничего не делает¶

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

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

Моя программа зависает¶

Если программа “останавливается” и как-будто ничего не делает, то говорят, что программа зависла. Часто это означает, что программа вошла в бесконечный цикл.

  1. Если вы подозреваете какой-то определенный цикл, то добавьте предложение
    print непосредственно перед циклом, которое сообщит о входе в цикл, и
    еще одно сразу после цикла, сообщающее о выходе из него.
  2. Запустите программу. Если вы видите первое сообщение, но не видите второго,
    то программа вошла в бесконечный цикл. См. раздел Бесконечный цикл ниже.
  3. Что касается неограниченной рекурсии, то в этом случае программа будет выполняться
    какое-то время, пока не выдаст ошибку RuntimeError: Maximum recursion depth exceeded.
    Если это случилось, см. раздел Неограниченная рекурсия ниже.
  4. Если программа не выдает такую ошибку, но вы подозреваете, что проблема в
    рекурсивном методе или функции, приемы, описанные в разделе Неограниченная рекурсия,
    все же могут оказаться полезны.
  5. Если вышеописанные шаги не работают, проверьте другие циклы или другие рекурсивные
    функции и методы.
  6. Если и это не помогает, то вы, вероятно, не понимаете последовательность
    выполнения предложений в вашей программе. См. раздел Поток выполнения ниже.

Бесконечный цикл¶

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

Например:

while x > 0 and y < 0:
    # do something to x
    # do something to y

    print  "x: ", x
    print  "y: ", y
    print  "condition: ", (x > 0 and y < 0)

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

Неограниченная рекурсия¶

В большинстве случаев неограниченная рекурсия приведет к ошибке RuntimeError: Maximum recursion depth exceeded.

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

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

Поток выполнения¶

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

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

При выполнении программы возникает исключение¶

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

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

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

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

Здесь несколько возможных причин:

  1. Вы пытаетесь неправильно использовать значение. Пример: индексирование
    строки, списка или кортежа значением, отличным от числа.
  2. Имеется несоответствие между строкой формата и элементами, которые должны
    быть в нее подставлены. Либо передается неверное количество элементов, либо
    в строке формата указано недопустимое для данного элемента преобразование.
  3. Вы передали неправильное число аргументов в функцию или метод.
    Для методов, посмотрите на определение метода и проверьте, что первым параметром
    является self. Затем посмотрите на вызов метода; убедитесь, что вызываете
    метод для объекта правильного типа, и что все аргументы корректны.
KeyError
Вы пытаетесь получить доступ к элементу словаря, используя ключ, которого нет в словаре.
AttributeError
Вы пытаетесь получить доступ к атрибуту или методу, который не существует.
IndexError
Индекс, который вы используете для доступа к списку (строке или кортежу), больше,
чем длина списка минус один. Непосредственно перед строкой, в которой возникает ошибка,
вставьте предложение print, которое выведет индекс и длину списка.
Длина правильная? А индекс?

Слишком много данных выводится на печать¶

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

Чтобы упростить выводимые данные, можно удалить или закомментировать предложения print, которые уже не нужны, либо объединить отдельные print в один и отформатировать выводимые данные для более легкого восприятия.

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

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

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

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

Семантические ошибки¶

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

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

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

Моя программа не работает¶

Спросите себя:

  1. Есть ли что-то, что программа должна делать, но это не делается?
    Найдите ту часть кода, которая отвечает за эту функциональность, и
    убедитесь, что она выполняется тогда, когда вы этого ожидаете.
  2. Происходит ли что-то, чего не должно происходить? Найдите в программе
    код, отвечающий за это, и выясните, почему он выполняется вопреки
    вашим ожиданиям.
  3. Производит ли часть кода эффект, который вы не ожидаете?
    Убедитесь, что вы понимаете этот участок кода; будьте особенно внимательны,
    если код вызывает функции или методы из других модулей Python. Прочтите
    документацию по функциям, которые вы используете. Изучите эти функции, написав
    для них несложные тесты.

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

Лучший способ исправить модель программы, это разбить программу на компоненты (функции и методы) и протестировать эти компоненты раздельно. Обнаружив несоответствие между вашим представлением о программе и ее реальным поведением, вы сможете решить проблему.

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

Мое длинное выражение не работает¶

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

Пример:

self.hands[i].addCard (self.hands[self.findNeighbor(i)].popCard())

Это выражение можно переписать так:

neighbor = self.findNeighbor (i)
pickedCard = self.hands[neighbor].popCard()
self.hands[i].addCard (pickedCard)

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

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

Это неправильно. Операции умножения и деления имеют одинаковый приоритет, и их вычисление производится слева направо. Поэтому данное выражение на Python вычисляет (x/2)pi.

Отличный способ избавиться от подобных ошибок — явно обозначить порядок вычисления с помощью скобок:

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

Моя функция (или метод) возвращает не то, что мне нужно¶

Если вы написали предложение return с длинным выражением, вы не сможете вывести результат вычисления выражения перед возвратом из функции. Используйте временную переменную. Например, вместо:

return self.hands[i].removeMatches()

напишите:

count = self.hands[i].removeMatches()
return count

Теперь у вас есть возможность вывести значение count перед выходом из функции.

Ничего не понимаю, бред какой-то¶

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

  1. Отчаяние и/или ярость.
  2. Вера в сверхъестественное (компьютер меня ненавидит) и магию (программа работает только
    тогда, когда я надеваю шляпу).
  3. Программирование методом случайного тыка (кодирование одного и того же разными способами
    в надежде, что один из способов сработает).

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

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

Нет, мне реально нужна помощь¶

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

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

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

  1. Если имеется сообщение об ошибке, то что это за сообщение и где оно возникает?
  2. Какое последнее изменение вы сделали перед тем, как возникла проблема? Какие
    строки кода вы изменили/добавили, или какой новый тест не проходит?
  3. Что вы уже сделали, и что поняли к настоящему моменту в связи с этой проблемой?

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

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

На чтение 6 мин. Просмотров 36.1k. Опубликовано 03.12.2016

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

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

1) Пропущено двоеточие в конце строки после управляющих конструкций типа if, elif, else, for, while, class, or def, что приведет к ошибке типа SyntaxError: invalid syntax

Пример кода:

if spam == 42

    print(‘Hello!’)

2) Использование = вместо == приводит к ошибке типа SyntaxError: invalid syntax

Символ = является оператором присваивания, а символ == — оператором сравнения.

Эта ошибка возникает в следующем коде:

if spam = 42:

    print(‘Hello!’)

3) Использование неправильного количества отступов.

Возникнет ошибка типа IndentationError: unexpected indent, IndentationError: unindent does not match any outer indentation level и IndentationError: expected an indented block

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

Пример ошибки:

print(‘Hello!’)

    print(‘Howdy!’)

и тут

if spam == 42:

    print(‘Hello!’)

  print(‘Howdy!’)

и тут

if spam == 42:

print(‘Hello!’)

4) Неиспользование функции len() в объявлении цикла for для списков list

Возникнет ошибка типа TypeError: ‘list’ object cannot be interpreted as an integer

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

Ошибка возникнет в следующем коде:

spam = [‘cat’, ‘dog’, ‘mouse’]

for i in range(spam):

    print(spam[i])

Некоторые читатели (оригинальной статьи) заметили, что лучше использовать конструкцию типа for i in spam:, чем написанный код выше. Но, когда нужно получить номер итерации в цикле, использование вышенаписанного кода намного полезнее, чем получение значения списка.

От переводчика: Иногда можно ошибочно перепутать метод shape с len() для определения размера списка. При этом возникает ошибка типа ‘list’ object has no attribute ‘shape’

5) Попытка изменить часть строки. (Ошибка типа TypeError: ‘str’ object does not support item assignment)

Строки имеют неизменяемый тип. Эта ошибка произойдет в следующем коде:

spam = ‘I have a pet cat.’

spam[13] = ‘r’

print(spam)

А ожидается такое результат:

spam = ‘I have a pet cat.’

spam = spam[:13] + ‘r’ + spam[14:]

print(spam)

От переводчика: Подробней про неизменяемость строк можно прочитать тут

6) Попытка соединить нестроковую переменную со строкой приведет к ошибке TypeError: Can’t convert ‘int’ object to str implicitly

Такая ошибка произойдет тут:

numEggs = 12

print(‘I have ‘ + numEggs + ‘ eggs.’)

А нужно так:

numEggs = 12

print(‘I have ‘ + str(numEggs) + ‘ eggs.’)

или так:

numEggs = 12

print(‘I have %s eggs.’ % (numEggs))

От переводчика: еще удобно так

print(‘This {1} xorosho{0}’.format(‘!’,‘is’))

# This is xorosho!

7) Пропущена одинарная кавычка в начале или конце строковой переменной (Ошибка SyntaxError: EOL while scanning string literal)

Такая ошибка произойдет в следующем коде:

или в этом:

или в этом:

myName = ‘Al’

print(‘My name is ‘ + myName + . How are you?)

8) Опечатка в названии переменной или функции (Ошибка типа NameError: name ‘fooba’ is not defined)

Такая ошибка может встретиться в таком коде:

foobar = ‘Al’

print(‘My name is ‘ + fooba)

или в этом:

или в этом:

От переводчика: очень часто при написании возникают ошибки типа NameError: name ‘true’ is not defined и NameError: name ‘false’ is not defined, связанные с тем, что нужно писать булевные значения с большой буквы True и False

9) Ошибка при обращении к методу объекта. (Ошибка типа AttributeError: ‘str’ object has no attribute ‘lowerr’)

Такая ошибка произойдет в следующем коде:

spam = ‘THIS IS IN LOWERCASE.’

spam = spam.lowerr()

10) Попытка использовать индекс вне границ списка. (Ошибка типа IndexError: list index out of range)

Ошибка возникает в следующем коде:

spam = [‘cat’, ‘dog’, ‘mouse’]

print(spam[6])

11) Использование несуществующих ключей для словаря. (Ошибка типа KeyError: ‘spam’)

Ошибка произойдет в следующем коде:

spam = {‘cat’: ‘Zophie’, ‘dog’: ‘Basil’, ‘mouse’: ‘Whiskers’}

print(‘The name of my pet zebra is ‘ + spam[‘zebra’])

12) Использование зарезервированных в питоне ключевых слов в качестве имени для переменной. (Ошибка типа SyntaxError: invalid syntax)

Ключевые слова (зарезервированные) в питоне невозможно использовать как переменные. Пример в следующем коде:

Python 3 имеет следующие ключевые слова: and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, while, with, yield

13) Использование операторов присваивания для новой неинициализированной переменной. (Ошибка типа NameError: name ‘foobar’ is not defined)

Не стоит надеяться, что переменные инициализируются при старте каким-нибудь значением типа 0 или пустой строкой.

Эта ошибка встречается в следующем коде:

spam = 0

spam += 42

eggs += 42

Операторы присваивания типа spam += 1 эквивалентны spam = spam + 1. Это означает, что переменная spam уже должна иметь какое-то значение до.

14) Использование локальных переменных, совпадающих по названию с глобальными переменными, в функции до инициализации локальной переменной. (Ошибка типа UnboundLocalError: local variable ‘foobar’ referenced before assignment)

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

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

Код с появлением этой ошибки такой:

someVar = 42

def myFunction():

    print(someVar)

    someVar = 100

myFunction()

15) Попытка использовать range() для создания списка целых чисел. (Ошибка типа TypeError: ‘range’ object does not support item assignment)

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

Пример ошибки в следующем коде:

spam = range(10)

spam[4] = 1

Кстати, это работает в Python 2, так как range() возвращает список. Однако попытка выполнить код в Python 3 приведет к описанной ошибке.

Нужно сделать так:

spam = list(range(10))

spam[4] = 1

16) Отсутствие операторов инкремента ++ или декремента . (Ошибка типа SyntaxError: invalid syntax)

Если вы пришли из другого языка типа C++, Java или PHP, вы можете попробовать использовать операторы ++ или для переменных. В Питоне таких операторов нет.

Ошибка возникает в следующем коде:

Нужно написать так:

17) Как заметил читатель Luciano в комментариях к статье (оригинальной), также часто забывают добавлять self как первый параметр для метода. (Ошибка типа TypeError: myMethod() takes no arguments (1 given)

Эта ошибка возникает в следующем коде:

class Foo():

    def myMethod():

        print(‘Hello!’)

a = Foo()

a.myMethod()

Краткое объяснение различных сообщений об ошибках представлено в Appendix D of the «Invent with Python» book.

Полезные материалы

Оригинал статьи

Наиболее частые проблемы Python и решения (перевод)

Вещи, о которых следует помнить, программируя на Python

Python 3 для начинающих: Часто задаваемые вопросы

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Invalid syntax python ошибка import
  • Invalid syntax python ошибка for