python无效语法怎么解决_Python学习中的无效语法常见原因和解决办法分析

Python以其简单的语法而闻名。然而,当您第一次学习Python时,或者当您具有另一种编程语言的坚实背景时,您可能会遇到一些Python不允许的事情。如果您在尝试运行Python代码时收到过SyntaxError错误,那么本指南可以帮助您。在本教程中,您将看到Python中常见的无效语法示例,并学习如何解决这个问题。

在本教程结束时,您将能够:

识别Python中的无效语法

理解SyntaxError回溯

解析无效语法或完全阻止它

04da974ef0873f23374dbc22c53c6834.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

image

Python中的无效语法

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

当您第一次学习Python时,得到一个SyntaxError可能会令人沮丧。Python将尝试帮助您确定无效语法在代码中的位置,但是它提供的回溯可能会让您感到有些困惑。有时,它所指向的代码是完全正确的。

您不能像处理其他异常一样处理Python中的无效语法。即使您尝试将try和except块封装到带有无效语法的代码中,您仍然会看到解释器抛出一个SyntaxError。

50729a88b84f4ce5c248fba699e96c2b.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

image

SyntaxError异常和回溯

当解释器在Python代码中遇到无效语法时,它将抛出一个SyntaxError异常,并提供一个带有一些有用信息的回溯,以帮助您调试错误。下面是一些Python中包含无效语法的代码:

21e1a61f063d56b39842db5a5c83d8ff.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

image

您可以在第4行字典的文字中看到无效的语法。第二个词条“jim”漏掉了一个逗号。如果你试着按原样运行这段代码,你会得到以下回溯结果:

a02f6442ffeed1d686f48187a98bf106.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

image

注意,traceback消息定位的错误在第5行,而不是第4行。Python解释器试图指出无效语法的位置。然而,它只能指出它最初注意到的问题。当您获得一个SyntaxError traceback,并且traceback所指向的代码看起来很好,那么您将希望开始向后移动代码,直到您能够确定哪里出了问题。

在上面的例子中,根据后面的内容,省略逗号是没有问题的。例如,第5行“michael”后面缺少逗号是没有问题的。但是一旦解释器遇到不理解的东西,它只能指出它发现的第一件不理解的事情。

18e0c5e1ffe749f1fc73cf1ced523fe4.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

image

有几个元素的SyntaxError回溯,可以帮助您确定无效的语法在您的代码:

遇到无效语法的文件名

遇到问题的行号和代码的复写行

在复制代码下面的行中有一个插入符号(^),它向您显示代码中有问题的那一点

异常类型SyntaxError之后的错误消息,可以提供帮助您确定问题的信息

在上面的例子中,给出的文件名是theofficefacts。行号为5,插入符号指向字典键michael的结束引用。SyntaxError回溯可能不会指向真正的问题,但它将指向解释器无法理解语法的第一个地方。

您可能会看到Python引发另外两个异常。它们等价于SyntaxError,但有不同的名称:

IndentationError

TabError

这些异常都继承自SyntaxError类,但它们是涉及缩进的特殊情况。当代码的缩进级别不匹配时,将引发IndentationError。当代码在同一文件中同时使用制表符和空格时,将引发一个制表符错误。在后面的小节中,您将进一步了解这些异常。

常见的语法问题

当您第一次遇到SyntaxError时,了解为什么会出现问题以及如何修复Python代码中的无效语法是很有帮助的。在下面的小节中,您将看到可能引发SyntaxError的一些更常见的原因,以及如何修复它们。

1.误用赋值运算符(=)

在Python中有几种情况下,您不能对对象进行赋值。一些例子是分配文字和函数调用。在下面的代码块中,您可以看到一些尝试这样做的示例和由此产生的SyntaxError回溯:

90464ea9e9d7c183685accaa42cbb901.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

第二个和第三个示例尝试将字符串和整数分配给文字。同样的规则也适用于其他文字值。同样,回溯消息表明,当您试图将一个值赋给一个文字时,问题就会发生。

fce1f8f70a06f3ca974b328add6c5a29.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

a06a04672c0b7090df647ec9d92ec191.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

大多数情况下,当Python告诉您正在对无法赋值的东西进行赋值时,您首先可能需要检查以确保语句不应该是布尔表达式。当您试图为Python关键字赋值时,也可能遇到这个问题,下一节将讨论这个问题。

2.拼写错误、缺少或误用Python关键字

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

有三种常见的方式,你可以错误地使用关键字:

1.拼错的关键字

2.缺少一个关键字

3.滥用关键字

如果您在Python代码中拼错了关键字,那么您将得到一个SyntaxError。例如,如果你把关键字拼错了,会发生以下情况:

c19455fe01800f2cb698a1af270920d6.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

消息将读取SyntaxError:无效语法,但这没有多大帮助。回溯指向Python可以检测到错误的第一个地方。要修复这类错误,请确保所有Python关键字拼写正确。

另一个关于关键字的常见问题是你完全忽略了它们:

e1a554666d0c58787e1bf90558237e15.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

同样,异常消息也不是很有用,但是回溯确实试图为您指出正确的方向。如果从插入符号返回,则可以看到for循环语法中缺少关键字in。

您还可能误用受保护的Python关键字。记住,关键字只允许在特定的情况下使用。如果您不正确地使用它们,那么您的Python代码中就会出现无效的语法。一个常见的例子是在循环外使用continue或break。这在开发过程中很容易发生,当你在实现一些东西的时候,碰巧把逻辑移出了一个循环:

0cbcce2c083a65da050096049d04a200.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

在这里,Python很好地告诉了您到底哪里出了问题。"'break' outside loop"和" continue' not exactly in loop"这两个信息可以帮助你明确地知道该怎么做。如果这段代码在一个文件中,那么Python也会让插入符号指向被误用的关键字。

另一个例子是,如果你尝试给一个变量分配一个Python关键字,或者使用一个关键字来定义一个函数:

26d90d7f8b1bfade2081e50c9c22e3e0.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

当您试图为pass分配一个值时,或者当您试图定义一个名为pass的新函数时,您将得到一个SyntaxError并再次看到“无效语法”消息。

在Python代码中解决这种类型的无效语法可能会稍微困难一些,因为代码从外部看起来没什么问题。如果您的代码看起来不错,但是您仍然会得到一个SyntaxError,那么您可以考虑检查您想要使用的变量名或函数名与您正在使用的Python版本的关键字列表。

受保护的关键字列表随着Python的每个新版本而改变。例如,在Python 3.6中,您可以使用await作为变量名或函数名,但是在Python 3.7中,这个单词已经被添加到关键字列表中。现在,如果您尝试使用await作为变量名或函数名,如果您的代码是Python 3.7或更高版本,那么这将导致SyntaxError。

另一个例子是print,它在python2和python3中有所不同:

12ea01e6c89b22f2dd07abb20f88b9d6.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

print是python2中的一个关键字,所以你不能给它赋值。然而,在python3中,它是一个可以赋值的内置函数。

你可以运行以下代码来查看关键字列表,无论你运行的Python版本是什么:

74532b1658592eabc78c8f907cef04b6.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

keyword还提供了有用的keyword.iskeyword()。如果你只是需要一个快速的方法来检查通过变量,那么你可以使用以下一行:

e7dc9b7bb1a01b61c808e83cf012c572.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这段代码将快速告诉您要使用的标识符是否是关键字。

3.缺少括号、方括号和引号

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

62ff6c5085d49787dc59ce8a7ab5321a.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

1.用反斜杠转义单引号('don\t')

2.将整个字符串用双引号括起来(“don't”)

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

c5871d17bf0cd3a25d5caf482ab1b56d.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这一次,traceback中的插入符号指向问题代码。SyntaxError消息“在扫描字符串文字时的EOL”更具体一些,有助于确定问题。这意味着Python解释器在一个开放字符串关闭之前到达该行(EOL)的末尾。要解决这个问题,请使用与开始时匹配的引号关闭字符串。在本例中,将使用双引号(")。

在f-string语句中缺少引号也会导致Python中无效的语法:

089bbf43ff54714cf7437912a8d4d206.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这里,打印的f-string中对ages字典的引用缺少关键引用的双引号。得到的回溯结果如下:

4499bc86980ee22d5f2a5eea8e2b02c0.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

Python识别问题并告诉您它存在于f-string中。消息“未终止字符串”也指出了问题所在。本例中的插入符号仅指向f-string的开头。

当插入符号指向f-string的问题区域时,这可能没有那么有用,但是它确实缩小了您需要查找的范围。在那个f字串的某个地方有一个未终止的字符串。你只需要找到在哪里。要修复此问题,请确保所有内部f-string引号和方括号都已存在。

缺少括号和方括号的情况大致相同。例如,如果您从列表中删除了右方括号,那么Python将会发现并指出它。然而,这有一些变化。第一种是把列表中的右括号去掉:

f76f6271222a9e6f4ee2c022bfed3ae6.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

当你运行这段代码时,你会被告知调用print()有一个问题:

3e40a3c0e3b3fb41701fbce2a961b77a.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这里发生的是Python认为列表包含三个元素:1、2和3 print(foo())。Python使用空格从逻辑上对事物进行分组,因为从print(foo())中没有逗号或括号分隔3,所以Python将它们集中在一起作为列表的第三个元素。

另一种变化是在列表的最后一个元素后面添加一个逗号,同时仍然去掉右方括号:

11471d8fc63968ee642e41802d988843.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

现在你得到了一个不同的回溯:

fc001f4d50153bd69e48416231698fae.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

在前面的例子中,3和print(foo())被集中在一起作为一个元素,但是在这里你可以看到一个逗号将两者分开。现在,print(foo())的调用被添加为列表的第四个元素,Python到达了文件的末尾,但没有使用右括号。回溯告诉您,Python已经到达了文件(EOF)的末尾,但是它还在期待其他内容。

在本例中,Python希望有一个右括号(]),但是重复的行和插入符号没有多大帮助。缺少括号和方括号是Python很难识别的。有时,您唯一能做的就是从插入符号开始,然后向后移动,直到您能够识别出缺失或错误的地方。

结论

在本教程中,您已经看到了SyntaxError回溯所提供的信息。您还看到了Python中许多常见的无效语法示例,以及这些问题的解决方案。这不仅会加快你的工作流程,而且还会使你成为一个更有帮助的代码审查者!

在编写代码时,请尝试使用能够理解Python语法并提供反馈的IDE。如果您将本教程中的许多无效Python代码示例放到一个良好的IDE中,那么它们应该在您执行代码之前突出显示问题行。

在学习Python时获得一个SyntaxError可能会令人沮丧,但是现在您知道了如何理解回溯消息以及在Python中可能遇到的无效语法形式。下一次出现SyntaxError时,您就可以更好地快速修复这个问题了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值