7

例如:

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但我很困惑它是语法错误还是运行时错误。

4

3 回答 3

7

实际上,这是一个运行时错误,因为 Python 会在运行时尝试解析flt名称(因为它是动态语言),但它不会找到它。发生这种情况时,Python 会产生异常并指出它找不到您正在使用的符号,flt而这一切都发生在运行时。

当解释器发现 Python 的语法不引人注目时,就会发生语法错误。例如:Python 的语法无法将输入语法识别为有效的 Python 程序。这可能发生在以下情况:

  1. 您忘记在, etc 表达式:的末尾添加if, def, class
  2. 您忘记关闭一些括号或方括号等。
  3. 当您不遵守python的语法时,还有很多其他地方:)

在您的示例中,语法没有问题。对于解释器来说,这flt(i)是对方法的非常有效的调用,flt如果它确实存在,则必须在运行时在范围内进行检查。所以解释器不会抱怨,你的问题的语法很好。

实际上,这可以看作是相对于C#、C++ 等编译语言的劣势。这种错误可以在编译时更快地检测到,编译器在发现时会大声尖叫,以便您注意到它。

使用动态语言,在调用实际方法之前您不会注意到这一点。您的程序很简单,因此您可能会很快找到它。但是,缺少ofloat是在一个类的子类的子类中的一些遗留框架内,作为一个属性,在一些其他模块内等等。那将是苛刻的 :)

更新: 如果您了解 Python 内部的工作原理,那么 Python 文档中的执行模型是一本很好的读物。这将进一步澄清您的疑问,并将为您提供很多知识:)

希望这可以帮助!

于 2013-06-23T15:46:37.853 回答
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,当检测到不属于任何其他类别的错误时会引发它

于 2013-06-23T15:48:27.677 回答
0

你有一个NameError,你的代码应该是:

def tofloat(i): 
    return float(i)

Python中没有flt方法,这就是它不适合你的原因。

顺便说一句,你真的不需要将浮点转换包装到一个函数中,你的整个代码可以写成:

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

使用它:

>>> addnums(range(4))
6.0
于 2013-06-23T15:43:51.313 回答