Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 语法错误和运行时错误之间有什么区别?_Python_Dynamic_Syntax_Runtime - Fatal编程技术网

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

Python 语法错误和运行时错误之间有什么区别?,python,dynamic,syntax,runtime,Python,Dynamic,Syntax,Runtime,例如: 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,但我不清楚它是语法错误还是运行时错误。如果出现名称错误,代码应该是: def tofloat(i): return

例如:

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

如果出现
名称错误,代码应该是:

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程序。这可能发生在以下情况:

  • 您忘记在
    if、def、class
    等表达式的末尾添加
  • 您忘记关闭一些括号或括号等
  • 当您不遵守python语法时,还有很多地方:)
  • 在你的例子中,语法没有问题。对于解释器来说,
    flt(i)
    是对
    flt
    方法的一个非常有效的调用,如果该方法确实存在,则必须在运行时在作用域内进行检查。因此,口译员不会抱怨,而且你的问题的语法也很好

    实际上,这可以被看作是编译语言(如C++、C++等)的缺点。这种错误可以在编译时更快地检测到,编译器在发现时大声尖叫,以便你能注意到它。 对于动态语言,在调用实际方法之前,您不会注意到这一点。你的程序很简单,所以你可能会发现它很快。但是,
    float
    中缺少的
    o
    是在类的子类中的某个遗留框架内,作为属性,在其他模块内,等等。这将非常苛刻:)

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

    希望这有帮助

    当解析器发现您的语法不正确时,如缺少冒号、括号、无效语句等,就会引发。在您不解决该问题之前,它将不允许您执行代码

    您的代码在运行时只会抛出错误,即第一次调用函数
    tofloat(i)
    时,因此这是一个运行时错误。特别是
    namererror

    此外,运行时错误不会停止程序的执行,直到错误部分没有执行。因此,如果不调用
    tofloat
    ,代码实际上可以正常运行

    下面的代码在第三行之前正确执行,但在引发
    namererror
    时停止。(运行时错误)

    输出:

    1
    2
    3
    Traceback (most recent call last):
      File "so.py", line 4, in <module>
        print foo
    NameError: name 'foo' is not defined
    
    $ python so.py
      File "so.py", line 5
    
                  ^
    SyntaxError: invalid syntax
    
    输出:

    1
    2
    3
    Traceback (most recent call last):
      File "so.py", line 4, in <module>
        print foo
    NameError: name 'foo' is not defined
    
    $ python so.py
      File "so.py", line 5
    
                  ^
    SyntaxError: invalid syntax
    

    请注意,python中还有一个
    运行时错误
    ,当检测到不属于任何其他类别的错误时,会引发该错误

    ,这就是为什么问题说“flt假设为float()”(您已通过编辑更改了该错误,使其更加混乱)。这只是问它是什么类型的错误。我不得不说,你问了一些非常有趣的问题:)+1还应注意,在Python中,语法错误在技术上是运行时错误,因为它发生在运行时。不过,对于编译语言来说,情况并非如此——它们区分编译时错误(如语法错误)和运行时错误(如空指针错误)。@PauloBu,请检查一下这个问题好吗