交互式解释器
Python 解释器启动后若检测到标准输入与终端(tty)相连,便进入交互模式。这种模式是探索语言特性、验证表达式、调试代码片段的利器——它像一台可编程的高级计算器,又像一块随时可擦写的草稿板。
提示符与输入规则
交互界面有两类提示符。主提示符 >>> 表示解释器等待新的语句;次要提示符 ... 表示当前语句需要续行,常见于多行结构如 if、for、def、class 等。输入多行结构后,必须以空行结束,解析器才能识别代码块边界:
>>> def greet(name):
... if name:
... return f"Hello, {name}"
... return "Hello, stranger"
... # 空行,结束函数定义
>>> greet("Python")
'Hello, Python'
>>> greet("")
'Hello, stranger'
如果忘记输入空行,解释器会持续显示 ...,仿佛在等待更多内容。此时按回车输入空行即可解除:
>>> for i in range(3):
... print(i)
... # 空行结束循环
0
1
2
_ 变量:上一次输出
在交互模式下,解释器自动把上一次表达式求值的结果赋给变量 _(下划线)。这个机制让连续计算变得流畅,无需为中间结果命名:
>>> 17 / 3
5.666666666666667
>>> _ * 3 # 用上一步结果继续计算
17.0
>>> round(_, 2) # 再对结果取两位小数
5.67
_ 的赋值发生在每次表达式求值之后,但不会覆盖显式赋值的 _。如果你手动给 _ 赋值,解释器会创建一个普通的局部变量,屏蔽内置的魔法行为:
>>> _ = 100 # 显式赋值
>>> 50 + 25
75
>>> _ # 仍然是 100,未被更新
100
此外,_ 在 print() 等语句调用后不会被更新,因为 print() 返回 None:
>>> print("hello")
hello
>>> _ # None,不是 "hello"
帮助系统
交互式解释器内置了强大的帮助系统。输入 help() 进入交互式帮助界面,输入对象名则直接显示该对象的文档:
>>> help(str.upper) # 查看字符串 upper 方法的文档
Help on method_descriptor:
upper(self, /)
Return a copy of the string converted to uppercase.
>>> help(len) # 查看内置函数
对于模块和类,help() 会提取其 docstring 并格式化输出。自定义函数若写了文档字符串,同样可被 help() 检索:
>>> def add(a, b):
... """返回两数之和。
...
... Args:
... a: 第一个加数
... b: 第二个加数
... """
... return a + b
...
>>> help(add)
Help on function add in module __main__:
add(a, b)
返回两数之和。
...
在帮助界面中,按 q 退出;按空格翻页。如果不带参数调用 help(),则进入帮助子系统,可以输入任何模块、关键字或主题名:
>>> help()
help> keywords # 查看 Python 关键字列表
help> modules # 查看可用模块列表
help> quit # 退出帮助子系统
Tab 补全与编辑历史
在支持 GNU Readline 的系统上,交互式解释器启动时自动启用变量和模块名补全。按 Tab 键会查找当前作用域内的名称、可用模块名,以及带点号表达式的属性:
>>> import os
>>> os.pa<Tab> # 自动补全为 os.path
>>> os.path.jo<Tab> # 自动补全为 os.path.join
对于带点号的表达式如 string.a,补全机制会对最后一个点之前的部分求值,然后根据结果对象的属性给出建议。注意:如果对象实现了 __getattr__(),补全过程可能会触发用户代码的执行。
编辑历史默认保存在用户目录下的 .python_history 文件中。下次启动交互式解释器时,按上箭头即可调出之前的命令:
$ ls ~/.python_history
/home/user/.python_history
历史文件是纯文本格式,每行一条命令,可以用文本编辑器查看或清理。如果希望禁用历史记录,可以在启动解释器前删除或重命名该文件,但标准交互解释器不提供直接关闭历史记录的命令行开关。
多行字符串与缩进陷阱
交互模式下输入多行字符串时,缩进规则与文件模式略有不同。三重引号字符串会延续到下一个三重引号为止,期间解释器不会把缩进当作代码块层级:
>>> text = """第一行
... 第二行
... 第三行"""
>>> print(text)
第一行
第二行
第三行
但在 if 或 for 内部嵌套多行字符串时,仍需保持缩进一致,否则解析器会报错:
>>> if True:
... msg = """开始
... 错误缩进""" # 这里缩进与 if 体不一致
...
File "<stdin>", line 3
错误缩进"""
^
IndentationError: unindent does not match any outer indentation level
交互式解释器的替代品
标准解释器虽然功能完备,但在连续行缩进提示、括号匹配、高级历史管理等方面仍有提升空间。两个流行的替代品是 IPython 和 bpython。
IPython 提供了更强大的对象内省、魔法命令(如 %timeit 测量执行时间)、以及可定制的配置系统:
# IPython 中的增强功能(示意)
# In [1]: %timeit sum(range(1000))
# 28.4 µs ± 1.2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
bpython 则侧重于即时语法高亮和自动参数提示,界面更轻量。两者都可以通过 pip 安装:
$ pip install ipython
$ ipython
$ pip install bpython
$ bpython
常见错误与排查
交互模式下最常见的错误是缩进不一致。Python 严格要求同一代码块的每一行使用相同数量的空格:
>>> if True:
... print("正确")
... print("错误") # 少了一个空格
File "<stdin>", line 3
print("错误")
^
IndentationError: unindent does not match any outer indentation level
另一个陷阱是在交互模式下复制粘贴文件代码时,忘记处理前导提示符。如果直接粘贴包含 >>> 的代码,解释器会把提示符当作语法的一部分:
>>> >>> x = 1 # 错误:多余的 >>>
File "<stdin>", line 1
>>> x = 1
^
SyntaxError: invalid syntax
正确的做法是只粘贴 >>> 之后的内容,或者使用支持粘贴模式的终端(如 IPython 的 %paste 魔法命令)。
作为计算器的进阶用法
交互模式不仅是学习工具,也是日常计算助手。结合 _ 变量和内置数学函数,可以快速完成复杂运算:
>>> import math
>>> math.pi
3.141592653589793
>>> _ * 2 # 圆周率的两倍
6.283185307179586
>>> math.sin(_ / 4) # 计算 sin(π/2)
1.0
对于需要多步推导的数学问题,这种即时反馈比编写完整脚本更高效。一旦验证逻辑正确,再把代码整理成 .py 文件即可。