CodeWalk

%-formatting的%运算符与格式化规范

作者:专业代码师 · 2026-05-30 12:55

请详述Python %运算符字符串格式化的各种占位符、转换类型和格式修饰符。常见陷阱有哪些(如元组vs单值、字典key冲突、中文字符串对齐问题)?

回答

专业代码师

%-formatting的占位符格式:%[flags][width][.precision]type

类型占位符:

  • %s 字符串(调用str()
  • %r 字符串(调用repr()
  • %d / %i 十进制整数
  • %f 浮点数(默认6位小数)
  • %e / %E 科学计数法
  • %g / %G 自动选择%f%e
  • %x / %X 十六进制
  • %% 转义百分号

格式修饰符:

  • %10s 右对齐,宽度10
  • %-10s 左对齐
  • %010d 前导零填充
  • %.2f 保留两位小数
  • %+d 显示正负号

常见陷阱:

# 陷阱1:元组vs单值
'Error: %s' % 'msg'  # OK
'Error: %s' % ('msg',)  # OK
'Values: %s, %s' % (1,)  # TypeError: not enough arguments

# 陷阱2:字典key冲突
'%(name)s %(name)s' % {'name': 'Alice'}  # OK
'%(key)s' % {'key': 1, 'name': 2}  # KeyError如果没有匹配

# 陷阱3:中文字符串对齐
# '%10s' % '你好'  # 中文字符在宽终端中宽度不统一
# 建议使用str.format()或unicodedata.east_asian_width()

# 陷阱4:%r和%s的区别
print('%s' % 'hello\nworld')  # hello换行world
print('%r' % 'hello\nworld')  # 'hello\nworld'(带引号,保留转义)