欢迎光临
我们一直在努力

python-第26天:Python输出美化详解

30天入门Python(基础篇)——第26天:Python输出美化详解

📅 学习日期:第26天 | ⏱️ 预计用时:45分钟 | 📊 难度等级:⭐⭐


🎯 学习目标

  • 掌握 print() 函数的高级用法
  • 学会使用 f-string 格式化字符串
  • 理解字符串格式化的三种方式
  • 掌握控制台输出对齐技巧
  • 学会使用 pprint 模块美化复杂数据结构
  • 了解 ANSI 转义序列实现彩色输出

一、print() 函数进阶用法

1.1 基本语法

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

参数默认值说明
*objects 要输出的一个或多个对象
sep ' ' 对象之间的分隔符
end '\\n' 输出末尾的字符(默认换行)
file sys.stdout 输出目标(默认标准输出)
flush False 是否立即刷新输出缓冲区

1.2 sep 分隔符

# 默认分隔符是空格
print("Python", "Java", "C++")
# 输出: Python Java C++

# 自定义分隔符
print("Python", "Java", "C++", sep=" | ")
# 输出: Python | Java | C++

print("2026", "04", "28", sep="-")
# 输出: 2026-04-28

print("www", "example", "com", sep=".")
# 输出: www.example.com

1.3 end 结尾符

# 默认结尾是换行符
print("第一行")
print("第二行")
# 输出:
# 第一行
# 第二行

# 不换行,用空格代替
print("Hello", end=" ")
print("World", end=" ")
print("!")
# 输出: Hello World !

# 自定义结尾
for i in range(5):
print(i, end=" -> ")
print("完成")
# 输出: 0 -> 1 -> 2 -> 3 -> 4 -> 完成

1.4 file 输出到文件

# 将输出写入文件
with open("output.txt", "w", encoding="utf-8") as f:
print("这行文字会写入文件", file=f)
print("而不是显示在控制台", file=f)

# 输出到标准错误
import sys
print("这是一条错误信息", file=sys.stderr)

1.5 实战:进度条效果

import time

for i in range(1, 101):
print(f"\\r进度: {i}%", end="", flush=True)
time.sleep(0.05)
print("\\n完成!")


二、字符串格式化

2.1 f-string(推荐,Python 3.6+)

f-string 是最现代、最直观的字符串格式化方式。

name = "小明"
age = 20

# 基本用法
print(f"姓名: {name}, 年龄: {age}")

# 表达式求值
a, b = 10, 20
print(f"{a} + {b} = {a + b}")

# 调用函数
text = "hello"
print(f"大写: {text.upper()}")
print(f"长度: {len(text)}")

# 字典访问(注意引号)
user = {"name": "小明", "age": 20}
print(f"姓名: {user['name']}, 年龄: {user['age']}")

2.2 格式控制符

2.2.1 数字格式化

# 保留小数位数
pi = 3.14159265358979
print(f"Pi = {pi:.2f}") # 3.14
print(f"Pi = {pi:.4f}") # 3.1416

# 百分比格式
rate = 0.8765
print(f"完成率: {rate:.1%}") # 87.7%

# 千位分隔符
num = 1234567890
print(f"人口: {num:,}") # 1,234,567,890

# 二进制、八进制、十六进制
n = 255
print(f"十进制: {n}") # 255
print(f"十六进制: {n:x}") # ff
print(f"八进制: {n:o}") # 377
print(f"二进制: {n:b}") # 11111111

# 科学计数法
big = 12345678
print(f"科学计数: {big:e}") # 1.234568e+07

2.2.2 字符串对齐

# 左对齐、居中、右对齐
text = "Python"
print(f"|{text:<10}|") # 左对齐: |Python |
print(f"|{text:^10}|") # 居中: | Python |
print(f"|{text:>10}|") # 右对齐: | Python|

# 填充指定字符
print(f"|{text:*<10}|") # |Python****|
print(f"|{text:0>10}|") # |0000Python|

# 截取长度
name = "HelloWorld"
print(f"{name:.5}") # Hello

2.2.3 综合对齐示例

# 表格对齐
data = [
("姓名", "年龄", "成绩"),
("张三", 20, 95),
("李四", 22, 88),
("王五", 21, 92),
]

print(f"{'姓名':<6} {'年龄':>6} {'成绩':>6}")
print("-" * 20)
for name, age, score in data[1:]:
print(f"{name:<6} {age:>6} {score:>6}")

输出:

姓名 年龄 成绩
——————–
张三 20 95
李四 22 88
王五 21 92

2.2 str.format() 方法

f-string 出现之前的主流格式化方式。

name = "小明"
age = 20

# 位置参数
print("姓名: {}, 年龄: {}".format(name, age))

# 索引参数(可重复使用)
print("{0} 今年 {1} 岁, {0} 正在学习 Python".format(name, age))

# 关键字参数
print("姓名: {n}, 年龄: {a}".format(n=name, a=age))

# 混用
print("{0} 的成绩是 {score:.1f} 分".format(name, score=95.5))

2.3 % 格式化(旧式,不推荐)

name = "小明"
age = 20

# 基本用法
print("姓名: %s, 年龄: %d" % (name, age))

# 保留小数
print("Pi = %.4f" % 3.14159)

# 常见占位符
# %s – 字符串
# %d – 整数
# %f – 浮点数
# %x – 十六进制

2.4 三种格式化方式对比

方式语法性能推荐度Python版本
f-string f"{var}" 最快 ⭐⭐⭐⭐⭐ 3.6+
format() "{}".format() 中等 ⭐⭐⭐ 2.6+
% "%s" % var 较慢 所有版本

三、pprint 模块:美化复杂数据结构

3.1 基本使用

import pprint

# 普通 print 输出复杂字典
data = {
"users": [
{"name": "Alice", "age": 25, "skills": ["Python", "Java", "C++"]},
{"name": "Bob", "age": 30, "skills": ["Go", "Rust", "JavaScript"]},
{"name": "Charlie", "age": 28, "skills": ["Ruby", "PHP"]},
],
"total": 3,
"active": True,
}

print("— 普通 print —")
print(data)

print("\\n— pprint —")
pprint.pprint(data)

普通 print 输出(不易读):

{'users': [{'name': 'Alice', 'age': 25, 'skills': ['Python', 'Java', 'C++']}, …], 'total': 3, 'active': True}

pprint 输出(美观):

{'active': True,
'total': 3,
'users': [{'age': 25,
'name': 'Alice',
'skills': ['Python', 'Java', 'C++']},
{'age': 30,
'name': 'Bob',
'skills': ['Go', 'Rust', 'JavaScript']},
{'age': 28, 'name': 'Charlie', 'skills': ['Ruby', 'PHP']}]}

3.2 pprint 常用参数

import pprint

# width:每行最大宽度
pprint.pprint(data, width=40)

# indent:缩进空格数
pprint.pprint(data, indent=4)

# depth:显示深度(超过深度用 … 代替)
pprint.pprint(data, depth=2)

# compact:紧凑模式
pprint.pprint(data, compact=True, width=80)

# 创建 pprint 对象(推荐用于多次调用)
pp = pprint.PrettyPrinter(indent=2, width=60, sort_dicts=False)
pp.pprint(data)

3.3 格式化输出 JSON

import json

data = {"name": "Alice", "age": 25, "skills": ["Python", "Java"]}

# 方式一:使用 json.dumps
json_str = json.dumps(data, indent=2, ensure_ascii=False)
print(json_str)

# 方式二:结合 pprint
import pprint
pprint.pprint(data)


四、控制台彩色输出

4.1 ANSI 转义序列

# 基本颜色码
# \\033[{code}m 文字 \\033[0m

# 前景色(文字颜色)
RED = "\\033[31m"
GREEN = "\\033[32m"
YELLOW = "\\033[33m"
BLUE = "\\033[34m"
MAGENTA = "\\033[35m"
CYAN = "\\033[36m"
WHITE = "\\033[37m"
RESET = "\\033[0m"

print(f"{RED}这是红色文字{RESET}")
print(f"{GREEN}这是绿色文字{RESET}")
print(f"{YELLOW}这是黄色文字{RESET}")
print(f"{BLUE}这是蓝色文字{RESET}")

4.2 文字样式

BOLD = "\\033[1m" # 粗体
UNDERLINE = "\\033[4m" # 下划线
REVERSE = "\\033[7m" # 反色

print(f"{BOLD}这是粗体{RESET}")
print(f"{UNDERLINE}这是下划线{RESET}")
print(f"{BOLD}{RED}红色粗体{RESET}")

4.3 背景色

BG_RED = "\\033[41m"
BG_GREEN = "\\033[42m"
BG_YELLOW = "\\033[43m"
BG_BLUE = "\\033[44m"

print(f"{BG_WHITE}{BLACK}白底黑字{RESET}")
print(f"{BG_RED}红底白字{RESET}")

4.4 实用彩色输出函数

def color_print(text, color="white", style="normal"):
"""彩色打印函数"""
colors = {
"red": "\\033[31m", "green": "\\033[32m",
"yellow": "\\033[33m", "blue": "\\033[34m",
"magenta": "\\033[35m", "cyan": "\\033[36m",
"white": "\\033[37m",
}
styles = {
"bold": "\\033[1m", "underline": "\\033[4m",
"normal": "",
}
reset = "\\033[0m"
print(f"{styles[style]}{colors.get(color, '')}{text}{reset}")

# 使用
color_print("错误信息", color="red", style="bold")
color_print("成功信息", color="green")
color_print("警告信息", color="yellow")
color_print("提示信息", color="blue")

4.5 使用 rich 库(推荐)

如果项目允许安装第三方库,rich 是最佳选择:

pip install rich

from rich import print as rprint
from rich.console import Console
from rich.table import Table

console = Console()

# 彩色输出
rprint("[bold red]错误[/] | [green]成功[/] | [yellow]警告[/]")

# 漂亮表格
table = Table(title="学生成绩表")
table.add_column("姓名", style="cyan")
table.add_column("年龄", style="magenta")
table.add_column("成绩", style="green")

table.add_row("张三", "20", "95")
table.add_row("李四", "22", "88")
table.add_row("王五", "21", "92")

console.print(table)

# 进度条
from rich.progress import track
import time

for i in track(range(100), description="处理中…"):
time.sleep(0.05)


五、文本美化处理

5.1 文本对齐

# center(), ljust(), rjust()
text = "Python"

print(text.center(20)) # 居中
print(text.ljust(20, "-")) # 左对齐填充
print(text.rjust(20, "=")) # 右对齐填充

# zfill():数字前补零
print("42".zfill(5)) # 00042

5.2 文本截断和填充

# 截断
text = "Hello, World!"
print(text[:5] + "…") # Hello…

# 填充
text = "Python"
print(f"{text:-^20}") # ——-Python——–

5.3 多行文本格式化

# 方式一:三引号
message = """
=================================
欢迎使用学生管理系统
=================================
请选择操作:
1. 添加学生
2. 删除学生
3. 修改学生信息
4. 查看所有学生
5. 退出系统
=================================
"""

print(message)

# 方式二:textwrap 模块
import textwrap

long_text = "这是一段很长的文字,需要按照一定的宽度进行自动换行,以便在控制台中美观地显示。"
wrapped = textwrap.fill(long_text, width=20)
print(wrapped)

# 去除缩进
description = """
这是一个 Python 程序。
它演示了 textwrap 的用法。
可以方便地处理多行文本。
"""

print(textwrap.dedent(description))


六、实战项目

6.1 格式化输出学生信息

def print_student_table(students):
"""格式化输出学生信息表"""
# 表头
header = f"{'序号':^6} {'姓名':^10} {'年龄':^6} {'成绩':^8} {'等级':^8}"
print("=" * 44)
print(header)
print("-" * 44)

for i, student in enumerate(students, 1):
name = student["name"]
age = student["age"]
score = student["score"]

# 根据成绩判断等级
if score >= 90:
grade = "优秀"
elif score >= 80:
grade = "良好"
elif score >= 60:
grade = "及格"
else:
grade = "不及格"

print(f"{i:^6} {name:^10} {age:^6} {score:^8.1f} {grade:^8}")

print("=" * 44)

# 测试数据
students = [
{"name": "张三", "age": 20, "score": 95},
{"name": "李四", "age": 21, "score": 88},
{"name": "王五", "age": 19, "score": 72},
{"name": "赵六", "age": 22, "score": 58},
]

print_student_table(students)

6.2 简单进度条

import time

def progress_bar(current, total, width=40):
"""显示进度条"""
percent = current / total
filled = int(width * percent)
bar = "█" * filled + "░" * (width filled)
print(f"\\r[{bar}] {current}/{total} ({percent:.1%})", end="", flush=True)

# 使用
total = 50
for i in range(1, total + 1):
progress_bar(i, total)
time.sleep(0.05)
print("\\n完成!")

6.3 彩色日志系统

class Logger:
"""简易彩色日志器"""

LEVELS = {
"DEBUG": "\\033[36m", # 青色
"INFO": "\\033[32m", # 绿色
"WARNING": "\\033[33m", # 黄色
"ERROR": "\\033[31m", # 红色
"CRITICAL": "\\033[35m", # 紫色
}
RESET = "\\033[0m"

@classmethod
def log(cls, level, message):
color = cls.LEVELS.get(level, "")
print(f"[{color}{level:^8}{cls.RESET}] {message}")

# 使用
Logger.log("INFO", "程序启动成功")
Logger.log("DEBUG", "数据库连接已建立")
Logger.log("WARNING", "磁盘空间不足")
Logger.log("ERROR", "文件读取失败")
Logger.log("CRITICAL", "系统即将崩溃")


七、总结

功能推荐方法说明
基本输出 print() 使用 sep、end 控制格式
字符串格式化 f-string 性能最好、语法最简洁
数字格式化 f-string 格式控制符 .2f, ,, %, 😡 等
复杂数据美化 pprint 自动缩进和换行
JSON 美化 json.dumps(indent=2) 标准格式输出
控制台彩色 ANSI 转义码 \\033[31m 红色等
彩色高级功能 rich 库 表格、进度条、语法高亮
文本对齐 f-string {:<10} 左、中、右对齐
多行文本 textwrap 自动换行、去除缩进

最佳实践

  • 优先使用 f-string,Python 3.6+ 项目首选
  • 复杂数据结构用 pprint,比 print() 更易读
  • 终端美化用 rich,功能强大且易用
  • 表格输出用 f-string 对齐 或 rich.Table
  • 避免 import * 和 % 格式化,前者污染命名空间,后者已过时

  • 八、练习题

    练习 1:彩色成绩表

    使用 ANSI 颜色码输出成绩表,90 分以上显示绿色,60 分以下显示红色。

    练习 2:格式化字典

    编写函数,将字典按指定宽度格式化输出,键右对齐,值左对齐。

    练习 3:进度条升级

    改进进度条,增加预估剩余时间(ETA)显示。

    参考答案

    练习 1 参考答案
    def print_colored_scores(students):
    print(f"{'姓名':<10} {'成绩':>6}")
    print("-" * 20)
    for student in students:
    name, score = student["name"], student["score"]
    if score >= 90:
    color = "\\033[32m" # 绿色
    elif score >= 60:
    color = "\\033[33m" # 黄色
    else:
    color = "\\033[31m" # 红色
    reset = "\\033[0m"
    print(f"{name:<10} {color}{score:>6}{reset}")

    练习 3 参考答案
    import time

    def progress_bar_eta(current, total, start_time, width=40):
    percent = current / total
    filled = int(width * percent)
    bar = "█" * filled + "░" * (width filled)

    elapsed = time.time() start_time
    eta = elapsed / percent elapsed if percent > 0 else 0

    print(f"\\r[{bar}] {current}/{total} ({percent:.1%}) ETA: {eta:.1f}s", end="", flush=True)

    start = time.time()
    for i in range(1, 51):
    progress_bar_eta(i, 50, start)
    time.sleep(0.1)
    print()


    🎉 恭喜你完成了第26天的学习!掌握输出美化让你的程序和报告更加专业易读。

    📌 下一天预告:第27天 —— Python面向对象详解

    赞(0)
    未经允许不得转载:171主机测评 » python-第26天:Python输出美化详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址