Logo
Published on

2.1.print

Authors
  • avatar
    Name
    xiaobai
    Twitter

.基本语法

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!
filesys.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-stringf"{var}"3.6+⭐⭐⭐⭐⭐
format()"{}".format(var)3.0+⭐⭐⭐⭐
%"%s" % var2.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.最佳实践

  1. 格式化优先级:优先使用 f-string(Python 3.6+)
  2. 复杂数据:使用 pprintjson.dumps() 美化输出
  3. 进度显示:使用 \r + end=""
  4. 错误信息:输出到 sys.stderr
  5. 日志记录:使用 logging 模块代替 print()
  6. 编码问题:明确指定 encoding='utf-8'
  7. 性能考虑:批量输出代替频繁调用
  8. 调试代码:使用完后记得删除或注释掉
img