飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 认识Python

    • Python 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

格式化输出:% 操作符

Python 2 中最常用的字符串格式化方式是 % 操作符。它借鉴了 C 语言的 printf 风格,用 % 开头的格式符指定如何插入值。虽然 Python 3 更推荐 str.format() 和 f-string,但 % 格式化在 Python 2 代码中无处不在,必须熟练掌握。

基本用法

name = "Alice"
age = 25
print "My name is %s, I am %d years old." % (name, age)
# My name is Alice, I am 25 years old.

% 左边是格式字符串,右边是要插入的值。如果只有一个值,可以省略括号:

print "Pi is %f" % 3.14159
# Pi is 3.141590

常用格式符

格式符含义示例
%s字符串(str() 转换)"%s" % "hello" → "hello"
%r字符串(repr() 转换)"%r" % "hello" → "'hello'"
%d十进制整数"%d" % 42 → "42"
%i同 %d
%f浮点数"%f" % 3.14 → "3.140000"
%e科学计数法"%e" % 1234 → "1.234000e+03"
%x十六进制整数"%x" % 255 → "ff"
%X大写十六进制"%X" % 255 → "FF"
%o八进制整数"%o" % 8 → "10"
%%字面量 %"100%%" → "100%"

格式控制

在 % 和格式符之间可以插入控制字符:

# 宽度
print "|%10s|" % "hi"        # |        hi|,右对齐,宽度 10
print "|%-10s|" % "hi"       # |hi        |,左对齐,宽度 10

# 精度
print "%.2f" % 3.14159      # 3.14,保留 2 位小数
print "%.5s" % "hello"      # hello,截取 5 个字符

# 宽度和精度组合
print "%10.2f" % 3.14159   # "      3.14",宽度 10,精度 2

# 前导零
print "%05d" % 42           # 00042,宽度 5,前导零

# 正号
print "%+d" % 42            # +42
print "%+d" % -42           # -42

字典格式化

用 %(key)s 语法,右边传入字典:

data = {"name": "Alice", "age": 25, "city": "Beijing"}
print "%(name)s lives in %(city)s, she is %(age)d years old." % data
# Alice lives in Beijing, she is 25 years old.

这在处理配置、日志模板时非常有用:

template = "Error in %(file)s at line %(line)d: %(message)s"
error = {"file": "main.py", "line": 42, "message": "Index out of range"}
print template % error

类型转换

%s 会调用 str() 转换任何对象:

print "%s" % 42             # "42"
print "%s" % [1, 2, 3]      # "[1, 2, 3]"
print "%s" % {"a": 1}       # "{'a': 1}"

%r 调用 repr(),返回更精确的对象表示:

print "%r" % "hello"        # "'hello'"(带引号)
print "%r" % 42             # "42"

常见错误

类型不匹配:

print "%d" % "42"           # TypeError: %d format: a number is required, not str
print "%s" % 42             # 正确,%s 接受任何对象

元数不匹配:

print "%s %s" % "Alice"     # TypeError: not enough arguments for format string
print "%s" % ("Alice", "Bob")   # TypeError: not all arguments converted
print "%s %s" % ("Alice", "Bob")  # 正确

只有一个值时忘记括号:

print "%s" % (1, 2)         # 正确,元组 (1, 2) 被当作单个值
print "%s %s" % (1, 2)      # 正确,两个值

注意:如果只有一个值且它是元组,必须用 (value,) 或 % (value,):

t = (1, 2)
print "%s" % (t,)           # "(1, 2)"
print "%s" % t              # TypeError: not enough arguments for format string
# 因为 t 被拆包成两个值 1 和 2

与 str.format() 的选择

Python 2.6+ 支持 str.format(),功能更强大:

# % 格式化
print "%(name)s is %(age)d years old" % {"name": "Alice", "age": 25}

# str.format()
print "{name} is {age} years old".format(name="Alice", age=25)

str.format() 支持更复杂的格式控制(对齐、填充、千位分隔符等),但 % 格式化在 Python 2 中更常见。阅读旧代码时需要熟悉 %,新项目推荐 str.format()。

上一页
with 上下文管理器
下一页
格式化输出:str.format()