Python初学者易犯的6个错误新手避坑
Python中6个经典的新手错误
SyntaxError的来源
当您运行Python代码时, 解释器将首先解析它以将其转换为
Python字节码, 然后执行。解释器将在程序执行的第一阶段
(也称为解析阶段) 中发现Python中的任何无效语法。如果
解释器无法成功解析您的Python代码, 则意味着您在代码中
的某处使用了无效语法。解释器将尝试向您显示该错误发生的
位置。
当您第一次学习Python时, 遇到SyntaxError可能会令人沮
!丧。Python将尝试帮助您确定代码中无效语法的位置, 但它
提供的回溯可能有点令人困惑。有时,它指向的代码非常好。
注意:如果您的代码在语法上是正确的,那么您可能会引发其
他不是SyntaxError的异常。
1.滥用赋值运算符(=)15
在Python中有几种情况, 您无法对对象进行赋值。一些示例
分配给文字和函数调用。在下面的代码块中,您可以看到一些
尝试执行此操作的示例, 以及由此产生的SyntaxError回溯:
Python中6个经典的新手错误
>>>len('hello*) = 5
File"estd in>", line 1
SyntaxError:can'tassigntofunctioncall
>>>*foo°m 1
File“estd in>", line 1
SyntaxError:can'tassigntoliteral
) >1m'foo’
File"estd in>", line 1
SyntaxError:can'tassigntoliteral
第一个示例尝试将值5分配给len() 调用。SyntaxError消息
在这种情况下非常有用。它告诉你不能给函数调用赋值。
第二个和第三个示例尝试为文字分配一个字符串和一个整数。
相同的规则适用于其他文字值。回溯消息再次表明当您尝试为
文字赋值时出现问题。
您的意图很可能不是为文字或函数调用分配值。例如,如果您
不小心遗漏了额外的等号(=),就会发生这种情况,这会将赋
值转换为比较。如下所示,比较是有效的:
>>>len('hello') == 5
True
2.拼写错误、遗漏或误用Python关键字
Python中6个经典的新手错误
Python关键字是一组受保护的词, 在Python中具有特殊含
义。这些词不能用作代码中的标识符、变量或函数名称。它们
是语言的一部分, 只能在Python允许的上下文中使用。
|错误使用关键字的常见方式有以下三种:
①关键字拼写错误;
②缺少关键字;
③滥用关键字;
如果您在Python代码中拼错了关键字, 则会收到
SyntaxError。例如, 如果关键字for拼写错误, 会发生以下
情况:
>>>fro i in range(18) :
File“<stdin>", line 1
fro i in range(10) :
SyntaxError:invalid syntax
该消息显示SyntaxError:invalid syntax, 但这不是很有帮助
。回溯指向Python可以检测到错误的第一个位置。要修复此
类错误, 请确保所有Python关键字拼写正确。
关键字的另一个常见问题是当您完全忘记写时:
Python中6个经典的新手错误
>>>for i range(18) :
File“<stdin>", line 1
for i range(18) :
SyntaxError:invalid syntax
再一次,异常消息并没有那么有用,但回溯确实会尝试为您指
明正确的方向。如果从插入符号中移回, 则可以看到for循环
语法中缺少in关键字。
您还可以滥用受保护的Python关键字。请记住, 关键字只允
许在特定情况下使用。如果您错误地使用它们,那么您的
Python代码中将包含无效的语法。一个常见的例子是在循环
外使用continue或break。这很容易在开发过程中发生, 当
您正在实现事物并碰巧将逻辑移到循环之外时:
>names m['pam', 'jin', *michael']
if'jim'in nanes:
print(*jim found')
break
File“estd in>", line 3
SyntaxError:'break'outside loop
s>if'jim'in nanes:
print(*jin found')
continue
File“estd in", line 3
SyntaxError:'continue'not properly in loop
Python中6个经典的新手错误
在这里, Python可以很好地告诉您究竟出了什么问题。消息
“'break'外循环”和“continue'未正确循环”可帮助您确
定要做什么。如果这段代码在一个文件中, 那么Python也会
有指向误用关键字的插入符号。
另一个示例是, 如果您尝试将Python关键字分配给变量或使
用关键字来定义函数:
>>>pass=True
File“estd in>", line 1
pass=True
SyntaxError:invalid syntax
>>>def pass() :
File"estd in>", line 1
def pass() :
SyntaxError:invalid syntax
3.Python中6个经典的新手错误
通常, Python代码中无效语法的原因是缺少或不匹配的右括
号、方括号或引号。这些在很长的嵌套括号行或更长的多行块
中很难发现。借助Python的回溯, 您可以发现不匹配或丢失
的引号:
>message-*don't
File“<stdin>", line 1
message='don't'
SyntaxError:invalid syntax
Python中6个经典的新手错误
在这里,回溯指向无效代码,其中在结束单引号之后有一个t'
。要解决此问题,您可以进行以下两项更改之一
①用反斜杠转义单引号('don't') ;
②用双引号将整个字符串括起来("don't") ;
另一个常见的错误是忘记关闭字符串。对于双引号和单引号字
符串,情况和回溯是相同的:
>>>message="This is an unclosed string
File“<stdin>", line 1
message-“This is an unclosed string
SyntaxError:EOL while scanning string literal
4.错误的字典语法
您之前看到,如果您将逗号放在字典元素之外,您可能会得到
SyntaxError。Python字典的另一种无效语法形式是使用等号
(=)来分隔键和值,而不是使用冒号:
>>>ages·{'pam'-24}
File“<stdin>", line 1
ages-{'pam'-24}
SyntaxError:invalid syntax
同样,此错误消息不是很有帮助。然而,重复的行和插入符号
非常有帮助!他们直指问题人物。
Python中6个经典的新手错误
>>>ages=dict(pam=24)
>>>ages
{'pam':24}
如果您将Python语法与其他编程语言的语法混淆, 则此类问
题很常见。如果您将定义字典的行为与dict() 调用混淆, 您也
会看到这一点。要解决此问题,您可以用冒号替换等号。您还
可以切换到使用dict) :
5.使用错误的缩
其他编程语言使用花括号表示代码块, 而Python使用空格。
这意味着Python期望代码中的空白行为可预测。如果代码块
中的一行包含错误的空格数, 它将引发Indentation Error:
这可能很难看到, 但第5行仅缩进了2个空格。应该和for循
f foo() :
for i in range(10) :
print(i)
print('done')
foo()
环语句一致, 多4个空格。值得庆幸的是, Python可以很容易
地发现这一点,并会很快告诉您问题所在。
不过, 这里也有一些歧义。print('done') 行是在for循环之后
还是在for循环块内?当你运行上面的代码时, 你会看到以下
错误:
Python中6个经典的新手错误
File“indentation.py", line 5
print('done*)
Indentation Error:un indent does not match any outer indentation level
尽管回溯看起来很像SyntaxError回溯, 但它实际上是一个
进级别与任何其他缩进级别都不匹配。换句话说,
Indentation Error。错误信息也很有帮助。它告诉您该行的缩
print('done') 被缩进了2个空格, 但是Python找不到任何其
他符合这种缩进级别的代码行。您可以通过确保代码与预期的
缩进级别对齐来快速解决此问题。
6.定义和调用函数
SyntaxError:
>>>def fun O;
File“estd in>", line 1
def fun() ;
SyntaxError:invalid syntax
这里的回溯非常有用,插入符号直接指向问题字符。您可以通
过将分号替换为冒号来清除Python中的这种无效语法。
此外,函数定义和函数调用中的关键字参数都需要按正确的顺
在定义或调用函数时, 您可能会在Python中遇到无效语法。
例如,如果在函数定义的末尾使用分号而不是冒号,则会看到
Python中6个经典的新手错误
序排列。关键字参数总是在位置参数之后。不使用此顺序将导
致SyntaxError:
>>>def fun(a, b) :
print(a, b)
mmm
>>>fun(a-1, 2)
File“<stdin>", line 1
SyntaxError:positional argument follows keyword argument