- Published on
2.1.print
- Authors

- Name
- xiaobai
.基本语法
print(*objects, sep=' ', end='\n', file=sys.stdout)
1.1.参数说明
| 参数 | 默认值 | 说明 | 示例 |
|---|---|---|---|
\*objects | - | 可接受多个参数,自动用空格分隔 | print("A", "B", "C") → A B C |
sep | ' ' | 多个对象之间的分隔符 | print("A", "B", sep="-") → A-B |
end | '\n' | 输出结束时添加的字符 | print("Hi", end="!") → Hi! |
file | sys.stdout | 输出目标(文件对象或流) | print("text", file=open("log.txt", "w")) |
1.2.快速理解
\*objects:想打印什么就传什么,可以传多个,自动用空格连接sep:改变多个对象之间的连接符号end:改变打印完后添加什么(默认是换行)file:改变输出位置(默认是屏幕,也可以是文件)
2.基础用法
2.1.最简单的打印
print() 是 Python 中最常用的输出函数,用于将内容显示到屏幕上。它可以打印字符串、数字、变量等各种类型的数据。
print("Hello World") # Hello World
print(100) # 100
print(3.14) # 3.14
print(True) # True
2.2.打印多个值
打印多个值时,print() 会自动用空格分隔各个参数。
name = "Alice"
age = 25
print("姓名:", name, "年龄:", age) # 姓名: Alice 年龄: 25
# 可以混合不同类型
print("数字:", 42, "布尔:", True, "浮点:", 3.14)
# 数字: 42 布尔: True 浮点: 3.14
3.参数
3.1.sep - 分隔符
sep 参数用于指定多个输出对象之间的分隔符。默认情况下,print() 会用空格将各个对象分开。
# 使用逗号分隔
print("A", "B", "C", sep=",") # A,B,C
# 使用连字符分隔
print("年", "月", "日", sep="-") # 年-月-日
# 使用其他字符
print("1", "2", "3", sep="*") # 1*2*3
# 无分隔符(直接拼接)
print("Hello", "World", sep="") # HelloWorld
# 使用多个字符作为分隔符
print("Python", "Java", "C++", sep=" | ") # Python | Java | C++
3.2.end - 结束符
end 参数用于指定输出结尾的字符。默认情况下,print() 每次输出后会自动换行(即 end='\n')。
# 默认换行
print("第一行")
print("第二行")
# 输出:
# 第一行
# 第二行
# 不换行,用空格连接
print("Hello", end=" ")
print("World", end="!")
print() # 手动换行
# Hello World!
# 连续输出
print("加载中", end="")
print("...", end="")
print("完成")
# 加载中...完成
3.3.组合使用 sep 和 end
# 组合使用
print("苹果", "香蕉", "橙子", sep=", ", end=" 都是水果\n")
# 苹果, 香蕉, 橙子 都是水果
# 构建多行格式
print("姓名", "年龄", "城市", sep=" | ", end="\n---\n")
print("张三", "25", "北京", sep=" | ")
# 姓名 | 年龄 | 城市
# ---
# 张三 | 25 | 北京
3.4.file - 输出到文件
file 参数用于指定输出目标,默认是 sys.stdout(标准输出,即屏幕)。可以将输出重定向到文件或标准错误流。
# 输出到文件
with open("output.txt", "w", encoding="utf-8") as f:
print("这是写入文件的内容", file=f)
print("第二行内容", file=f)
# 输出到标准错误
import sys
print("这是一个错误信息", file=sys.stderr)
# 输出到多个目标
with open("log.txt", "w") as log_file:
message = "重要信息"
print(message) # 输出到屏幕
print(message, file=log_file) # 输出到文件
4.格式化输出
4.1.f-string(推荐)
f-string 是 Python 3.6+ 推荐的字符串格式化方式,语法简洁、可读性强。在字符串前加上 f,并用花括号 {} 包含变量或表达式。
name = "Bob"
age = 30
score = 95.567
# 基本用法
print(f"姓名: {name}, 年龄: {age}")
# 表达式计算
print(f"明年年龄: {age + 1}")
print(f"分数翻倍: {score * 2}")
# 数字格式化
print(f"分数: {score:.1f}") # 保留1位小数: 95.6
print(f"分数: {score:.2f}") # 保留2位小数: 95.57
# 对齐和填充
print(f"{name:>10}") # 右对齐,宽度10: Bob
print(f"{name:<10}") # 左对齐,宽度10: Bob
print(f"{name:^10}") # 居中对齐: Bob
# 进制转换
num = 255
print(f"十进制: {num}, 十六进制: {num:x}, 二进制: {num:b}")
# 十进制: 255, 十六进制: ff, 二进制: 11111111
格式说明符:{变量:填充字符对齐方式宽度.精度类型}
:- 格式说明符开始.2- 精度(保留2位小数)f- 格式类型(浮点数)<- 左对齐,>- 右对齐,^- 居中x- 十六进制,b- 二进制,o- 八进制
4.2.format() 方法
format() 方法是 Python 3 中常用的字符串格式化方式,兼容性好。
name = "Bob"
age = 30
score = 95.5
# 按顺序填充
print("姓名: {}, 年龄: {}".format(name, age))
# 指定索引
print("{1}的年龄是{0}".format(age, name)) # Bob的年龄是30
# 使用关键字参数
print("姓名: {n}, 年龄: {a}".format(n=name, a=age))
# 数字格式化
print("分数: {:.2f}".format(score)) # 保留2位小数
# 对齐和填充
print("{:<10} {:>10}".format(name, age)) # 左对齐和右对齐
4.3.% 格式化(传统)
% 格式化是 Python 早期的字符串格式化方式,目前仍然可用但不推荐。
name = "Bob"
age = 30
score = 95.5
# 基本用法
print("姓名: %s, 年龄: %d, 分数: %.2f" % (name, age, score))
# 占位符说明
# %s - 字符串
# %d - 整数
# %f - 浮点数
# %.2f - 保留2位小数的浮点数
# %x - 十六进制整数
4.4.格式化方式对比
| 方式 | 语法 | Python版本 | 推荐度 |
|---|---|---|---|
| f-string | f"{var}" | 3.6+ | ⭐⭐⭐⭐⭐ |
| format() | "{}".format(var) | 3.0+ | ⭐⭐⭐⭐ |
| % | "%s" % var | 2.x/3.x | ⭐⭐ |
5.以下内容不用看,Python全部学完后再看
6.实际应用场景
6.1.场景1:进度显示
import time
def show_progress(total=10):
"""显示进度条"""
for i in range(total + 1):
progress = i * 10
bar = '#' * i
print(f"\r进度: [{bar:<10}] {progress}%", end="")
time.sleep(0.3)
print() # 最后换行
show_progress()
# 进度: [##########] 100%
格式说明:{bar:<10}
bar- 要格式化的变量:- 格式说明符开始<- 左对齐10- 总宽度
6.2.场景2:表格格式输出
def print_table(data):
"""打印格式化的表格"""
# 表头
print(f"{'姓名':<10} {'年龄':<6} {'分数':<8} {'等级':<6}")
print("-" * 35)
# 数据行
for name, age, score in data:
grade = 'A' if score >= 90 else 'B' if score >= 80 else 'C'
print(f"{name:<10} {age:<6} {score:<8.1f} {grade:<6}")
# 测试数据
students = [
("张三", 20, 95.5),
("李四", 19, 82.3),
("王五", 21, 78.8),
("赵六", 20, 91.2)
]
print_table(students)
# 姓名 年龄 分数 等级
# -----------------------------------
# 张三 20 95.5 A
# 李四 19 82.3 B
# 王五 21 78.8 C
# 赵六 20 91.2 A
6.3.场景3:带颜色的日志输出
import time
def debug_print(*args, level="INFO"):
"""带有日志级别和颜色的调试输出"""
# ANSI颜色代码
colors = {
"DEBUG": "\033[94m", # 蓝色
"INFO": "\033[92m", # 绿色
"WARNING": "\033[93m", # 黄色
"ERROR": "\033[91m", # 红色
}
color = colors.get(level, "\033[0m")
reset = "\033[0m"
timestamp = time.strftime("%H:%M:%S")
print(f"{color}[{level}] {timestamp}:", *args, reset)
# 使用示例
debug_print("程序启动", level="INFO")
debug_print("读取配置文件", level="DEBUG")
debug_print("磁盘空间不足", level="WARNING")
debug_print("文件打开失败", level="ERROR")
6.4.场景4:彩色输出类
class ColorPrint:
"""彩色打印工具类"""
# ANSI颜色代码
RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
PURPLE = '\033[95m'
CYAN = '\033[96m'
WHITE = '\033[97m'
RESET = '\033[0m'
# 粗体
BOLD = '\033[1m'
# 下划线
UNDERLINE = '\033[4m'
@classmethod
def red(cls, text):
"""打印红色文本"""
print(f"{cls.RED}{text}{cls.RESET}")
@classmethod
def green(cls, text):
"""打印绿色文本"""
print(f"{cls.GREEN}{text}{cls.RESET}")
@classmethod
def yellow(cls, text):
"""打印黄色文本"""
print(f"{cls.YELLOW}{text}{cls.RESET}")
@classmethod
def bold(cls, text):
"""打印粗体文本"""
print(f"{cls.BOLD}{text}{cls.RESET}")
# 使用示例
ColorPrint.red("错误信息")
ColorPrint.green("成功信息")
ColorPrint.yellow("警告信息")
ColorPrint.bold("重要提示")
6.5.场景5:数据导出
def export_to_csv(data, filename="data.csv"):
"""将数据导出为CSV文件"""
with open(filename, "w", encoding="utf-8") as f:
# 写入表头
print("姓名,年龄,分数", file=f)
# 写入数据
for name, age, score in data:
print(f"{name},{age},{score}", file=f)
print(f"数据已导出到 {filename}")
# 使用示例
students = [
("张三", 20, 95),
("李四", 19, 82),
("王五", 21, 78)
]
export_to_csv(students)
7.特殊技巧
7.1.动态更新同一行
import time
# 进度百分比
for i in range(101):
print(f"\r处理进度: {i}%", end="")
time.sleep(0.05)
print("\n完成!")
# 旋转动画
symbols = ['|', '/', '-', '\\']
for i in range(20):
print(f"\r加载中 {symbols[i % 4]}", end="")
time.sleep(0.2)
print("\r加载完成! ")
关键技术:
\r- 回到行首(覆盖当前行)end=""- 不换行
7.2.打印复杂数据结构
import json
import pprint
# 复杂数据结构
data = {
"users": [
{"name": "Alice", "age": 25, "hobbies": ["reading", "swimming"]},
{"name": "Bob", "age": 30, "hobbies": ["gaming", "coding"]}
],
"settings": {"theme": "dark", "notifications": True}
}
# 普通打印(难以阅读)
print("普通打印:")
print(data)
# 使用pprint美化
print("\n使用pprint美化:")
pprint.pprint(data, width=40)
# 使用json格式化(最美观)
print("\n使用json格式化:")
print(json.dumps(data, indent=2, ensure_ascii=False))
7.3.打印字节数据
# 二进制数据处理
binary_data = b'Hello World'
# 原始字节
print("原始字节:", binary_data)
# 十六进制显示
print("十六进制:", ' '.join(f'{b:02x}' for b in binary_data))
# ASCII显示(不可打印字符用.表示)
print("ASCII显示:", ''.join(chr(b) if 32 <= b <= 126 else '.' for b in binary_data))
# 二进制显示
print("二进制:", ' '.join(f'{b:08b}' for b in binary_data))
# \x格式显示
print("\\x格式:", ''.join(f'\\x{b:02x}' for b in binary_data))
7.4.打印对象信息
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
"""定义print()时的输出格式"""
return f"Person(name={self.name}, age={self.age})"
def __repr__(self):
"""定义交互式环境中的显示格式"""
return f"Person('{self.name}', {self.age})"
# 使用示例
p = Person("Alice", 25)
print(p) # Person(name=Alice, age=25)
print(repr(p)) # Person('Alice', 25)
8.常见问题
8.1.中文乱码问题
# 写入文件时指定编码
with open("output.txt", "w", encoding="utf-8") as f:
print("中文内容", file=f)
# 在Windows控制台可能需要设置
import sys
sys.stdout.reconfigure(encoding='utf-8')
8.2.多个print合并为一行
# 方法1:使用end参数
print("第一部分", end=" ")
print("第二部分", end=" ")
print("第三部分")
# 方法2:先拼接再打印
parts = ["第一部分", "第二部分", "第三部分"]
print(" ".join(parts))
# 方法3:使用多个参数
print("第一部分", "第二部分", "第三部分")
8.3.打印多行内容
# 使用三引号字符串
text = """这是第一行
这是第二行
这是第三行"""
print(text)
# 或者使用\n
print("第一行\n第二行\n第三行")
# 输出结果:
# 这是第一行
# 这是第二行
# 这是第三行
9.性能优化建议
9.1.避免频繁的小print
# 不推荐:频繁调用print
for i in range(1000):
print(i)
# 推荐:批量输出
output = []
for i in range(1000):
output.append(str(i))
print('\n'.join(output))
9.2.大量数据输出到文件
# 不推荐:每次都打开关闭文件
for i in range(1000):
with open("log.txt", "a") as f:
print(i, file=f)
# 推荐:一次性打开
with open("log.txt", "w") as f:
for i in range(1000):
print(i, file=f)
9.3.使用logging模块替代调试print
import logging
# 配置日志
logging.basicConfig(level=logging.DEBUG)
# 使用日志代替print
logging.debug("调试信息")
logging.info("普通信息")
logging.warning("警告信息")
logging.error("错误信息")
10.最佳实践
- 格式化优先级:优先使用 f-string(Python 3.6+)
- 复杂数据:使用
pprint或json.dumps()美化输出 - 进度显示:使用
\r+end="" - 错误信息:输出到
sys.stderr - 日志记录:使用
logging模块代替print() - 编码问题:明确指定
encoding='utf-8' - 性能考虑:批量输出代替频繁调用
- 调试代码:使用完后记得删除或注释掉

