
目录
- 引
- [1.print 函数基础语法与参数原理](#1.print 函数基础语法与参数原理)
-
- [1.1 官方语法定义](#1.1 官方语法定义)
- [1.2 核心参数逐一看](#1.2 核心参数逐一看)
-
- [(1)位置参数 `value, ...`](#(1)位置参数
value, ...
) - [(2)分隔符参数 `sep`](#(2)分隔符参数
sep
) - [(3)结尾符参数 `end`](#(3)结尾符参数
end
) - [(4)输出目标参数 `file`](#(4)输出目标参数
file
) - [(5)缓冲区刷新参数 `flush`](#(5)缓冲区刷新参数
flush
)
- [(1)位置参数 `value, ...`](#(1)位置参数
- [2.print 函数进阶实战:10+ 实用场景案例](#2.print 函数进阶实战:10+ 实用场景案例)
-
- [2.1 场景1:多变量组合打印(避免字符串拼接)](#2.1 场景1:多变量组合打印(避免字符串拼接))
- [2.2 场景2:多行文本优雅打印](#2.2 场景2:多行文本优雅打印)
- [2.3 场景3:特殊字符精准控制(\n、\t、\r、\b)](#2.3 场景3:特殊字符精准控制(\n、\t、\r、\b))
- [2.4 场景4:结合格式化字符串(f-string)打印](#2.4 场景4:结合格式化字符串(f-string)打印)
- [2.5 场景5:实时日志记录(控制台+文件双输出)](#2.5 场景5:实时日志记录(控制台+文件双输出))
- [2.6 场景6:打印复杂数据结构(列表、字典、嵌套结构)](#2.6 场景6:打印复杂数据结构(列表、字典、嵌套结构))
- [2.7 场景7:彩色打印(结合ANSI转义码)](#2.7 场景7:彩色打印(结合ANSI转义码))
- [2.8 场景8:打印进度条(结合end和flush参数)](#2.8 场景8:打印进度条(结合end和flush参数))
- [2.9 场景9:打印对齐的表格(结合sep和字符串格式化)](#2.9 场景9:打印对齐的表格(结合sep和字符串格式化))
- [2.10 场景10:打印JSON格式数据(结合json模块)](#2.10 场景10:打印JSON格式数据(结合json模块))
- [2.11 场景11:打印到网络流(结合socket)](#2.11 场景11:打印到网络流(结合socket))
- 3.print函数的性能与最佳实践
-
- [3.1 性能优化技巧](#3.1 性能优化技巧)
- [3.2 最佳实践总结](#3.2 最佳实践总结)
- 4.常见问题与解决方案
-
- [4.1 问题1:中文输出乱码](#4.1 问题1:中文输出乱码)
- [4.2 问题2:print输出不及时](#4.2 问题2:print输出不及时)
- [4.3 问题3:多线程下输出混乱](#4.3 问题3:多线程下输出混乱)
- 总结
引
在 Python 编程中,print
函数是最基础也最常用的函数之一。无论是调试代码、输出运行结果,还是与用户交互,print
函数都扮演着关键角色。然而,多数开发者对 print
函数的认知仅停留在"打印字符串"的表层功能,其丰富的参数配置和灵活的应用场景尚未被充分挖掘。本文基于 Python 3.13.6 版本,从语法结构、参数原理、实战案例三个维度,全面解析 print
函数的核心能力,带您掌握从基础到进阶的使用技巧。
1.print 函数基础语法与参数原理
1.1 官方语法定义
在 Python 3.13.6 中,print
函数的官方语法如下:
python
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
该函数支持可变数量的位置参数 (value, ...
)和 4 个固定关键字参数(sep
、end
、file
、flush
),各参数分工明确,共同决定输出的格式、位置和时机。
1.2 核心参数逐一看
(1)位置参数 value, ...
- 作用:接收任意数量、任意类型的数据(字符串、数字、列表、字典等),函数会自动将其转换为字符串形式后输出。
- 原理 :当传入多个
value
时,print
会按传入顺序依次处理,最终通过sep
参数指定的分隔符连接成一个整体输出。 - 基础案例:
python
# 案例1:打印单个字符串
print("Hello, Python 3.13.6!") # 输出:Hello, Python 3.13.6!
# 案例2:打印多个不同类型的数据
name = "Alice"
age = 25
score = 98.5
hobbies = ["reading", "coding"]
print("姓名:", name, "年龄:", age, "成绩:", score, "爱好:", hobbies)
# 输出:姓名: Alice 年龄: 25 成绩: 98.5 爱好: ['reading', 'coding']
(2)分隔符参数 sep
- 默认值 :
' '
(单个空格) - 作用 :指定多个
value
之间的分隔符,支持任意字符串(如-
、|
、\t
等)。 - 应用场景:格式化输出多组数据(如 CSV 格式、编号列表),避免手动拼接字符串的繁琐。
- 实战案例:
python
# 案例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 110
(3)结尾符参数 end
- 默认值 :
'\n'
(换行符) - 作用 :指定
print
函数输出结束后添加的字符,而非默认的"换行",可实现"不换行输出""自定义结尾符号"等需求。 - 应用场景 :进度条打印、一行内分段输出、自定义结尾标识(如
!
、...
)。 - 实战案例:
python
# 案例6:不换行输出(用空字符串作为结尾)
print("正在加载", end='')
for i in range(5):
import time
time.sleep(0.5) # 模拟加载延迟
print(".", end='')
# 输出:正在加载.....(5个点依次打印在同一行)
# 案例7:自定义结尾符(添加感叹号)
print("欢迎使用本系统", end='!')
print("祝您操作愉快", end='\n\n') # 手动添加两个换行
print("这是新的一行")
# 输出:
# 欢迎使用本系统!祝您操作愉快
#
# 这是新的一行
# 案例8:用 "\r" 实现"覆盖式输出"(回车符,光标回到行首)
import time
for percent in range(0, 101, 10):
print(f"下载进度:{percent}%", end='\r')
time.sleep(0.8)
print("下载进度:100% - 下载完成!")
# 输出:进度从 0% 到 100% 逐步覆盖,最终显示"下载完成"
(4)输出目标参数 file
- 默认值 :
sys.stdout
(标准输出流,即"控制台") - 作用 :指定
print
函数的输出目标,支持任何具有write()
方法的"类文件对象"(如本地文件、字节流)。 - 注意事项 :
- 若输出到文件,需确保文件路径正确,且具备读写权限;
- 使用
open()
函数打开文件时,需指定正确的模式(如'w'
写入、'a'
追加); - 推荐使用
with
语句管理文件,避免资源泄漏。
- 实战案例:
python
# 案例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 | 专业:数学
(5)缓冲区刷新参数 flush
- 默认值 :
False
(不主动刷新缓冲区) - 原理 :Python 输出时会使用"缓冲区"(临时存储数据的区域),当缓冲区满、程序结束或遇到换行符时,才会将数据写入目标(如控制台、文件)。
flush=True
会强制立即刷新缓冲区,确保数据实时输出。 - 应用场景:实时进度显示、日志实时写入、多线程/多进程下的输出同步。
- 实战案例:
python
# 案例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 ",实时更新
2.print 函数进阶实战:10+ 实用场景案例
掌握参数原理后,我们结合实际开发需求,拆解 print
函数的进阶用法,覆盖"变量打印""特殊字符处理""格式化输出""日志记录"等核心场景。
2.1 场景1:多变量组合打印(避免字符串拼接)
传统方式通过 +
拼接字符串,需手动转换变量类型(如 str(age)
),效率低且易出错;使用 print
多参数+sep
可直接打印,自动类型转换。
python
# 传统拼接方式(繁琐)
name = "Grace"
age = 26
height = 165.5
print("姓名:" + name + ",年龄:" + str(age) + ",身高:" + str(height) + "cm")
# print 多参数方式(简洁)
print("姓名:", name, ",年龄:", age, ",身高:", height, "cm", sep="")
# 两种方式输出一致:姓名:Grace,年龄:26,身高:165.5cm
2.2 场景2:多行文本优雅打印
当需要输出长文本(如协议、说明文档)时,可结合 三引号字符串
和 print
函数,避免手动添加 \n
,同时支持格式保留。
python
# 案例12:打印用户协议(多行文本)
user_agreement = """
==================== 用户服务协议 ====================
1. 本服务仅面向年满18周岁的用户提供;
2. 用户需妥善保管账号密码,因个人原因导致的账号安全问题,平台不承担责任;
3. 平台有权在法律法规允许的范围内调整服务条款,调整后将通过官网通知用户;
4. 若用户违反本协议,平台有权暂停或终止服务,且不退还已支付的费用。
=====================================================
"""
print(user_agreement)
# 输出:完整保留协议的换行和缩进格式,可读性强
2.3 场景3:特殊字符精准控制(\n、\t、\r、\b)
Python 支持通过"转义字符"实现特殊格式,print
函数可直接解析这些字符,满足复杂排版需求。
转义字符 | 作用 | 案例 | 输出效果 |
---|---|---|---|
\n |
换行 | print("第一行\n第二行") |
第一行 第二行 |
\t |
制表符(约4个空格) | print("A\tB\tC") |
A B C |
\r |
回车(光标回行首) | print("123\r45") |
453 |
\b |
退格(删除前一个字符) | print("Hello\bWorld") |
HellWorld |
python
# 案例13:用特殊字符打印表格
print("商品名称\t单价(元)\t库存(件)")
print("笔记本电脑\t5999\t\t120")
print("无线鼠标\t99\t\t500")
print("机械键盘\t299\t\t300")
# 输出:
# 商品名称 单价(元) 库存(件)
# 笔记本电脑 5999 120
# 无线鼠标 99 500
# 机械键盘 299 300
# 案例14:用 \b 实现"输入纠错"模拟
print("请输入密码:", end='')
password = "123456" # 模拟用户输入
print(password, end='')
time.sleep(1)
# 模拟用户删除最后两位,重新输入
print("\b\b78") # \b\b 删除"56",再输入"78"
# 输出:请输入密码:123478
2.4 场景4:结合格式化字符串(f-string)打印
Python 3.6+ 引入的 f-string
支持在字符串中嵌入变量,结合 print
函数可实现更灵活的格式化输出,尤其适合复杂数据展示。
python
# 案例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) / 2
print(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
2.5 场景5:实时日志记录(控制台+文件双输出)
开发中常需将日志同时输出到控制台(便于实时查看)和文件(便于后续追溯),可通过自定义"类文件对象"实现 print
双输出。
python
# 案例16:自定义双输出类(控制台+文件)
import sys
class 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 datetime
def 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 文件中
2.6 场景6:打印复杂数据结构(列表、字典、嵌套结构)
print
函数可直接打印列表、字典等复杂结构,结合 sep
和 end
可优化输出格式,避免"一行到底"的混乱。
python
# 案例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
2.7 场景7:彩色打印(结合ANSI转义码)
在控制台中,可通过ANSI转义码实现彩色文字输出,print
函数能直接打印包含这些特殊码的字符串,让关键信息更醒目。
python
# 案例18:彩色打印日志(不同级别不同颜色)
# ANSI颜色码定义
class Color:
RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
RESET = '\033[0m' # 重置颜色
# 彩色日志打印
print(f"{Color.GREEN}[SUCCESS]{Color.RESET} 数据加载完成")
print(f"{Color.YELLOW}[WARNING]{Color.RESET} 磁盘空间不足")
print(f"{Color.RED}[ERROR]{Color.RESET} 连接超时")
print(f"{Color.BLUE}[INFO]{Color.RESET} 系统版本:v2.3.1")
# 输出效果:不同级别日志以不同颜色显示(需终端支持ANSI码)
2.8 场景8:打印进度条(结合end和flush参数)
在处理耗时任务(如下载、数据处理)时,可用print
函数配合end='\r'
和flush=True
实现动态进度条,提升用户体验。
python
# 案例19:带百分比的进度条
import time
def show_progress(total_steps):
for step in range(total_steps + 1):
# 计算进度百分比
percent = (step / total_steps) * 100
# 生成进度条字符(#表示已完成,空格表示未完成)
bar = '#' * int(percent / 2) + ' ' * (50 - int(percent / 2))
# 输出进度条(覆盖式打印)
print(f"进度:|{bar}| {percent:.1f}%", end='\r', flush=True)
time.sleep(0.1) # 模拟任务耗时
print() # 进度完成后换行
# 调用进度条函数(100步任务)
show_progress(100)
# 输出效果:进度条从0%逐步增长到100%,在同一行动态更新
2.9 场景9:打印对齐的表格(结合sep和字符串格式化)
对于结构化数据(如报表、统计结果),可通过sep
参数和字符串对齐功能,用print
函数打印整齐的表格。
python
# 案例20:打印销售统计表格
# 销售数据
sales_data = [
("产品A", 1200, 29.99, 35988.00),
("产品B", 850, 45.50, 38675.00),
("产品C", 2100, 15.80, 33180.00)
]
# 打印表头
print(f"{'产品名称':<10} | {'销量(件)':>10} | {'单价(元)':>10} | {'销售额(元)':>12}")
print("-" * 55)
# 打印数据行
for product, quantity, price, total in sales_data:
print(f"{product:<10} | {quantity:>10} | {price:>10.2f} | {total:>12.2f}")
# 输出:
# 产品名称 | 销量(件) | 单价(元) | 销售额(元)
# -------------------------------------------------------
# 产品A | 1200 | 29.99 | 35988.00
# 产品B | 850 | 45.50 | 38675.00
# 产品C | 2100 | 15.80 | 33180.00
2.10 场景10:打印JSON格式数据(结合json模块)
当需要展示API返回结果、配置文件等JSON数据时,可先用json.dumps()
格式化,再通过print
函数输出,确保可读性。
python
# 案例21:打印格式化的JSON数据
import json
# 复杂嵌套数据
api_response = {
"status": "success",
"code": 200,
"data": {
"users": [
{"id": 1, "name": "Mike", "active": True},
{"id": 2, "name": "Nancy", "active": False}
],
"pagination": {"page": 1, "total_pages": 5, "per_page": 10}
}
}
# 格式化JSON字符串(缩进2空格,确保中文正常显示)
formatted_json = json.dumps(api_response, indent=2, ensure_ascii=False)
# 打印JSON数据
print("API返回结果:")
print(formatted_json)
# 输出:
# API返回结果:
# {
# "status": "success",
# "code": 200,
# "data": {
# "users": [
# {
# "id": 1,
# "name": "Mike",
# "active": true
# },
# {
# "id": 2,
# "name": "Nancy",
# "active": false
# }
# ],
# "pagination": {
# "page": 1,
# "total_pages": 5,
# "per_page": 10
# }
# }
# }
2.11 场景11:打印到网络流(结合socket)
print
函数的file
参数支持任何带write()
方法的对象,包括网络套接字(socket),可实现网络数据发送。
python
# 案例22:通过print函数向网络发送数据(服务器端)
import socket
import sys
def network_server():
# 创建TCP socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('localhost', 65432))
s.listen()
print("服务器启动,等待连接...")
conn, addr = s.accept()
with conn:
print(f"已连接客户端:{addr}")
# 将print输出重定向到网络连接
sys.stdout = conn.makefile('w')
# 通过print发送数据
print("欢迎连接到服务器!")
print("当前时间:", time.ctime())
print("数据传输结束")
# 恢复默认输出
sys.stdout = sys.__stdout__
# 启动服务器(需在另一个终端运行客户端接收数据)
network_server()
3.print函数的性能与最佳实践
3.1 性能优化技巧
-
减少print调用次数 :循环中频繁调用
print
会降低性能,建议先将内容存入列表,最后一次性打印。python# 低效方式 for i in range(1000): print(i) # 高效方式 output = [] for i in range(1000): output.append(str(i)) print('\n'.join(output))
-
合理使用flush参数 :
flush=True
会增加IO操作,非实时需求场景下建议保持默认flush=False
。 -
避免在生产环境滥用print :正式部署的程序应使用
logging
模块替代print
,便于日志级别控制和持久化。
3.2 最佳实践总结
- 参数组合使用 :灵活搭配
sep
和end
实现复杂格式,如print(a, b, sep='|', end='!\n')
。 - 输出目标管理 :写入文件时务必使用
with
语句,避免文件句柄泄露。 - 特殊场景适配 :进度条、彩色输出等场景需结合转义字符和
flush=True
。 - 兼容性考虑 :ANSI颜色码在Windows终端可能需要额外配置(如
colorama
库)。 - 调试技巧 :打印变量时建议添加标识,如
print("用户ID:", user_id)
,便于调试时定位数据。
4.常见问题与解决方案
4.1 问题1:中文输出乱码
原因 :文件编码与控制台编码不一致。
解决方案:
- 写入文件时指定
encoding="utf-8"
:open("file.txt", "w", encoding="utf-8")
- 确保控制台支持UTF-8编码(如Windows终端执行
chcp 65001
)。
4.2 问题2:print输出不及时
原因 :缓冲区未刷新,数据暂存内存中。
解决方案:
- 加换行符(
\n
)触发自动刷新(默认行为)。 - 显式设置
flush=True
:print("实时输出", flush=True)
。
4.3 问题3:多线程下输出混乱
原因 :多个线程同时调用print
,导致输出内容交织。
解决方案:
-
使用锁(
threading.Lock
)确保print
调用的原子性。pythonimport threading print_lock = threading.Lock() def thread_func(name): with print_lock: print(f"线程{name}开始执行") # 其他操作...
总结
print
函数看似简单,却蕴含着丰富的功能和灵活的应用场景。从基础的字符串输出到复杂的进度条、网络传输,从单一的控制台打印到文件、网络多目标输出,print
函数在Python开发中扮演着不可或缺的角色。
本文通过11个核心场景、20+实战案例,系统讲解了print
函数的参数原理与进阶用法,涵盖了从语法细节到性能优化的全维度知识。掌握这些技巧,不仅能提升代码的可读性和开发效率,更能让我们在调试、日志记录、用户交互等场景中应对自如。
在Python 3.13.6中,print
函数的功能得到了进一步稳定和优化,无论是日常开发还是进阶应用,深入理解并灵活运用print
函数,都将成为我们提升编程能力的重要一步。