print 函数 - 高级输出和格式化技巧

Python print 函数的高级使用技巧,包括参数控制、格式化输出、单行刷新等实用方法

分类: stdlib 难度: 初级 更新: 2024-01-15
print 输出 格式化 刷新 终端

print 函数 - 高级输出和格式化技巧

📝 概述

print 函数是 Python 中最常用的输出函数,除了基本的文本输出外,还支持多种高级参数控制输出格式、分隔符、结束符、输出流等。掌握 print 函数的高级用法可以帮助您实现更灵活的输出控制,特别在调试、进度显示和数据输出方面非常有用。

🎯 学习目标

  • 掌握 print 函数的完整参数列表和用法
  • 学会使用 sep、end、file、flush 参数
  • 掌握单行刷新输出技巧
  • 学会在模型训练中显示进度信息
  • 了解格式化输出的最佳实践

📋 前置知识

  • Python 基本语法
  • 字符串格式化基础
  • 文件操作基础概念

🔍 详细内容

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

参数说明

参数名 类型 必需 默认值 说明
*objects Any 要打印的值,可以是多个参数
sep str ’ ‘ 多个值之间的分隔符,默认为空格
end str ‘\n’ 输出结束后的字符,默认为换行符
file TextIO sys.stdout 输出流,默认为标准输出
flush bool False 是否立即刷新输出缓冲区

基础用法示例

# 基本输出
print("Hello, World!")

# 输出多个值
print("姓名:", "张三", "年龄:", 25)

# 自定义分隔符
print("apple", "banana", "orange", sep=", ")
# 输出: apple, banana, orange

print("2024", "01", "15", sep="-")
# 输出: 2024-01-15

# 自定义结束符
print("第一行", end="")
print("第二行")
# 输出: 第一行第二行

print("Progress: ", end="")
print("50%")
# 输出: Progress: 50%

💡 实际应用

单行输出并刷新

在需要在同一行更新显示内容时,可以使用 \r 回车符配合 end=''flush=True

import time

# 基本的单行刷新输出
for i in range(15):
    time.sleep(0.5)  # 这里为了查看输出变化,实际使用不需要 sleep
    print('\r', i, end='', flush=True)
    # print('\r', 15-i, end='')  # 从两位变一位会有问题

解决位数变化问题

当输出的数字位数发生变化时,可能会出现显示残留,使用格式化输出可以解决:

import time

for i in range(15):
    time.sleep(0.5)
    print('\r', "{:d}".format(15-i), end='', flush=True)

模型训练中的进度显示

在机器学习模型训练中,经常需要显示训练进度、损失函数和准确率:

import time

# 设置 epochs 和 batch 的数量
epochs = 5
n_batch = 15

# 模拟训练参数
train_loss = 1.2345
train_acc = 0.345678
test_loss = 1.1234
test_acc = 0.235467

for i in range(epochs):
    for j in range(n_batch):
        time.sleep(0.5)
        train_loss -= 0.001
        train_acc += 0.0001

        # 显示训练进度(同一行刷新)
        print("\rEpoch: {:d} batch: {:d} loss: {:.4f} acc: {:.4f} | {:.2%}"
              .format(i+1, j+1, train_loss, train_acc, (j+1)*1.0/n_batch), 
              end='', flush=True)
              
    # 每个 epoch 结束后显示完整结果
    test_loss -= 0.001
    test_acc += 0.0001
    
    print("\rEpoch: {:d}/{:d} train_loss: {:.4f} test_loss: {:.4f} train_acc: {:.4f} test_acc: {:.4f}"
          .format(i+1, epochs, train_loss, test_loss, train_acc, test_acc), end='\n')

重要提示

  • print 语句中 “Epoch” 前面的 \r 是必需的,用于回到行首
  • 内层循环使用 end='' 保持在同一行
  • 外层循环使用 end='\n' 换到新行

输出到文件

# 将输出重定向到文件
with open('output.txt', 'w', encoding='utf-8') as f:
    print("这是写入文件的内容", file=f)
    print("第二行内容", file=f)

# 同时输出到屏幕和文件
import sys

with open('log.txt', 'w', encoding='utf-8') as f:
    message = "重要信息"
    print(message)  # 输出到屏幕
    print(message, file=f)  # 输出到文件

高级格式化输出

# 使用不同的分隔符
data = ['张三', 25, '软件工程师', '北京']
print(*data, sep=' | ')
# 输出: 张三 | 25 | 软件工程师 | 北京

# 创建表格样式输出
headers = ['姓名', '年龄', '职业', '城市']
print(*headers, sep='\t')
print('-' * 40)
print(*data, sep='\t')

# 使用 flush 确保立即输出
print("正在处理...", end='', flush=True)
time.sleep(2)
print(" 完成!")

调试技巧

# 调试变量值
def debug_print(*args, **kwargs):
    """调试用的 print 函数"""
    import inspect
    frame = inspect.currentframe().f_back
    line = frame.f_lineno
    filename = frame.f_code.co_filename
    print(f"[DEBUG {filename}:{line}]", *args, **kwargs)

x = 10
y = 20
debug_print("x =", x, "y =", y)

⚠️ 注意事项

  • 使用 \r 进行单行刷新时,新内容的长度应该足够覆盖旧内容,否则可能出现残留
  • 在需要实时显示进度的场景下,记得使用 flush=True 强制刷新缓冲区
  • 输出到文件时注意文件编码,建议使用 encoding='utf-8'
  • 在生产环境中避免频繁使用 flush=True,可能影响性能

🔗 相关内容

📚 扩展阅读

🏷️ 标签

print 输出 格式化 刷新 终端 进度显示


最后更新: 2024-01-15
作者: Python 文档团队
版本: 1.0

作者: Python 文档团队

版本: 1.0

讨论与反馈

欢迎在下方留言讨论,分享你的学习心得或提出问题。评论基于GitHub Issues,需要GitHub账号。