在 Python 编程中,print 函数是最基础也最常用的函数之一。无论是调试代码、输出运行结果,还是与用户交互,print 函数都扮演着关键角色。然而,多数开发者对 print 函数的认知仅停留在“打印字符串”的表层功能,其丰富的参数配置和灵活的应用场景尚未被充分挖掘。本文基于 Python 3.13.6 版本,从语法结构、参数原理、实战案例三个维度,全面解析 print 函数的核心能力,带您掌握从基础到进阶的使用技巧。
在 Python 3.13.6 中,print 函数的官方语法如下:
print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False)
该函数支持可变数量的位置参数(value, ...)和 4 个固定关键字参数(sep、end、file、flush),各参数分工明确,共同决定输出的格式、位置和时机。
value, ...作用:接收任意数量、任意类型的数据(字符串、数字、列表、字典等),函数会自动将其转换为字符串形式后输出。
原理:当传入多个 value 时,print 会按传入顺序依次处理,最终通过 sep 参数指定的分隔符连接成一个整体输出。
基础案例:
# 案例1:打印单个字符串print("Hello, Python 3.13.6!") # 输出:Hello, Python 3.13.6!# 案例2:打印多个不同类型的数据name = "Alice"age = 25score = 98.5hobbies = ["reading", "coding"]print("姓名:", name, "年龄:", age, "成绩:", score, "爱好:", hobbies)# 输出:姓名: Alice 年龄: 25 成绩: 98.5 爱好: ['reading', 'coding']sep默认值:' '(单个空格)
作用:指定多个 value 之间的分隔符,支持任意字符串(如 -、|、t 等)。
应用场景:格式化输出多组数据(如 CSV 格式、编号列表),避免手动拼接字符串的繁琐。
实战案例:
# 案例3:用 "-" 分隔多个数字print(2024, 9, 4, sep='-') # 输出:2024-09-04(日期格式)# 案例4:用 " | " 分隔多列数据print("姓名", "年龄", "成绩", sep=" | ")print("Bob", 22, 89, sep=" | ")print("Charlie", 23, 92, sep=" | ")# 输出:# 姓名 | 年龄 | 成绩# Bob | 22 | 89# Charlie | 23 | 92# 案例5:用 "t" 实现表格对齐(制表符)print("学科", "满分", "得分", sep="t")print("数学", 150, 135, sep="t")print("英语", 120, 110, sep="t")# 输出:# 学科 满分 得分# 数学 150 135# 英语 120 110end默认值:'n'(换行符)
作用:指定 print 函数输出结束后添加的字符,而非默认的“换行”,可实现“不换行输出”“自定义结尾符号”等需求。
应用场景:进度条打印、一行内分段输出、自定义结尾标识(如 !、...)。
实战案例:
# 案例6:不换行输出(用空字符串作为结尾)print("正在加载", end='')for i in range(5):import time
time.sleep(0.5) # 模拟加载延迟print(".", end='')# 输出:正在加载.....(5个点依次打印在同一行)# 案例7:自定义结尾符(添加感叹号)print("欢迎使用本系统", end='!')print("祝您操作愉快", end='nn') # 手动添加两个换行print("这是新的一行")# 输出:# 欢迎使用本系统!祝您操作愉快# # 这是新的一行# 案例8:用 "r" 实现“覆盖式输出”(回车符,光标回到行首)import timefor percent in range(0, 101, 10):print(f"下载进度:{percent}%", end='r')
time.sleep(0.8)print("下载进度:100% - 下载完成!")# 输出:进度从 0% 到 100% 逐步覆盖,最终显示“下载完成”file默认值:sys.stdout(标准输出流,即“控制台”)
作用:指定 print 函数的输出目标,支持任何具有 write() 方法的“类文件对象”(如本地文件、字节流)。
注意事项:
若输出到文件,需确保文件路径正确,且具备读写权限;
使用 open() 函数打开文件时,需指定正确的模式(如 'w' 写入、'a' 追加);
推荐使用 with 语句管理文件,避免资源泄漏。
实战案例:
# 案例9:输出到本地文件(覆盖写入模式)with open("student_info.txt", "w", encoding="utf-8") as f:print("学生信息表", file=f)print("="*20, file=f)print("姓名:David", "年龄:24", "专业:计算机", file=f, sep=" | ")print("姓名:Ella", "年龄:23", "专业:英语", file=f, sep=" | ")# 案例10:输出到本地文件(追加模式)with open("student_info.txt", "a", encoding="utf-8") as f:print("n新增学生:", file=f)print("姓名:Frank", "年龄:22", "专业:数学", file=f, sep=" | ")# 验证结果(读取文件内容)with open("student_info.txt", "r", encoding="utf-8") as f:
content = f.read()print("文件内容:")print(content)# 输出(文件内容):# 学生信息表# ====================# 姓名:David | 年龄:24 | 专业:计算机# 姓名:Ella | 年龄:23 | 专业:英语# # 新增学生:# 姓名:Frank | 年龄:22 | 专业:数学flush默认值:False(不主动刷新缓冲区)
原理:Python 输出时会使用“缓冲区”(临时存储数据的区域),当缓冲区满、程序结束或遇到换行符时,才会将数据写入目标(如控制台、文件)。flush=True 会强制立即刷新缓冲区,确保数据实时输出。
应用场景:实时进度显示、日志实时写入、多线程/多进程下的输出同步。
实战案例:
# 案例11:对比 flush=False 和 flush=True 的差异print("=== 不主动刷新(flush=False)===")for i in range(3):print(f"计数:{i}", end=' ')
time.sleep(1) # 延迟1秒,但数据会在循环结束后一次性输出print("n")print("=== 主动刷新(flush=True)===")for i in range(3):print(f"计数:{i}", end=' ')
time.sleep(1) # 延迟1秒,数据实时输出print()# 输出效果:# 不主动刷新:等待3秒后,一次性显示“计数:0 计数:1 计数:2 ”# 主动刷新:每1秒显示一个“计数:x ”,实时更新掌握参数原理后,我们结合实际开发需求,拆解 print 函数的进阶用法,覆盖“变量打印”“特殊字符处理”“格式化输出”“日志记录”等核心场景。
传统方式通过 + 拼接字符串,需手动转换变量类型(如 str(age)),效率低且易出错;使用 print 多参数+sep 可直接打印,自动类型转换。
# 传统拼接方式(繁琐)name = "Grace"age = 26height = 165.5print("姓名:" + name + ",年龄:" + str(age) + ",身高:" + str(height) + "cm")# print 多参数方式(简洁)print("姓名:", name, ",年龄:", age, ",身高:", height, "cm", sep="")# 两种方式输出一致:姓名:Grace,年龄:26,身高:165.5cm当需要输出长文本(如协议、说明文档)时,可结合 三引号字符串 和 print 函数,避免手动添加 n,同时支持格式保留。
# 案例12:打印用户协议(多行文本)user_agreement = """ ==================== 用户服务协议 ==================== 1. 本服务仅面向年满18周岁的用户提供; 2. 用户需妥善保管账号密码,因个人原因导致的账号安全问题,平台不承担责任; 3. 平台有权在法律法规允许的范围内调整服务条款,调整后将通过官网通知用户; 4. 若用户违反本协议,平台有权暂停或终止服务,且不退还已支付的费用。 ===================================================== """print(user_agreement)# 输出:完整保留协议的换行和缩进格式,可读性强
Python 支持通过“转义字符”实现特殊格式,print 函数可直接解析这些字符,满足复杂排版需求。
| 转义字符 | 作用 | 案例 | 输出效果 |
|---|---|---|---|
n | 换行 | print("第一行n第二行") | 第一行 第二行 |
t | 制表符(约4个空格) | print("AtBtC") | A B C |
r | 回车(光标回行首) | print("123r45") | 453 |
b | 退格(删除前一个字符) | print("HellobWorld") | HellWorld |
# 案例13:用特殊字符打印表格print("商品名称t单价(元)t库存(件)")print("笔记本电脑t5999tt120")print("无线鼠标t99tt500")print("机械键盘t299tt300")# 输出:# 商品名称 单价(元) 库存(件)# 笔记本电脑 5999 120# 无线鼠标 99 500# 机械键盘 299 300# 案例14:用 b 实现“输入纠错”模拟print("请输入密码:", end='')
password = "123456" # 模拟用户输入print(password, end='')
time.sleep(1)# 模拟用户删除最后两位,重新输入print("bb78") # bb 删除“56”,再输入“78”# 输出:请输入密码:123478Python 3.6+ 引入的 f-string 支持在字符串中嵌入变量,结合 print 函数可实现更灵活的格式化输出,尤其适合复杂数据展示。
# 案例15:格式化打印学生成绩(保留小数、百分比)students = [
{"name": "Harry", "math": 89.5, "english": 92.0},
{"name": "Ivy", "math": 95.0, "english": 88.5},
{"name": "Jack", "math": 78.0, "english": 90.5}
]# 打印表头print(f"{'姓名':<10}{'数学成绩':<10}{'英语成绩':<10}{'平均成绩':<10}")print("-" * 40)# 打印学生数据(左对齐、保留1位小数)for student in students:
name = student["name"]
math = student["math"]
english = student["english"]
avg = (math + english) / 2print(f"{name:<10}{math:<10.1f}{english:<10.1f}{avg:<10.1f}")# 输出:# 姓名 数学成绩 英语成绩 平均成绩 # ----------------------------------------# Harry 89.5 92.0 90.8 # Ivy 95.0 88.5 91.8 # Jack 78.0 90.5 84.3开发中常需将日志同时输出到控制台(便于实时查看)和文件(便于后续追溯),可通过自定义“类文件对象”实现 print 双输出。
# 案例16:自定义双输出类(控制台+文件)import sysclass DualOutput:def __init__(self, file_path, encoding="utf-8"):
self.console = sys.stdout # 控制台输出流self.file = open(file_path, "a", encoding=encoding) # 文件输出流def write(self, message):# 同时写入控制台和文件self.console.write(message)
self.file.write(message)def flush(self):# 确保缓冲区同步刷新self.console.flush()
self.file.flush()# 使用自定义双输出dual_output = DualOutput("app_log.txt")
sys.stdout = dual_output # 将默认输出流替换为双输出# 模拟日志打印import datetimedef log(message, level="INFO"):
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"[{now}] [{level}] {message}")# 输出日志log("程序启动成功")
log("读取配置文件 config.ini", "DEBUG")
log("数据库连接失败:无法连接到 127.0.0.1:3306", "ERROR")
log("程序执行完毕,退出代码 0")# 关闭文件流dual_output.file.close()
sys.stdout = dual_output.console # 恢复默认输出流# 效果:日志同时显示在控制台和 app_log.txt 文件中print 函数可直接打印列表、字典等复杂结构,结合 sep 和 end 可优化输出格式,避免“一行到底”的混乱。
# 案例17:打印嵌套字典(用户信息)user_data = {"user_id": 1001,"basic_info": {"name": "Lily","gender": "Female","birthday": "1998-05-12"},"contacts": [
{"type": "phone", "value": "13800138000"},
{"type": "email", "value": "lily@example.com"}
]
}# 逐行打印用户信息print("用户ID:", user_data["user_id"])print("基础信息:")for key, value in user_data["basic_info"].items():print(f" - {key}:", value)print("联系方式:")for contact in user_data["contacts"]:for key, value in contact.items():print(f" - {key}:", value)# 输出:# 用户ID: 1001# 基础信息:# - name: Lily# - gender: Female# - birthday: 1998-05-12# 联系方式:# - type: phone# - value: 13800138000# - type: email# - value: lily@example.com在控制台中,可通过ANSI转义码实现彩色文字输出,print函数能直接打印包含这些特殊码的字符串,让关键信息更醒目。
# 案例18:彩色打印日志(不同级别不同颜色)# ANSI颜色码定义class Color: RED = '