ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python学习中的无效语法常见原因和解决办法分析

2020-11-13 10:04:19  阅读:827  来源: 互联网

标签:解决办法 Python SyntaxError 语法 关键字 无效 代码


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

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

识别Python中的无效语法

理解SyntaxError回溯

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

image

image

Python中的无效语法

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

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

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

image

image

SyntaxError异常和回溯

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

image

image

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

image

image

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

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

image

image

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

遇到无效语法的文件名

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

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

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

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

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

IndentationError

TabError

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

常见的语法问题

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

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

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

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

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

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

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

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

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

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

1.拼错的关键字

2.缺少一个关键字

3.滥用关键字

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

结论

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

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

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

标签:解决办法,Python,SyntaxError,语法,关键字,无效,代码
来源: https://www.cnblogs.com/heiyu123/p/13967719.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有