Python 中 6 个经典的新手错误,你碰到过几个?

news/2024/7/2 23:26:31

fd489ba37b53b13734973393ab569365.gif

作者 | 快快

来源 | 快学Python

SyntaxError的来源

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

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

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

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

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

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

滥用赋值运算符 (=)

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

>>> len('hello') = 5File "<stdin>", line 1
SyntaxError: can't assign to function call>>> 'foo' = 1File "<stdin>", line 1
SyntaxError: can't assign to literal>>> 1 = 'foo'File "<stdin>", 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 "<stdin>", line 1fro i in range(10):^
SyntaxError: invalid syntax

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

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

>>> for i range(10):File "<stdin>", line 1for 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 "<stdin>", line 3
SyntaxError: 'break' outside loop>>> if 'jim' in names:
...     print('jim found')
...     continue
...File "<stdin>", line 3
SyntaxError: 'continue' not properly in loop

在这里,Python 可以很好地告诉您究竟出了什么问题。消息“'break' 外循环”和“'continue' 未正确循环”可帮助您确定要做什么。如果这段代码在一个文件中,那么 Python 也会有指向误用关键字的插入符号。

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

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

缺少括号、方括号和引号

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

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

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

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

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

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

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

错误的字典语法

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

>>> ages = {'pam'=24}File "<stdin>", line 1ages = {'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 5print('done')^
IndentationError: unindent does not match any outer indentation level

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

定义和调用函数

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

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

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

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

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

40f236f3c405e21c90fc21141e5632d1.gif

往期回顾

花 39 美金请AI画家弄了个Logo

Deepfake 技术换脸真假难辨!

pandas常用的8个option设置!

7岁男童因下棋太快,被机器人夹断手指?

分享
点收藏
点点赞
点在看

http://lihuaxi.xjx100.cn/news/253290.html

相关文章

PL/SQL三种集合类型的比较

PL/SQL三种集合类型的比较<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />集合是指在一个程序变量中包含多个值。PL/SQL提供的集合类型如下&#xff1a;Associative Array:TYPE t IS TABLE OF something INDEX BY PLS_INTEGER;N…

替代ELK:ClickHouse+Kafka+FlieBeat

点击关注公众号&#xff0c;Java干货及时送达&#x1f447;文章来源&#xff1a;https://c1n.cn/yoNYE目录背景Elasticsearch vs ClickHouse成本分析环境部署总结背景saas 服务未来会面临数据安全、合规等问题。公司的业务需要沉淀一套私有化部署能力&#xff0c;帮助业务提升行…

提升jmeter自身性能

JMeter负载测试时使用GUI界面和较多的收集测试结果的监听器容易造成jmeter的性能瓶颈&#xff0c;远程测试时的控制台尤为明显。提升JMeter负载测试时性能的方法如下&#xff1a; 官方的解决办法&#xff1a;http://jakarta.apache.org/jmeter/usermanual/best-practices.html#…

为什么以太网帧的长度最短64字节,最长1518字节?

1.碰撞槽时间 假设公共总线媒体长度为S&#xff0c;帧在媒体上的传播速度为0.7C&#xff08;光速&#xff09;&#xff0c;网络的传输率为R&#xff08;bps&#xff09;&#xff0c;帧长为L&#xff08;bps&#xff09;&#xff0c;tPHY为某站的物理层时延&#xff1b; 则有&a…

Oracle Golden Gate体系架构详解(原创) - CzmMiao的博客生活 - ITeye技术网站

Oracle Golden Gate体系架构详解(原创) - CzmMiao的博客生活 - ITeye技术网站

使用alterMIME实现添加message footer功能

1. 安装alterMIME tar zxvf altermime-0.3.8.tar.gz cd altermin3-0.3.8 make make install altermine将被编译安装到/usr/local/bin/2. 使用必备条件&#xff1a;一个运行且配置正常的邮件服务器3. 配置AlterMIME3.1 为altermine创建一个系统帐号&#xff0c;如下&#x…

百行代码发射红心,程序员何愁命不中女朋友!

七夕是中国民间的传统节日&#xff0c;不同时代、不同地域的人们给这个节日赋予了不同的含义。在漫长的演变过程中&#xff0c;七夕成了牛郎织女相会的日子。正因为这个美丽的爱情传说&#xff0c;七夕被视为中国最具浪漫色彩的、象征爱情的节日。在西风东渐的背景下&#xff0…

Kubernetes 缺少的多租户功能,你可以通过这些方式实现

点击关注公众号&#xff0c;Java干货及时送达&#x1f447;作者 | 叶丰 使用 Kubernetes 时&#xff0c;用户往往需要共享使用 Kubernetes 集群&#xff08;多租户&#xff09;&#xff0c;以在满足多团队、多客户需求的同时简化运维、降低成本。虽然 Kubernetes 本身不直接提…