Python 中的关键字和内置标识符

PythonBeginner
立即练习

介绍

在这个 Lab 中,你将探索 Python 保留字(reserved words)和预定义名称(pre-defined names)的基本概念。首先,你将学习如何识别 Python 关键字(keywords),这些是具有特定含义的特殊词语,不能用作变量名或函数名。我们将使用内置的 keyword 模块来列出它们。

接下来,你将了解 Python 的内置标识符(built-in identifiers),例如函数和常量,它们在你的代码中始终可用。最后,你将明白为什么必须避免将关键字和内置标识符用作你自己的名称,以防止错误并保持代码的整洁和功能性。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 99%。获得了学习者 100% 的好评率。

识别 Python 关键字

在这一步,你将了解 Python 关键字(keywords)。关键字,也称为保留字(reserved words),是语言语法的基本组成部分。它们具有特殊含义,不能用作变量、函数或任何其他标识符的名称。

Python 提供了一个名为 keyword 的内置模块,可以轻松查看所有当前的关键字。让我们编写一个脚本来显示它们。

所需文件 list_keywords.py 已经为你创建好了。在 WebIDE 左侧的文件浏览器中找到它,然后点击打开。

现在,将以下代码添加到 list_keywords.py 文件中:

import keyword

## kwlist 属性包含所有关键字的列表。
print(keyword.kwlist)

保存文件后,在你的 WebIDE 中打开集成终端(integrated terminal)。你可以通过点击顶部菜单中的 Terminal -> New Terminal 来实现。

通过在终端中执行以下命令来运行你的脚本:

python ~/project/list_keywords.py

输出将是所有 Python 关键字的列表。

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

重要的是要记住这些词是保留的。Python 是区分大小写的,所以虽然 if 是一个关键字,但 IF 就不是。然而,最佳实践是避免将关键字的任何变体用作名称,以保持代码的清晰性。

探索 Python 内置标识符

现在,让我们探索 Python 的内置标识符(built-in identifiers)。这些是 Python 为你预定义的名称,包括像 print() 这样的常用函数、intstr 这样的数据类型,以及异常(exceptions)。它们在任何 Python 脚本中始终可用,无需 import 语句。

你可以通过对一个特殊的称为 __builtins__ 的对象使用 dir() 函数来查看所有内置标识符的列表。

从文件浏览器中打开文件 list_builtins.py。将以下代码添加到其中:

## dir() 返回 __builtins__ 作用域中名称的列表。
print(dir(__builtins__))

保存文件,然后从终端运行脚本:

python ~/project/list_builtins.py

你将看到一个很长的名称列表打印到控制台。下面是输出的截断版本:

['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EncodingWarning', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

你将在这个列表中认出许多有用的名称,例如 leninputlistdict。在接下来的步骤中,我们将看到为什么你应该避免将这些名称用于你自己的变量。

避免将关键字用作标识符

在这一步,你将看到当你尝试将 Python 关键字用作变量名时会发生什么。由于关键字是为语言结构保留的,尝试给它们赋值会导致程序在运行之前就失败。

让我们通过尝试使用关键字 with 作为变量名来演示这一点。

在 WebIDE 编辑器中打开文件 keyword_error.py。向其中添加以下代码,这段代码是故意错误的:

## 这将导致错误,因为 'with' 是一个关键字。
with = 5
print(with)

保存文件并尝试从终端运行它:

python ~/project/keyword_error.py

Python 会立即停止并报告一个 SyntaxError(语法错误)。

  File "/home/labex/project/keyword_error.py", line 2
    with = 5
    ^^^^
SyntaxError: invalid syntax

错误信息 SyntaxError: invalid syntax 清楚地表明代码结构不正确。发生这种情况是因为 Python 解释器将 with 识别为应该启动 with 语句的关键字,而不是可以容纳值的名称。此规则适用于你在第一步中列出的所有关键字。

避免覆盖内置标识符

与关键字不同,Python 不会阻止你重新分配内置标识符。然而,这样做是错误的常见来源,应该避免。当你给一个内置名称赋新值时,你会“隐藏”其原始功能,这可能导致意外错误。

让我们看看当我们覆盖内置的 print 函数时会发生什么。

在 WebIDE 编辑器中打开文件 builtin_override.py。添加以下代码:

## 用一个整数覆盖内置的 print 函数。
print = 5

## 现在,尝试将 print() 用作函数。
print("hello")

保存文件并从终端运行它:

python ~/project/builtin_override.py

这次,脚本开始运行,但以 TypeError 失败。

Traceback (most recent call last):
  File "/home/labex/project/builtin_override.py", line 5, in <module>
    print("hello")
TypeError: 'int' object is not callable

错误 TypeError: 'int' object is not callable 发生是因为名称 print 不再指向内置的打印函数。相反,它指向整数 5。由于你不能像调用函数那样(使用括号)“调用”一个整数,程序就会崩溃。

这展示了覆盖内置项的危险性。它可能以不易察觉的方式破坏你的代码,并使其难以调试。始终为你自己的变量和函数选择独特、描述性的名称,以避免这些冲突。

总结

在这个实验(Lab)中,你学习了 Python 中两类重要的名称:关键字(keywords)和内置标识符(built-in identifiers)。你使用了 keyword 模块来列出 Python 中所有保留的关键字,并看到了尝试将它们用作变量名会导致 SyntaxError(语法错误)。

你还探索了内置标识符的列表,并演示了覆盖这些标识符所带来的问题,这可能导致 TypeError(类型错误)和其他运行时问题。关键要点是:始终为你自己的变量和函数选择唯一的名称,避免使用关键字和内置名称,以确保你的代码健壮、可读且没有冲突。