В чем разница между синтаксической ошибкой и ошибкой во время выполнения?

Например:

def tofloat(i): 
    return flt(i)

def addnums(numlist):
    total = 0
    for i in numlist:
        total += tofloat(i)
    return total

nums = [1 ,2 ,3]
addnums(nums)

flt должен бытьfloat, но я'Я не понимаю, является ли это синтаксической ошибкой или ошибкой во время выполнения.

 Ashwini Chaudhary23 июн. 2013 г., 17:43
Это'с.NameError
 TerryA23 июн. 2013 г., 17:53
Я должен сказать, что вы задаете довольно интересные вопросы :). +1

Ответы на вопрос(3)

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

Ваш код выдаст только ошибку во время выполнения, т.е. когда функцияtofloat(i) вызывается впервые, поэтому это ошибка времени выполнения. Конкретно.NameError

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

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

print 1
print 2
print 3     
print foo

выход:

1
2
3
Traceback (most recent call last):
  File "so.py", line 4, in <module>
    print foo
NameError: name 'foo' is not defined
</module>

Этот код выигралвыполнить, как мы сделалиSyntaxErrorдаже если первые 3 строки в порядке:

print 1
print 2
print 2
print (foo

Выход:

$ python so.py
  File "so.py", line 5

              ^
SyntaxError: invalid syntax

Обратите внимание, что тамтакжеRunTimeError в Python, который возникает при обнаружении ошибки, которая нене попадают ни в одну из других категорий

 Ashwini Chaudhary23 июн. 2013 г., 17:56
@interjay ой! Я неправильно прочитал ошибку во время выполнения.RuntimeError
Решение Вопроса

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

Синтаксические ошибки возникают, когда интерпретатор находит что-то неуместное с Python 'Синтаксис. Например: Питонс грамматикой нераспознавать входной синтаксис как допустимую программу Python. Это может произойти, когда:

Вы забыли добавить: в концеif, def, classи т. д. выражениеВы забыли закрыть некоторые скобки или скобки и т. Д.Много мест, когда ты непридерживаться питонас грамматикой :)

В вашем примере нет ничего плохого в грамматике. Для переводчикаflt(i) это очень действительный вызовflt метод, который должен быть проверен во время выполнения в пределах области видимости, если он действительно существует. Итак, переводчик победилЖалобы и синтаксис вашей проблемы хороший.

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

С динамическими языками вы выигралине замечайте этого, пока не будет вызван фактический метод. Ваша программа проста, поэтому вы можете быстро ее найти. Но как насчет пропавшихo вfloat был внутри какой-то устаревшей инфраструктуры внутри подкласса подкласса класса, как свойство, внутри какого-то другого модуля и т. д. Это было бы жестко :)

ОБНОВИТЬ: Модель исполнения в питонеДокументы отлично читаются, если выо том, как работает внутреннее устройство Python. Это прояснит ваши сомнения в дальнейшем и даст вам много знаний :)

Надеюсь это поможет!

 Emil Lundberg23 июн. 2013 г., 18:54
Следует также отметить, что в Python синтаксическая ошибка технически является ошибкой времени выполнения, поскольку она возникает во время выполнения. Однако это не относится к компилируемым языкам - они различают ошибки времени компиляции (например, ошибки синтаксиса) и ошибки времени выполнения (например, ошибки нулевого указателя).
 Paulo Bu23 июн. 2013 г., 19:06
Тот'Это очень хорошее наблюдение. Спасибо за ответ :)
 user208664115 июл. 2013 г., 15:25
@ PauloBu, не могли бы вы проверить этот вопрос такstackoverflow.com/questions/17652075/...

У тебя естьNameError, Ваш код должен читать:

def tofloat(i): 
    return float(i)

Здесь нетflt метод в Python, поэтому он не работает для вас.

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

def addnums(numlist):
    return sum(map(float, numlist))

Используй это:

>>> addnums(range(4))
6.0
 interjay23 июн. 2013 г., 17:45
Тот'почему вопрос сказалFlt предположим, что это float () (который вы изменили с вашим редактированием, чтобы быть более запутанным). Это'просто спрашиваю, что это за ошибка.

Ваш ответ на вопрос