社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

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

作者丨快快
来源丨快学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
 
226 次点击