例如:
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
,但我很困惑它是语法错误还是运行时错误。
答案 0 :(得分:7)
实际上,这是一个运行时错误,因为Python会尝试在运行时解析flt
名称(因为它是一种动态语言),并且它不会找到它。当发生这种情况时,Python会产生异常,说它无法找到您使用的符号flt
,所有这些都在运行时发生。
当解释器发现使用Python语法不具吸引力的东西时,会发生语法错误。例如:Python的语法不能将输入语法识别为有效的Python程序。这可能发生在:
:
等结尾处添加if, def, class
在您的示例中,语法没有任何问题。对于解释器,flt(i)
是对flt
方法的非常有效的调用,如果它确实存在,则必须在范围内在运行时进行检查。因此,口译员不会投诉,你的问题的语法也不错。
实际上,这可以被视为与编译语言(例如C#,C ++等)相比的缺点。这种错误可以在编译时更快地检测到,并且编译器在发现它时会大声尖叫所以你可以注意到它。
使用动态语言,在调用实际方法之前,您不会注意到这一点。你的程序很简单,所以你可以快速找到它。但是,o
中缺少float
的内容是在类的子类的子类中的某个遗留框架内,作为属性,在其他模块内部等等。这将是苛刻的:)< / p>
更新: The execution model如果您了解Python内部的工作方式,那么Python的文档是一本很好的读物。这将进一步澄清您的疑问,并将为您提供大量的知识:)
希望这有帮助!
答案 1 :(得分:2)
SyntaxError,例如缺少冒号,括号,无效语句等。在您不修复之前,它不会允许您执行代码问题。
您的代码在运行时只会抛出错误,即第一次调用函数tofloat(i)
时,因此它是运行时错误。具体来说是NameError
。
此外,运行时错误不会停止程序的执行,直到没有执行该错误部分。因此,如果您永远不会调用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
这个代码不会像我们制作SyntaxError
那样执行,即使前3行完全没问题:
print 1
print 2
print 2
print (foo
<强>输出:强>
$ python so.py
File "so.py", line 5
^
SyntaxError: invalid syntax
请注意,python中还有一个RunTimeError
,当检测到一个不属于任何其他类别的错误时会引发该错误
答案 2 :(得分:0)
您有NameError
,您的代码应为:
def tofloat(i):
return float(i)
Python中没有flt
方法,这就是为什么它不适合你。
顺便说一下,你真的不需要将浮动转换包装成一个函数,你的整个代码可以写成:
def addnums(numlist):
return sum(map(float, numlist))
使用它:
>>> addnums(range(4))
6.0