Python 教程 - 字符串格式化

在Python中,除了可以使用基本功能拼接字符串,还可以针对不同的格式,将数据插入字符串当中。由于Python版本的不同,这篇文章会介绍三种格式化字符串的方法,通过字符串的格式化,也可以轻松做出数字「补零」的效果。

% 格式化

%的字符串格式化是比较早的格式化方法,适用于Python 2 和 3 的版本。操作方式为「格式化字符串 % 数据」,输出结果会将数据插入格式化字符串的位置。

  • %s:字符串

  • %d:十进制整数

  • %x:十六进制整数

  • %o:八进制整数

  • %b:二进制整数

  • %f:十进制浮点数

  • %e:指数浮点数

  • %g:十进制或指数浮点数

  • %%:常量%

下面的例子,打印出 a 的内容时,会将内容的%s替换成后面的字符串,%d会将浮点数的小数点无条件去,%f则会将整数转换成浮点数。

bash 复制代码
a = 'Hello world, I am %s!!'
b = 'there are %d dollars'
c = 'there are %f dollars'
print(a % 'oxxo')  # Hello world, I am oxxo!!
print(a % 'xoox')  # Hello world, I am xoox!!
print(b % 2.5)     # there are 2 dollars ( 小数点被无条件舍去 )
print(c % 2)       # there are 2.000000 dollars ( 整数转换成浮点数 )

格式化字符串的%和格式占位符之间,可以加入其他数值,来指定最小宽度、最大字符、对齐与精度度:

  • 不加:默认靠左对齐

  • -:靠左对齐

  • +:靠右对齐

  • (空格):靠左对齐,最小宽度不足时,左侧填充空格

  • 0:靠左对齐,最小宽度不足时,左侧填充0

通过下面的例子可以看到 %12s 会在 hello 前方加上七个空格 (7 + hello 总共 12 个字符),%.3s 会让 hello 只剩下 hel ( 3 个字符 ),%.3f 会让 123.456789 只留下小数点后三位。

bash 复制代码
print('%s world' % 'hello')      # hello world
print('%12s world' % 'hello')    #        hello world
print('%+12s world' % 'hello')   #        hello world
print('%-12s world' % 'hello')   # hello        world
print('%.3s world' % 'hello')    # hel world
print('%12.3s world' % 'hello')  #          hel world

print('%.3f world' % 123.456789) # 123.457 world

如果有多个值需要格式化,可以在%后面用小括号包住对应的参数,参数的数量和顺序必须和前面的格式化占位符相同。

ini 复制代码
a = '%s world, ther are %f dollars!'
b = a % ('hello', 2.5)
print(b)   # hello world, ther are 2.500000 dollars!

.format

{}foramt() 是 Python 3 所使用的新的格式化方式,操作方式为「格式化字符串.format(数据)」。输出结果会将数据插入格式化字符串的位置。

ini 复制代码
a = 'hello {}, I am {}'
b = a.format('world', 'oxxo')
print(b)   # hello world, I am oxxo

{} 可以填入数字,数字表示「填入数据的顺序」,如果将上面程序里的 {} 加入数字,就会呈现不同的结果。

ini 复制代码
a = 'hello {1}, I am {0}'
b = a.format('world', 'oxxo')
print(b)   # hello oxxo, I am world ( world 和 oxxo 互换了 )

{} 里可以填入具名参数,如果将上面程序里的 {} 加入名称,就会放入指定名称的内容。

ini 复制代码
a = 'hello {m}, I am {n}'
b = a.format(m='world', n='oxxo')
print(b)   # hello world, I am oxxo

{} 里可以填入字典的键,如果将上面程序里的 {} 加入键的引用,就会放入指定的字典内容。

css 复制代码
a = 'hello {0[x][m]}, I am {0[y][m]}'
b = {'x': {'m':'world', 'n':'oxxo'}, 'y':{'m':'QQ', 'n':'YY'}}
c = a.format(b)
print(c)    # hello world, I am QQ

新式的格式化字符串和%定义略有不同,可以加入其他数值,来指定最小宽度、最大字符、对齐与精度度:

  • 开始需要加上冒号

  • 不加:默认靠右对齐

  • <:靠左对齐

  • ^:居中对齐

  • >:靠右对齐

  • =:填满指定字符

数据的类型也由 % 改为 : 表示。

  • :s:字符串

  • :d:十进制整数

  • :x:十六进制整数

  • :o:八进制整数

  • :b:二进制整数

  • :f:十进制浮点数

  • :e:十进制浮点数

  • :g:十进制或指数浮点数

下面的例子可以看到 {:-^10s} 会将 world 置中对齐,并将不足最小宽度的部分补上 - 的符号,{:^10.3f} 会让 123.456789 只留下小数点后三位。

ini 复制代码
a = 'hello {}, I am {}'.format('world','oxxo')
b = 'hello {:10s}, I am {:10s}'.format('world','oxxo')
c = 'hello {:>10s}, I am {:>10s}'.format('world','oxxo')
d = 'hello {:-^10s}, I am {:+^10s}'.format('world','oxxo')
e = 'hello {:-^10.3s}, I am {:-^10s}'.format('world','oxxo')
f = 'hello {:-^10.3s}, I am {:^10.3f}'.format('world',123.456789)
print(a)  # hello world, I am oxxo
print(b)  # hello world     , I am oxxo
print(c)  # hello      world, I am       oxxo
print(d)  # hello --world---, I am +++oxxo+++
print(e)  # hello ---wor----, I am ---oxxo---
print(f)  # hello ---wor----, I am  123.457

f-string

f-string 是 Python 3.6 加入的字符串格式化功能,也是现在比较推崇的格式化方法。操作方式为「f」后跟大括号内的变量名或运算式)。输出结果会将变量或运算式的内容,放入指定的位置。

ini 复制代码
a = 'world'
b = 'oxxo'
c = f'hello {a}, I am {b}'
print(c)   # hello world, I am oxxo

f-string的格式化字符串的语法和.format类似,可以加入其他数值,来指定最小宽度、最大字符、精度度。下面的例子可以看到{b:+^10}会将oxxo居中,再将不足最小宽度的部分补上+的符号。

css 复制代码
a = 'world'
b = 'oxxo'
c = f'hello {a:<10s}, I am {b:>10s}'
d = f'hello {a:-<10s}, I am {b:+^10s}'
e = f'hello {a:-<10.3s}, I am {b:+^10.2s}'
f = f'hello {a.upper()}, I am {b.title()}'
print(c)   # hello world     , I am       oxxo
print(d)   # hello world-----, I am +++oxxo+++
print(e)   # hello wor-------, I am ++++ox++++
print(f)   # hello WORLD, I am Oxxo

了解原理后,就可以通过字符串格式化的方式,实现"补零"的效果。这段代码会打印出 1 到 100 的数字,每个数字前面补零以达到三位数的格式。

python 复制代码
for i in range(1,101):
  print(f'{i:03d}',end=' , ')

# 001 , 002 , 003 , 004 , 005 , 006 , 007 , 008 , 009 , 010 ,
# 011 , 012 , 013 , 014 , 015 , 016 , 017 , 018 , 019 , 020 ,
# 021 , 022 , 023 , 024 , 025 , 026 , 027 , 028 , 029 , 030 ,
# 031 , 032 , 033 , 034 , 035 , 036 , 037 , 038 , 039 , 040 ,
# 041 , 042 , 043 , 044 , 045 , 046 , 047 , 048 , 049 , 050 ,
# 051 , 052 , 053 , 054 , 055 , 056 , 057 , 058 , 059 , 060 ,
# 061 , 062 , 063 , 064 , 065 , 066 , 067 , 068 , 069 , 070 ,
# 071 , 072 , 073 , 074 , 075 , 076 , 077 , 078 , 079 , 080 ,
# 081 , 082 , 083 , 084 , 085 , 086 , 087 , 088 , 089 , 090 ,
# 091 , 092 , 093 , 094 , 095 , 096 , 097 , 098 , 099 , 100 ,
相关推荐
denghai邓海几秒前
红黑树删除之向上调整
python·b+树
喵叔哟10 分钟前
重构代码之取消临时字段
java·前端·重构
封步宇AIGC26 分钟前
量化交易系统开发-实时行情自动化交易-3.4.1.2.A股交易数据
人工智能·python·机器学习·数据挖掘
何曾参静谧27 分钟前
「Py」Python基础篇 之 Python都可以做哪些自动化?
开发语言·python·自动化
Prejudices31 分钟前
C++如何调用Python脚本
开发语言·c++·python
我狠狠地刷刷刷刷刷44 分钟前
中文分词模拟器
开发语言·python·算法
还是大剑师兰特1 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解1 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
Jam-Young1 小时前
Python的装饰器
开发语言·python
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf