Py学习  »  Python

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

程序员大咖 • 1 年前 • 94 次点击  
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

作者丨快快
来源丨快学Python

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 "<stdin>", line 1
    def fun();
             ^
SyntaxError:
 invalid syntax
这里的回溯非常有用,插入符号直接指向问题字符。您可以通过将分号替换为冒号来清除 Python 中的这种无效语法。
此外,函数定义和函数调用中的关键字参数都需要按正确的顺序排列。关键字参数总是在位置参数之后。不使用此顺序将导致 SyntaxError:
>>> def fun(a, b):
...      print(a, b)
...
>>> fun(a=12)
  File "", line 1
SyntaxError: positional argument follows keyword argument
  

-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/151470
 
94 次点击