Python中6个常见的语法问题

嵌入式技术

1372人已加入

描述

 

SyntaxError的来源

当您运行 Python 代码时,解释器将首先解析它以将其转换为 Python 字节码,然后执行。解释器将在程序执行的第一阶段(也称为解析阶段)中发现 Python 中的任何无效语法。如果解释器无法成功解析您的 Python 代码,则意味着您在代码中的某处使用了无效语法。解释器将尝试向您显示该错误发生的位置。

当您第一次学习 Python 时,遇到 SyntaxError 可能会令人沮丧。Python 将尝试帮助您确定代码中无效语法的位置,但它提供的回溯可能有点令人困惑。有时,它指向的代码非常好。

注意:如果您的代码在语法上是正确的,那么您可能会引发其他不是 SyntaxError 的异常。

今天,咱们就来看看Python中6个常见的语法问题。

当您第一次遇到 SyntaxError 时,了解为什么会出现问题,以及如何修复 Python 代码中的无效语法,会很有帮助。

在下面的部分中,您将看到可能引发 SyntaxError 的一些更常见的原因,以及如何修复它们。

滥用赋值运算符 (=)

在 Python 中有几种情况,您无法对对象进行赋值。一些示例分配给文字和函数调用。在下面的代码块中,您可以看到一些尝试执行此操作的示例,以及由此产生的SyntaxError 回溯:

 


 

>>> len('hello') = 5   File "", line 1 SyntaxError: can't assign to function call >>> 'foo' = 1   File "", line 1 SyntaxError: can't assign to literal >>> 1 = 'foo'   File "", line 1 SyntaxError: can't assign to literal

第一个示例尝试将值 5 分配给 len() 调用。SyntaxError 消息在这种情况下非常有用。它告诉你不能给函数调用赋值。

第二个和第三个示例尝试为文字分配一个字符串和一个整数。相同的规则适用于其他文字值。回溯消息再次表明当您尝试为文字赋值时出现问题。

您的意图很可能不是为文字或函数调用分配值。例如,如果您不小心遗漏了额外的等号 (=),就会发生这种情况,这会将赋值转换为比较。如下所示,比较是有效的:

 


 

>>> len('hello') == 5 True

拼写错误、遗漏或误用 Python 关键字

Python 关键字是一组受保护的词,在 Python 中具有特殊含义。这些词不能用作代码中的标识符、变量或函数名称。它们是语言的一部分,只能在 Python 允许的上下文中使用。

错误使用关键字的常见方式有以下三种:

① 关键字拼写错误;

② 缺少关键字;

③ 滥用关键字;

如果您在 Python 代码中拼错了关键字,则会收到 SyntaxError。例如,如果关键字 for 拼写错误,会发生以下情况:

 


 

>>> fro i in range(10):   File "", line 1     fro i in range(10):         ^ SyntaxError: invalid syntax

该消息显示 SyntaxError: invalid syntax ,但这不是很有帮助。回溯指向 Python 可以检测到错误的第一个位置。要修复此类错误,请确保所有 Python 关键字拼写正确。

关键字的另一个常见问题是当您完全忘记写时:

 


 

>>> for i range(10):   File "", line 1     for i range(10):               ^ SyntaxError: invalid syntax

再一次,异常消息并没有那么有用,但回溯确实会尝试为您指明正确的方向。如果从插入符号中移回,则可以看到 for 循环语法中缺少 in 关键字。 您还可以滥用受保护的 Python 关键字。请记住,关键字只允许在特定情况下使用。如果您错误地使用它们,那么您的 Python 代码中将包含无效的语法。一个常见的例子是在循环外使用 continue 或 break。这很容易在开发过程中发生,当您正在实现事物并碰巧将逻辑移到循环之外时:


 

>>> names = ['pam', 'jim', 'michael'] >>> if 'jim' in names: ...     print('jim found') ...     break ...   File "", line 3 SyntaxError: 'break' outside loop >>> if 'jim' in names: ...     print('jim found') ...     continue ...   File "", line 3 SyntaxError: 'continue' not properly in loop

在这里,Python 可以很好地告诉您究竟出了什么问题。消息“'break' 外循环”和“'continue' 未正确循环”可帮助您确定要做什么。如果这段代码在一个文件中,那么 Python 也会有指向误用关键字的插入符号。 另一个示例是,如果您尝试将 Python 关键字分配给变量或使用关键字来定义函数:


 

>>> pass = True   File "", line 1     pass = True          ^ SyntaxError: invalid syntax >>> def pass():   File "", line 1     def pass():            ^ SyntaxError: invalid syntax

缺少括号、方括号和引号

通常,Python 代码中无效语法的原因是缺少或不匹配的右括号、方括号或引号。这些在很长的嵌套括号行或更长的多行块中很难发现。借助 Python 的回溯,您可以发现不匹配或丢失的引号:

 


 

>> message = 'don't'   File "", line 1     message = 'don't'                    ^ SyntaxError: invalid syntax

在这里,回溯指向无效代码,其中在结束单引号之后有一个 t'。要解决此问题,您可以进行以下两项更改之一:

① 用反斜杠转义单引号 ('don't');

② 用双引号将整个字符串括起来("don't");

另一个常见的错误是忘记关闭字符串。对于双引号和单引号字符串,情况和回溯是相同的:

 


 

>>> message = "This is an unclosed string   File "", line 1     message = "This is an unclosed string                                         ^ SyntaxError: EOL while scanning string literal

错误的字典语法

您之前看到,如果您将逗号放在字典元素之外,您可能会得到 SyntaxError。Python 字典的另一种无效语法形式是使用等号 (=) 来分隔键和值,而不是使用冒号:

 


 

>>> ages = {'pam'=24}   File "", line 1     ages = {'pam'=24}                  ^ SyntaxError: invalid syntax

同样,此错误消息不是很有帮助。然而,重复的行和插入符号非常有帮助!他们直指问题人物。

如果您将 Python 语法与其他编程语言的语法混淆,则此类问题很常见。如果您将定义字典的行为与 dict() 调用混淆,您也会看到这一点。要解决此问题,您可以用冒号替换等号。您还可以切换到使用 dict():

 


 

>>> ages = dict(pam=24) >>> ages {'pam': 24}

使用错误的缩进

其他编程语言使用花括号表示代码块,而 Python 使用空格。这意味着 Python 期望代码中的空白行为可预测。如果代码块中的一行包含错误的空格数,它将引发 IndentationError:

 


 

def foo():     for i in range(10):         print(i)   print('done') foo()

这可能很难看到,但第 5 行仅缩进了 2 个空格。应该和for循环语句一致,多4个空格。值得庆幸的是,Python 可以很容易地发现这一点,并会很快告诉您问题所在。

不过,这里也有一些歧义。print('done') 行是在 for 循环之后还是在 for 循环块内?当你运行上面的代码时,你会看到以下错误:

 


 

File "indentation.py", line 5     print('done')                 ^ IndentationError: unindent does not match any outer indentation level

尽管回溯看起来很像 SyntaxError 回溯,但它实际上是一个 IndentationError。错误信息也很有帮助。它告诉您该行的缩进级别与任何其他缩进级别都不匹配。换句话说,print('done') 被缩进了 2 个空格,但是 Python 找不到任何其他符合这种缩进级别的代码行。您可以通过确保代码与预期的缩进级别对齐来快速解决此问题。

定义和调用函数

在定义或调用函数时,您可能会在 Python 中遇到无效语法。例如,如果在函数定义的末尾使用分号而不是冒号,则会看到 SyntaxError:

 


 

>>> def fun();   File "", line 1     def fun();              ^ SyntaxError: invalid syntax

这里的回溯非常有用,插入符号直接指向问题字符。您可以通过将分号替换为冒号来清除 Python 中的这种无效语法。

此外,函数定义和函数调用中的关键字参数都需要按正确的顺序排列。关键字参数总是在位置参数之后。不使用此顺序将导致 SyntaxError:

 


 

>>> def fun(a, b): ...     print(a, b) ... >>> fun(a=1, 2)   File "", line 1 SyntaxError: positional argument follows keyword argument  

      审核编辑:彭静
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分