Python print() 函数详讲
(从入门到进阶、从常见误区到鲜为人知的细节,2025-2026 实用版)
print(*objects, sep=' ', end='\n', file=None, flush=False)
1. 五个参数各自的真正含义
| 参数 | 默认值 | 真正作用 | 最常用场景 |
|---|---|---|---|
| *objects | — | 要打印的内容,可以是 0 个、1 个或多个对象(自动调用 str()) | 常规输出 |
| sep | ‘ ‘ (空格) | 多个对象之间的分隔符 | print(a,b,c, sep=’,’) → 1,2,3 |
| end | ‘\n’ | 本次 print 结束后追加的字符串 | print(“Loading”, end=”) → 不换行 |
| file | sys.stdout | 输出目标对象(必须有 .write() 方法) | 写文件、写内存缓冲、写网络 socket 等 |
| flush | False | 是否立即刷新缓冲区(强制把内容写到 file) | 日志、进度条、实时输出 |
2. 常用写法速查表(建议收藏)
# 最基础
print("Hello")
# 多个值 + 自定义分隔符
print(1, 2, 3, 4) # 1 2 3 4
print(1, 2, 3, sep=',') # 1,2,3
print(1, 2, 3, sep=' | ') # 1 | 2 | 3
# 不换行(最常见进度条写法)
print("进度: 45%", end='\r') # \r 回到行首
print("正在处理...", end='', flush=True)
# 同时输出到文件
with open("log.txt", "a", encoding="utf-8") as f:
print("错误发生", file=f)
# 同时输出到屏幕和文件(最实用组合)
import sys
print("重要信息", file=sys.stdout) # 默认就是 stdout
print("调试信息", file=sys.stderr) # 错误通道(红色)
# 格式化(现代写法推荐)
name, age = "小明", 18
print(f"{name} 今年 {age} 岁") # f-string(首选)
print("{} 今年 {} 岁".format(name, age)) # 仍然常用
print("%s 今年 %d 岁" % (name, age)) # 老风格(不推荐新代码用)
# 打印复杂对象(调试神器)
data = {"a":1, "b":[2,3], "c":(4,5)}
print(data) # 直接打印
print(repr(data)) # 更精确(带引号等)
from pprint import pprint
pprint(data, width=40, indent=2) # 美化输出(推荐)
3. 真正高频但很多人不会用的技巧
3.1 进度条 / 实时刷新(最经典写法)
import time
for i in range(101):
print(f"\r进度: {i}%", end="", flush=True)
time.sleep(0.05)
print() # 最后换行
3.2 同时写屏幕 + 文件(日志常用)
class Tee:
def __init__(self, *files):
self.files = files
def write(self, text):
for f in self.files:
f.write(text)
f.flush() if hasattr(f, 'flush') else None
def flush(self):
for f in self.files:
if hasattr(f, 'flush'):
f.flush()
import sys
log_file = open("run.log", "a", encoding="utf-8")
sys.stdout = Tee(sys.stdout, log_file)
print("这条同时出现在屏幕和文件里")
3.3 彩色输出(终端美化,面试/工具常用)
# 简单版(不依赖第三方库)
print("\033[31m红色警告\033[0m") # 红色
print("\033[1;32m粗体绿色\033[0m") # 粗体绿色
print("\033[93m黄色高亮\033[0m") # 黄色
# 颜色对照(最常用几种)
# 31 红 32 绿 33 黄 34 蓝 35 紫 36 青 37 白
# 加 1 变粗体 加 4 下划线 加 9 删除线
3.4 打印到 stderr(区分正常输出与错误)
import sys
print("正常信息", file=sys.stdout)
print("警告/错误", file=sys.stderr)
4. 容易踩的坑(真实案例排序)
| 排名 | 问题写法 | 真实表现 | 正确做法 |
|---|---|---|---|
| 1 | print(“a”,”b”,”c”,sep=””) | abc(没有空格) | sep=” 才是空字符串 |
| 2 | for i in range(10): print(i,end=”) | 0123456789(但缓冲严重,卡顿) | 加 flush=True |
| 3 | print(“中文”, encoding=’utf-8′) | TypeError | encoding 是 open() 的参数,不是 print |
| 4 | print(f”{x=}”) | x=42(Python 3.8+ 支持) | 3.7 及以下不支持 |
| 5 | print(*lst, sep=’\n’) | 每个元素一行 | 非常好用,但很多人忘记 * 解包 |
5. print() 在不同 Python 版本的细微变化(快速对照)
| 版本 | 重要变化点 |
|---|---|
| 2.x | print 是语句,不是函数 |
| 3.0~3.7 | 基本稳定 |
| 3.8 | 支持 f”{var=}” 调试神器 |
| 3.9+ | 无大变化,但性能持续微优化 |
| 3.12+ | 更好的错误提示(比如 sep/end 类型错) |
6. 总结:print() 现代推荐写法模板
# 日常调试
print(f"{variable=}") # 3.8+
print(f"[{__name__}] {msg}") # 带模块名
# 进度/日志
print(f"\r{msg}", end="", flush=True)
# 带颜色(终端)
print("\033[31m[ERROR]\033[0m", msg)
# 多值分隔
print(*values, sep=" | ", end="\n\n")
# 同时记录文件
print(msg, file=log_file, flush=True)
你现在最常遇到的 print 相关问题是哪一类?
- 进度条/实时刷新卡顿?
- 想做漂亮的表格输出?
- 需要同时输出到多个目标?
- 彩色 + emoji 美化终端?
- 还是调试时打印嵌套结构很乱?
告诉我,我可以给你更针对性的进阶写法。