语法错误和运行时错误有什么区别?

2024-09-24 10:27:59 发布

您现在位置:Python中文网/ 问答频道 /正文

例如:

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,但是我搞不清它是语法错误还是运行时错误。


Tags: inforreturndef错误floattotal语法错误
3条回答

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

def tofloat(i): 
    return float(i)

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

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

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

使用它:

>>> addnums(range(4))
6.0

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

当解释器发现一些与Python语法不符的东西时,就会出现语法错误。例如:Python的语法无法将输入语法识别为有效的Python程序。这可能发生在:

  1. 您忘记在if, def, class等表达式的末尾添加:
  2. 你忘了把一些括号或括号等合上
  3. 当你不遵守python的语法时,还有很多地方:)

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

实际上,这可以被看作是<> E>编译语言 C语言、C++等的缺点。这种错误可以在编译时更快地检测到,编译器在发现时大声尖叫,这样你就可以注意到它。

对于动态语言,在调用实际方法之前不会注意到这一点。你的程序很简单,所以你可能会发现它很快。但是,float中缺少的o在某个类的子类中的某个遗留框架中,作为属性,在其他模块中,等等,这会很苛刻:)

更新:The execution model在Python的文档中,如果您了解Python内部是如何工作的,那么这是一本很好的读物。这将进一步澄清您的疑问,并为您提供大量的知识:)

希望这有帮助!

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,当检测到不属于任何其他类别的错误时,会引发这个问题

相关问题 更多 >