飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 Python简介

    • Python是什么
    • 安装与运行
    • 交互式解释器
    • 注释与编码规范
  • 第2章 变量与数据类型

    • 变量与对象
    • 整数 int
    • 浮点数 float
    • 复数 complex
    • 布尔值 bool
    • 字符串 str
    • 空值 None
    • 类型转换
  • 第3章 运算符与表达式

    • 算术运算符
    • 比较运算符
    • 赋值运算符
    • 逻辑运算符
    • 位运算符
    • 身份与成员运算符
    • 海象运算符
    • 运算符优先级
  • 第4章 流程控制

    • if 语句
    • if-else 语句
    • if-elif-else 语句
    • match-case 语句
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 函数
    • break 与 continue
    • 循环的 else 子句
    • pass 语句
  • 第5章 数据结构

    • 列表创建与索引
    • 列表方法
    • 列表推导式
    • 元组
    • 序列解包
    • 集合
    • 字典创建与访问
    • 字典方法
    • 字典推导式
    • range 对象
  • 第6章 函数

    • 定义函数
    • 位置参数与关键字参数
    • 默认参数
    • 可变参数
    • 解包实参
    • 函数返回值
    • lambda 表达式
    • 文档字符串与注解
    • 作用域与命名空间
    • global 与 nonlocal
  • 第7章 模块与包

    • 模块导入
    • 模块搜索路径
    • 包与相对导入
    • 标准库概览
  • 第8章 文件与输入输出

    • 文件读写
    • 上下文管理器
    • 字符串格式化
    • JSON 与 CSV
  • 第9章 面向对象

    • 类与对象
    • 方法
    • 实例变量与类变量
    • 私有变量
    • 继承
    • 多重继承
    • 魔术方法
    • 属性装饰器
    • 数据类 dataclass
  • 第10章 异常处理

    • 语法错误与异常
    • try-except
    • 异常链与 raise
    • 清理操作
    • 自定义异常
  • 第11章 迭代器与生成器

    • 迭代器协议
    • 生成器
    • 生成器表达式
    • 迭代工具
  • 第12章 高级特性

    • 装饰器
    • 函数式编程
  • 第13章 工程实践

    • 测试与调试
    • 代码质量
    • 虚拟环境

交互式解释器

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 文件即可。

上一页
安装与运行
下一页
注释与编码规范