当前位置: 首页 > ds >正文

Python快速入门专业版(二):print 函数深度解析:不止于打印字符串(含10+实用案例)

在这里插入图片描述

目录

  • 1.print 函数基础语法与参数原理
    • 1.1 官方语法定义
    • 1.2 核心参数逐一看
      • (1)位置参数 `value, ...`
      • (2)分隔符参数 `sep`
      • (3)结尾符参数 `end`
      • (4)输出目标参数 `file`
      • (5)缓冲区刷新参数 `flush`
  • 2.print 函数进阶实战:10+ 实用场景案例
    • 2.1 场景1:多变量组合打印(避免字符串拼接)
    • 2.2 场景2:多行文本优雅打印
    • 2.3 场景3:特殊字符精准控制(\n、\t、\r、\b)
    • 2.4 场景4:结合格式化字符串(f-string)打印
    • 2.5 场景5:实时日志记录(控制台+文件双输出)
    • 2.6 场景6:打印复杂数据结构(列表、字典、嵌套结构)
    • 2.7 场景7:彩色打印(结合ANSI转义码)
    • 2.8 场景8:打印进度条(结合end和flush参数)
    • 2.9 场景9:打印对齐的表格(结合sep和字符串格式化)
    • 2.10 场景10:打印JSON格式数据(结合json模块)
    • 2.11 场景11:打印到网络流(结合socket)
  • 3.print函数的性能与最佳实践
    • 3.1 性能优化技巧
    • 3.2 最佳实践总结
  • 4.常见问题与解决方案
    • 4.1 问题1:中文输出乱码
    • 4.2 问题2:print输出不及时
    • 4.3 问题3:多线程下输出混乱
  • 总结

在 Python 编程中,print 函数是最基础也最常用的函数之一。无论是调试代码、输出运行结果,还是与用户交互,print 函数都扮演着关键角色。然而,多数开发者对 print 函数的认知仅停留在“打印字符串”的表层功能,其丰富的参数配置和灵活的应用场景尚未被充分挖掘。本文基于 Python 3.13.6 版本,从语法结构、参数原理、实战案例三个维度,全面解析 print 函数的核心能力,带您掌握从基础到进阶的使用技巧。

1.print 函数基础语法与参数原理

1.1 官方语法定义

在 Python 3.13.6 中,print 函数的官方语法如下:

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

该函数支持可变数量的位置参数value, ...)和 4 个固定关键字参数(sependfileflush),各参数分工明确,共同决定输出的格式、位置和时机。

1.2 核心参数逐一看

(1)位置参数 value, ...

  • 作用:接收任意数量、任意类型的数据(字符串、数字、列表、字典等),函数会自动将其转换为字符串形式后输出。
  • 原理:当传入多个 value 时,print 会按传入顺序依次处理,最终通过 sep 参数指定的分隔符连接成一个整体输出。
  • 基础案例
# 案例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 格式、编号列表),避免手动拼接字符串的繁琐。
  • 实战案例
# 案例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 函数输出结束后添加的字符,而非默认的“换行”,可实现“不换行输出”“自定义结尾符号”等需求。
  • 应用场景:进度条打印、一行内分段输出、自定义结尾标识(如 !...)。
  • 实战案例
# 案例6:不换行输出(用空字符串作为结尾)
print("正在加载", end='')
for i in range(5):import timetime.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() 方法的“类文件对象”(如本地文件、字节流)。
  • 注意事项
    1. 若输出到文件,需确保文件路径正确,且具备读写权限;
    2. 使用 open() 函数打开文件时,需指定正确的模式(如 'w' 写入、'a' 追加);
    3. 推荐使用 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 | 专业:数学

(5)缓冲区刷新参数 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 ”,实时更新

2.print 函数进阶实战:10+ 实用场景案例

掌握参数原理后,我们结合实际开发需求,拆解 print 函数的进阶用法,覆盖“变量打印”“特殊字符处理”“格式化输出”“日志记录”等核心场景。

2.1 场景1:多变量组合打印(避免字符串拼接)

传统方式通过 + 拼接字符串,需手动转换变量类型(如 str(age)),效率低且易出错;使用 print 多参数+sep 可直接打印,自动类型转换。

# 传统拼接方式(繁琐)
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,同时支持格式保留。

# 案例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
# 案例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 函数可实现更灵活的格式化输出,尤其适合复杂数据展示。

# 案例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       

2.5 场景5:实时日志记录(控制台+文件双输出)

开发中常需将日志同时输出到控制台(便于实时查看)和文件(便于后续追溯),可通过自定义“类文件对象”实现 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 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 函数可直接打印列表、字典等复杂结构,结合 sepend 可优化输出格式,避免“一行到底”的混乱。

# 案例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函数能直接打印包含这些特殊码的字符串,让关键信息更醒目。

# 案例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实现动态进度条,提升用户体验。

# 案例19:带百分比的进度条
import timedef 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函数打印整齐的表格。

# 案例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函数输出,确保可读性。

# 案例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),可实现网络数据发送。

# 案例22:通过print函数向网络发送数据(服务器端)
import socket
import sysdef network_server():# 创建TCP socketwith 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会降低性能,建议先将内容存入列表,最后一次性打印。

    # 低效方式
    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 最佳实践总结

  1. 参数组合使用:灵活搭配sepend实现复杂格式,如print(a, b, sep='|', end='!\n')
  2. 输出目标管理:写入文件时务必使用with语句,避免文件句柄泄露。
  3. 特殊场景适配:进度条、彩色输出等场景需结合转义字符和flush=True
  4. 兼容性考虑:ANSI颜色码在Windows终端可能需要额外配置(如colorama库)。
  5. 调试技巧:打印变量时建议添加标识,如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=Trueprint("实时输出", flush=True)

4.3 问题3:多线程下输出混乱

原因:多个线程同时调用print,导致输出内容交织。
解决方案

  • 使用锁(threading.Lock)确保print调用的原子性。
    import threadingprint_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函数,都将成为我们提升编程能力的重要一步。

http://www.xdnf.cn/news/20145.html

相关文章:

  • Docker多阶段构建Maven项目
  • K8s资源管理:高效管控CPU与内存
  • React学习之路永无止境:下一步,去向何方?
  • Jmeter基础教程详解
  • STM32H750 RTC介绍及应用
  • 国产GEO工具哪家强?巨推集团、SEO研究协会网、业界科技三强对比
  • 用C++实现日期类
  • upload-labs通关笔记-第17关文件上传关卡之二次渲染jpg格式
  • 关于如何在PostgreSQL中调整数据库参数和配置的综合指南
  • Vue基础知识-脚手架开发-子传父(props回调函数实现和自定义事件实现)
  • Win11 解决访问网站525 问题 .
  • 【RK3576】【Android14】如何在Android kernel-6.1 的版本中添加一个ko驱动并编译出来?
  • Django 常用功能完全指南:从核心基础到高级实战
  • [光学原理与应用-401]:设计 - 深紫外皮秒脉冲激光器 - 元件 - 布拉格衍射在深紫外皮秒声光调制器(AOM)中的核心作用与系统实现
  • 小程序:12亿用户的入口,企业数字化的先锋军
  • Linux编程——网络编程(UDP)
  • 计算机网络模型入门指南:分层原理与各层作用
  • 对接旅游行业安全需求:旅游安全急救实训室的功能构建与育人目标
  • 网络安全初级-渗透测试
  • 用AI做TikTok影视解说,全流程全自动成片,不懂外语也能做全球矩阵!
  • 办公任务分发项目 laravel vue mysql 第一章:核心功能构建 API
  • 系统越拆越乱?你可能误解了微服务的本质!
  • 【Linux系统】线程同步
  • 正则表达式与转义符的区别。注意输入的东西经过了一次转义,一次正则表达式。\\转义是单斜杠\\在正则表达式也是单斜杠所以\\\\经过两道门才是字符单斜杠
  • MongoDB Change Streams:实时监听数据变化的实战场景
  • clickhouse迁移工具clickhouse-copier
  • Python EXCEL 小技巧:最快重新排列dataframe函数
  • 工业机器人标杆的数字化突围,珞石机器人如何以CRM实现业务重塑
  • 技术视界 | 跨域机器人通信与智能系统:打破壁垒的开源探索
  • 【Linux】环境变量与程序地址空间详解