在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 ,