Python print() 函数详讲(2025-2026 视角)
print() 是 Python 中最常用的输出函数,看似简单,但实际上参数组合非常灵活,掌握它的各种用法能显著提升代码的可读性、调试效率和输出美观度。
1. print() 的基本签名(Python 3.x)
print(
*objects, # 要打印的对象(可多个,用逗号分隔)
sep=' ', # 对象之间的分隔符,默认空格
end='\n', # 结尾字符,默认换行
file=None, # 输出到哪里,默认 sys.stdout
flush=False # 是否立即刷新缓冲区
)
2. 常用参数详解 + 真实场景
| 参数 | 默认值 | 作用 | 高频实用场景示例 |
|---|---|---|---|
*objects | — | 要打印的内容(可以是任意多个对象,会自动调用 str()) | print(a, b, c) |
sep | ' ' | 多个对象之间的分隔符 | print(“姓名”, “年龄”, “城市”, sep=” |
end | '\n' | 本次 print 结束后追加的字符串(不换行最常用) | print(“.”, end=”) → 打印进度点不换行 |
file | None | 输出目标(可以是文件对象、StringIO、sys.stderr 等) | print(…, file=sys.stderr) → 错误日志 |
flush | False | 是否强制立即刷新缓冲区(True 时不等缓冲区满就输出) | 长任务实时进度条、日志必须立即看到 |
3. 经典用法合集(从入门到进阶)
3.1 最基础用法
print("Hello", "World") # Hello World
print(1, 2, 3, 4) # 1 2 3 4
3.2 控制分隔符(sep)
print("192", "168", "1", "100", sep=".") # 192.168.1.100
print("item1", "item2", "item3", sep=" → ") # item1 → item2 → item3
print(*range(1,6), sep=", ") # 1, 2, 3, 4, 5
3.3 不换行输出(end)
# 进度条风格
for i in range(10):
print(".", end="", flush=True) # 实时看到点一个一个出现
time.sleep(0.3)
print() # 最后补个换行
3.4 同时控制 sep 和 end
print("下载中", end=" ")
for _ in range(5):
print("[■]", end="", sep="")
print(" 完成!")
3.5 输出到文件 / 错误流
import sys
# 普通输出到文件
with open("log.txt", "a", encoding="utf-8") as f:
print("警告:温度过高", file=f)
# 输出到 stderr(红色高亮,在终端更醒目)
print("错误:文件不存在", file=sys.stderr)
3.6 flush 的真实价值(长任务)
# 没有 flush → 可能要等一堆任务结束才一次性看到输出
for i in range(100):
print(f"处理 {i+1}/100", end="\r", flush=True)
time.sleep(0.05)
print("\n完成!")
\r + flush=True 是最经典的单行覆盖式进度条写法。
4. 格式化输出的几种现代写法对比(print 内部配合)
| 写法 | 示例代码 | 可读性 | 灵活性 | 推荐场景 |
|---|---|---|---|---|
| 老式 % | print(“姓名: %s, 年龄: %d” % (name, age)) | ★★☆☆☆ | ★★☆☆☆ | 极老项目 |
| str.format() | print(“姓名: {}, 年龄: {:3d}”.format(name, age)) | ★★★☆☆ | ★★★★☆ | Python 3.0–3.5 时代主流 |
| f-string(首选) | print(f”姓名: {name}, 年龄: {age:3d}”) | ★★★★★ | ★★★★★ | Python 3.6+ 绝对首选 |
| repr / str 手动拼接 | print(“调试:”, repr(obj)) | ★★★☆☆ | ★★☆☆☆ | 调试复杂对象 |
强烈推荐写法(2025–2026 主流):
name = "张三"
age = 28
score = 88.75
print(f"{name} 今年 {age} 岁,本次考试 {score:.1f} 分")
# 张三 今年 28 岁,本次考试 88.8 分
print(f"{name:>10} | {age:^5} | {score:>6.1f}")
# 张三 | 28 | 88.8
5. 调试神技:print + 变量名自动显示(3.8+)
x = 42
y = [1, 2, 3]
print(f"{x=}") # x=42
print(f"{y = }") # y = [1, 2, 3] (注意空格美观)
print(f"{x*2 + len(y)=}") # x*2 + len(y)=87
6. 常见误区 & 注意事项
- print(1, 2, 3, sep=””) → 123(没有空格)
- print(“a”, end=””) 后不加 flush=True 时,在某些终端/重定向可能延迟显示
- print(a, b, c, sep=”, “, end=””) 最后不加 print() 会缺少换行
- 大量 print() 在生产环境中应换成 logging 模块
- Jupyter Notebook 中 print() 默认 end=’\n’,但大量输出建议用 tqdm 等进度条库
7. 总结:print() 进阶心法
- 日常开发:f-string + sep/end 是最 pythonic 的组合
- 调试:f”{var=}” + print(…, file=sys.stderr)
- 进度/实时输出:end=’\r’ / ” + flush=True
- 美观对齐:{var:>10} / {:^8} / {:.2f}
- 生产环境:逐步迁移到 logging 或 rich / textual 等美化库
你平时用 print() 最多的是哪种场景?
调试、进度显示、日志、格式化报表,还是别的?
如果有特别想优化的输出样式,也可以贴出来,我们一起改成更优雅的写法~