例如:
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
但我很困惑它是语法错误还是运行时错误。
实际上,这是一个运行时错误,因为 Python 会在运行时尝试解析flt
名称(因为它是动态语言),但它不会找到它。发生这种情况时,Python 会产生异常并指出它找不到您正在使用的符号,flt
而这一切都发生在运行时。
当解释器发现 Python 的语法不引人注目时,就会发生语法错误。例如:Python 的语法无法将输入语法识别为有效的 Python 程序。这可能发生在以下情况:
:
的末尾添加if, def, class
在您的示例中,语法没有问题。对于解释器来说,这flt(i)
是对方法的非常有效的调用,flt
如果它确实存在,则必须在运行时在范围内进行检查。所以解释器不会抱怨,你的问题的语法很好。
实际上,这可以看作是相对于C#、C++ 等编译语言的劣势。这种错误可以在编译时更快地检测到,编译器在发现时会大声尖叫,以便您注意到它。
使用动态语言,在调用实际方法之前您不会注意到这一点。您的程序很简单,因此您可能会很快找到它。但是,缺少o
的float
是在一个类的子类的子类中的一些遗留框架内,作为一个属性,在一些其他模块内等等。那将是苛刻的 :)
更新: 如果您了解 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
,当检测到不属于任何其他类别的错误时会引发它
你有一个NameError
,你的代码应该是:
def tofloat(i):
return float(i)
Python中没有flt
方法,这就是它不适合你的原因。
顺便说一句,你真的不需要将浮点转换包装到一个函数中,你的整个代码可以写成:
def addnums(numlist):
return sum(map(float, numlist))
使用它:
>>> addnums(range(4))
6.0