Python 2与Python 3执行同段代码报错不同的原因及代码问题解析
Python版本差异导致FizzBuzz代码报错位置不同的原因解析
一、不同Python版本报错位置不同的原因
- Python 2 不支持函数类型注解语法:代码第8行的
def fizz_buzz(n: int) -> str:使用了Python 3.5+才引入的类型注解(参数和返回值类型标注),Python 2的解释器无法识别这种语法,在解析到这一行时直接抛出语法错误,不会继续处理后续代码,因此报错位置停在第8行。 - Python 3 支持类型注解语法:解释器可以正常解析第8行的函数定义,继续向下执行代码,直到遇到第13行的while循环语法错误才抛出异常,因此报错位置在第13行。
二、代码无法运行的原因解析
你的推测是正确的,代码无法运行的核心问题确实和n的赋值/引用使用冒号:有关,具体细节如下:
while循环的语法错误:
代码中while (n: sys.stdin.readline())是完全错误的语法,Python中赋值操作使用等号=,而非冒号:。如果要在while循环条件里完成赋值,Python 3.8及以上版本可以使用海象运算符:=,正确写法应为:while (n := sys.stdin.readline()):若使用Python 3.8以下版本,需要拆分赋值和循环判断:
n = sys.stdin.readline() while n: print(fizz_buzz(int(n))) n = sys.stdin.readline()Python 2额外的兼容性问题:
即使修复了while循环的语法错误,Python 2仍然无法运行这段代码,因为它不支持函数类型注解。要在Python 2中运行,需要去掉函数定义中的类型标注,修改为:def fizz_buzz(n): return CYCLE_OF_15[n % 15] or str(n)
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

