55個(gè)案例:吃透Python字符串格式化
↑↑↑關(guān)注后"星標(biāo)"簡說Python
人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析 簡說Python推薦 來源:尤而小屋
作者:Peter
大家好,我是老表~
本文中介紹的字符串一個(gè)非常重要的知識點(diǎn):字符串格式化輸出。
格式化怎么理解?簡答來說:就是讓字符串按照我們設(shè)定的格式來輸出,達(dá)到我們想要的結(jié)果。主要是有4種方式:
%:基于占位符的格式化 format()函數(shù)的格式化:重點(diǎn)掌握 f-string格式化:重點(diǎn)掌握 字符串模板函數(shù)string template

一、占位符%
常見格式符
格式化符號其實(shí)是為真實(shí)的值預(yù)留出一個(gè)空位,而且還可以控制顯示的格式。格式符包含一個(gè)類型碼,用來顯示不同的數(shù)據(jù)類型,比如字符串、二進(jìn)制、指數(shù)等。常見的不同的占位符如下:
%s: 字符串 (采用str()的顯示),常用 %r: 字符串 (采用repr()的顯示) %c: 單個(gè)字符,格式化字符及其ASCII碼 %b: 二進(jìn)制整數(shù) %u: 格式化無符號整數(shù),常用 %d: 格式化十進(jìn)制整數(shù),常用 %i: 十進(jìn)制整數(shù) %o: 八進(jìn)制整數(shù) %x: 十六進(jìn)制整數(shù) %g: 指數(shù)(e)或浮點(diǎn)數(shù)%f (根據(jù)顯示長度) %G: 指數(shù)(E)或浮點(diǎn)數(shù)%F (根據(jù)顯示長度) %e: 指數(shù) (基底寫為e),用科學(xué)計(jì)數(shù)法格式化浮點(diǎn)數(shù) %E: 指數(shù) (基底寫為E),用法同%e %f: 浮點(diǎn)數(shù),格式化浮點(diǎn)數(shù)字,可以指定小數(shù)點(diǎn)后面的精度,常用 %F: 浮點(diǎn)數(shù),與%f相同 %%: 字符“%”,用來顯示百分號%
對齊問題
關(guān)于對齊問題:
1. ^:居中對齊
2. >:右對齊
3. <:左對齊
4. +、-:顯示正負(fù)號
語法形式
常用的語法形式為:%[(name)][flags][width].[precision] typecode
(name):參數(shù)的名稱,可以省略;如果使用必須加上() flags:對齊標(biāo)志位;可以是+、-、“”、0;+右對齊,-左對齊,""填充一個(gè)空格;0表示左側(cè)使用0填充 width:顯示的寬度 precision:小數(shù)點(diǎn)后的精度
多種類型連用
print("%9.3f" % 2.3)
2.300 # 前面4個(gè)空格
第一個(gè) % 后面的內(nèi)容為顯示的格式說明,9 為顯示寬度,3 為小數(shù)點(diǎn)位數(shù),f 表示輸出為浮點(diǎn)數(shù)類型 第二個(gè) % 后面為顯示的內(nèi)容來源,輸出結(jié)果默認(rèn)為右對齊,2.300 長度為 5,故前面有4個(gè)空格
print("%+9.3f" % 2.3) # 帶上+符號輸出,9表示寬度,3表示小數(shù)位
+2.300
print("%-9.3f" % 2.3) # -表示左對齊輸出
2.300
print("%-9.3f" % -2.3)
-2.300
# 我們顯示聲明3個(gè)變量
name = "Yule Cottage" # 字符串類型
age = 25 # 整數(shù)類型
height = 1.76 # 浮點(diǎn)數(shù)類型
# 1、浮點(diǎn)數(shù)默認(rèn)是6位小數(shù)
# 2、%f和%F相同
print("我是:%s,年齡: %d,身高是:%f" % (name,age,height))
我是:Yule Cottage,年齡: 25,身高是:1.760000
# 指定浮點(diǎn)數(shù)的小數(shù)位
print("我是:%s,年齡: %d,身高是:%.3f" % (name,age,height))
我是:Yule Cottage,年齡: 25,身高是:1.760
下面的代碼是通過字典對的形式來傳入不同的數(shù)據(jù)類型,字典(后面會介紹python的字典)的值就是待格式的內(nèi)容。
需要注意的是name、age、height必須寫在%號的后面
print("我是:%(name)s,年齡: %(age)d,身高是:%(height).3f" % {"name":name,"age":age,"height":height})
我是:Yule Cottage,年齡: 25,身高是:1.760
輸出不同進(jìn)制
print("八進(jìn)制:%o,十進(jìn)制:%i,十六進(jìn)制:%x" %(age,age,age))
八進(jìn)制:31,十進(jìn)制:25,十六進(jìn)制:19
# print("二進(jìn)制:%b" %(age)) # 二進(jìn)制不能使用
bin(age) # 通過bin函數(shù)查看
'0b11001'
輸出的寬度、精度等設(shè)置
number = 1.23456789
# 寬度為10,保留小數(shù)點(diǎn)后4位,默認(rèn)是右對齊
print("%10.4f" % number)
1.2346
print("%-10.4f" % number) # -符號表示左對齊,顯示4位小數(shù)
1.2346
# 右對齊,保留10位小數(shù),不足的用0補(bǔ)齊
print("%10.10f" % number)
1.2345678900
print("%-10.8f" % number) # 左對齊,保留8位小數(shù)
1.23456789
# 左對齊,保留7位小數(shù),會自動(dòng)地進(jìn)行四舍五入
print("%-10.7f" % number)
1.2345679
下面是針對字符串的寬度等輸出設(shè)置:
name
'Yule Cottage'
print("%.10s" % name) # 9個(gè)字母+一個(gè)空格:左對齊
Yule Cotta
print("%.15s" % name) # 如果位數(shù)不夠,直接全部輸出
Yule Cottage
print("%10.6s" % name) # 右對齊,取出6個(gè)字符
Yule C
解釋:總長度為10,前面4個(gè)空格,加上4+一個(gè)空格+C
二、format格式化
從python2.6+開始,新增了一種格式化字符串的函數(shù)str.format,可以說極大地增強(qiáng)了字符串格式化的功能,基本語法是通過{}和:來代替占位符%
接收多個(gè)不限制的參數(shù) 位置可以不按照順序
語法形式
{<參數(shù)序號>:<格式控制標(biāo)記>} ,中間有一個(gè)冒號,不能省略!!!
name = "Yule Cottage" # 字符串類型
age = 25 # 整數(shù)類型
height = 1.76 # 浮點(diǎn)數(shù)類型
sex = "男"
多個(gè)參數(shù)連用
# 1、不設(shè)置位置
print("名字是:{},年齡是:{},身高是:{},性別:{}".format(name,age,height,sex))
名字是:Yule Cottage,年齡是:25,身高是:1.76,性別:男
# 2、設(shè)置位置參數(shù)
print("名字是:{0},年齡是:{1},身高是:{2},性別:{3}".format(name,age,height,sex))
名字是:Yule Cottage,年齡是:25,身高是:1.76,性別:男
# 設(shè)置位置參數(shù)
# 索引從0開始;2號位對應(yīng)的height
print("名字是:{0},身高是:{2},年齡是:{1},性別:{3}".format(name,age,height,sex))
名字是:Yule Cottage,身高是:1.76,年齡是:25,性別:男
print("性別:{3},身高是:{2},名字是:{0},年齡是:{1}".format(name,age,height,sex))
性別:男,身高是:1.76,名字是:Yule Cottage,年齡是:25
# 3、元組形式
# 使用*進(jìn)行解析
information = ("Peter",25)
print("姓名是:{},年齡是:{}".format(*information))
姓名是:Peter,年齡是:25
# 4、字典形式
# 參數(shù)為字典時(shí)候,通過**進(jìn)行解析配對
print("名字是:{name},年齡是:{age},身高是:{height},性別:{sex}".format(**{"name":name,"age":age,"height":height,"sex":sex}))
名字是:Yule Cottage,年齡是:25,身高是:1.76,性別:男
# 5、直接變量賦值
print("名字是:{name},年齡是:{age},身高是:{height},性別:{sex}".format(name="Yule Cottage",age="2歲",height="1.75m",sex="男"))
名字是:Yule Cottage,年齡是:2歲,身高是:1.75m,性別:男
對齊
寬度為20,我們實(shí)現(xiàn)居中、靠左、靠右對齊
name
'Yule Cottage'
print("{:^20s}".format(name)) # 居中
print("{:>20s}".format(name)) # 靠右
print("{:<20s}".format(name)) # 靠左
Yule Cottage
Yule Cottage
Yule Cottage
數(shù)值多種形式
首先我們還是看看對齊問題,浮點(diǎn)數(shù)的對齊只保留6位小數(shù):
pi = 3.1415926
print("{:^20f}".format(pi)) # 居中 # 默認(rèn)只保留6位小數(shù)
print("{:>20f}".format(pi)) # 靠右
print("{:<20f}".format(pi)) # 靠左
3.141593
3.141593
3.141593
看看不同情況下的輸出格式,浮點(diǎn)數(shù)需要帶上小數(shù)點(diǎn),默認(rèn)全部是左對齊:
# 不同的輸出方式
print("{}".format(pi)) # 原數(shù)據(jù)
print("{:.2f}".format(pi)) # 2位小數(shù)
print("{:>.10f}".format(pi)) # 位數(shù)不足,右側(cè)補(bǔ)0
print("{:.4%}".format(pi)) # 百分比輸出
print("{:.2e}".format(pi))
3.1415926
3.14
3.1415926000
314.1593%
3.14e+00
填充
sex
'男'
print("{0:30}".format(sex)) # 字符串默認(rèn)左對齊
print("{:>30}".format(sex)) # 改成右對齊
print("{0:30}".format(age)) # 數(shù)值類型默認(rèn)右對齊
print("{:<30}".format(height)) # 改成左對齊
男
男
25
1.76
# 指定填充的字符
print("{:*>30}".format(sex)) # *
print("{:+>30}".format(sex)) # +
print("{:+^30}".format(sex)) # 居中后填充+
print("{:+<30}".format(height)) # +
*****************************男
+++++++++++++++++++++++++++++男
++++++++++++++男+++++++++++++++
1.76++++++++++++++++++++++++++
千位分隔符
主要是用來顯示數(shù)字的千位分隔符,在貨幣金額中使用的比較多:
b = 1003005000600
print("{:-^20}".format(b)) # 不用逗號
print("{:-^20,}".format(b)) # 用逗號
---1003005000600----
-1,003,005,000,600--
# 小數(shù)的千位分隔符顯示
print("{0:-20,}".format(12567.98760)) # 不填充
print("{0:-^20,}".format(12567.98760)) # 居中+填充
print("{0:->20,}".format(12567.98760)) # 右對齊+填充
print("{0:-<20,}".format(12567.98760)) # 左對齊+填充
12,567.9876
----12,567.9876-----
---------12,567.9876
12,567.9876---------
精度
精度輸出的時(shí)候前面必須有一個(gè)小數(shù)點(diǎn)開頭,具有兩層含義:
浮點(diǎn)數(shù):表示輸出小數(shù)位的有效位數(shù) 字符串:精度表示輸出的最大長度
pi
3.1415926
"{:.3f}".format(pi)
'3.142'
"{:30.5f}".format(pi) # 小數(shù)點(diǎn)后5位,整體寬度30
' 3.14159'
"{:*^30.5f}".format(pi) # 小數(shù)點(diǎn)后5位,寬度30,居中后補(bǔ)充*
'***********3.14159************'
name
'Yule Cottage'
"{:.4}".format(name) # 最大長度為4
'Yule'
"{:.6}".format(name) # 輸出最大長度為6
'Yule C'
多種輸出類型
表示輸出整數(shù)和浮點(diǎn)數(shù)類型的格式規(guī)則。對于整數(shù)類型,輸出格式包括6 種:
c: 輸出整數(shù)對應(yīng)的 Unicode 字符; b: 輸出整數(shù)的二進(jìn)制方式; o: 輸出整數(shù)的八進(jìn)制方式; d: 輸出整數(shù)的十進(jìn)制方式; x: 輸出整數(shù)的小寫十六進(jìn)制方式; X: 輸出整數(shù)的大寫十六進(jìn)制方式;
下面的例子表示的是365的二進(jìn)制、Unicode字符、十進(jìn)制、小寫16進(jìn)制和大寫的16進(jìn)制的不同輸出格式:
"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(365)
'101101101,?,365,555,16d,16D'
如果是浮點(diǎn)數(shù)類型,那么輸出格式包括4種:
e: 輸出浮點(diǎn)數(shù)對應(yīng)的小寫字母 e 的指數(shù)形式; E: 輸出浮點(diǎn)數(shù)對應(yīng)的大寫字母 E 的指數(shù)形式; f: 輸出浮點(diǎn)數(shù)的標(biāo)準(zhǔn)浮點(diǎn)形式; %: 輸出浮點(diǎn)數(shù)的百分形式。
浮點(diǎn)數(shù)輸出時(shí)盡量使用<.精度>表示小數(shù)部分的寬度,有助于更好控制輸出格式。
"{0:e},{0:E}".format(3.1415)
'3.141500e+00,3.141500E+00'
"{0:f},{0:F}".format(3.1415)
'3.141500,3.141500'
"{0:%}".format(3.1415) # 保留6位小數(shù),百分比輸出
'314.150000%'
"{0:.2%}".format(3.1415) # 2位小數(shù),百分比輸出
'314.15%'
三、f-string
f-string是python3.6開始引入的新字符串格式化方法。其實(shí)它的方法很多和format是類似的,下面通過具體的例子來講解。
簡單例子
首先我們看一個(gè)簡單的例子,說明f-string如何使用:
a = "hello"
b = "python"
f"{a} {b}"
'hello python'
指定變量格式化
# 我們顯示聲明3個(gè)變量
name = "Yule Cottage" # 字符串類型
age = 25 # 整數(shù)類型
height = 1.76 # 浮點(diǎn)數(shù)類型
f'名字是:{name},年齡是:{age},身高是:{height}' # 前面加上f
'名字是:Yule Cottage,年齡是:25,身高是:1.76'
我們和format進(jìn)行一下對比:
"名字是:{},年齡是:{},身高是:{}".format(name,age,height) # format函數(shù)在最后面
'名字是:Yule Cottage,年齡是:25,身高是:1.76'
指定表達(dá)式格式化
如果后面的string部分是表達(dá)式,也可以進(jìn)行格式化
f'{1+2+3}'
'6'
f'{1*2*3*4}'
'24'
對表達(dá)式進(jìn)行變量的賦值再格式化:
x = 100
y = 50
f"{x*y + x/y}" # 100*50 + 100 / 50 結(jié)果是浮點(diǎn)數(shù)
'5002.0'
指定函數(shù)格式化
上面的例子是直接賦值再通過表達(dá)式來格式化,我們其實(shí)可以將上面的表達(dá)式改成函數(shù),傳入?yún)?shù)來格式化,函數(shù)可以是:
python自帶的函數(shù) 自定義的函數(shù)
# 自帶函數(shù)
print(f'my name is: {name}') # 原數(shù)據(jù)
print(f'my name is: {name.upper()}') # 全部變成大寫字母
my name is: Yule Cottage
my name is: YULE COTTAGE
# 自己寫個(gè)函數(shù)
def test(a,b):
return a * b + a / b
f'{test(100,50)}'
'5002.0'
# 或者直接寫成lambda 匿名函數(shù)
f'執(zhí)行的結(jié)果是:{(lambda x,y: x*y + x/y)(100,50)}'
'執(zhí)行的結(jié)果是:5002.0'
對齊
<:靠左,字符串默認(rèn)方式 >:靠右,數(shù)值類型默認(rèn)方式 ^:居中
print(f'{name}') # 字符串默認(rèn)左
print(f'{name:>20.10s}') # > 右對齊 長度20 字符串最大長度10
print(f'{name:<20.12s}') # < 左對齊 長度20 字符串最大長度12
Yule Cottage
Yule Cotta
Yule Cottage
pi = 3.1415926
print(f'{pi}') # 原數(shù)據(jù)
print(f'{pi:^10.4f}') # 居中 長度為10 保留4位小數(shù)
print(f'{pi:>10.4f}') # 靠右 長度為10 保留4位小數(shù)
print(f'{pi:<10.4f}') # 靠左 長度為10 保留3位小數(shù)
3.1415926
3.1416
3.1416
3.1416
填充
print(f'{pi}') # 原數(shù)據(jù)
print(f'{pi:*^10.4f}') # 填充*:居中 長度為10 保留4位小數(shù)
print(f'{pi:*>10.4f}') # 填充*:靠右 長度為10 保留4位小數(shù)
print(f'{pi:*<10.4f}') # 填充*:靠左 長度為10 保留3位小數(shù)
3.1415926
**3.1416**
****3.1416
3.1416****
千位分隔符
和format中的千位分隔符相同,主要是用于金融貨幣中,自帶金錢屬性呀。可以使用逗號或者其他符號,常用逗號:
money = 1234567890
print(f'{money:,f}') # 輸出保留6位小數(shù)
1,234,567,890.000000
print(f'{money:_f}') # 使用下滑線
1_234_567_890.000000
四、字符串模板string template
string.Template是將一個(gè)string設(shè)置為模板,通過替換變量的方法,最終得到想要的string
from string import Template # 導(dǎo)入模板
template_string = '$name is $sex'
s = Template('$name is $sex')
s.substitute(name="Peter",sex="male")
'Peter is male'
from string import Template # 導(dǎo)入模板
template_string = '$name is $sex' # 1、設(shè)置模板
s = Template(template_string)
dic = {"name":"Peter","sex":"male"}
s.substitute(dic)
'Peter is male'
在上面的例子中:
模板s中有以$符號說明模板中有兩個(gè)變量名,用實(shí)際的變量來替換。
格式是dictionary,并且字典中的key值與模板中的變量名要保持一致
string.Template默認(rèn)用$符號來標(biāo)識出變量;可以進(jìn)行修改
from string import Template
class MyTemplate(Template):
delimiter = '%'
...
s = MyTemplate('%who knows?') # 改變符號
s.substitute(who='Peter')
'Peter knows?'
五、格式整理
整理下關(guān)于對齊、精度、數(shù)值類型的符號等知識點(diǎn):
對齊
<:右對齊(數(shù)值默認(rèn)對齊方式) >:左對齊(字符串默認(rèn)對齊方式) ^:居中
符號
+:負(fù)數(shù)前加負(fù)號(-),正數(shù)前加正號(+) -:負(fù)數(shù)前加負(fù)號(-),正數(shù)前不加任何符號(默認(rèn)) 空格:負(fù)數(shù)前加負(fù)號(-),正數(shù)前加一個(gè)空格
寬度和精度
width:指定寬度為width width.precision:寬度為width,精度為precision 0width:寬度為width,指定高位用0補(bǔ)足寬度
六、總結(jié)
1、%占位符
表達(dá)式比較直觀,容易上手;但是當(dāng)參數(shù)變多的時(shí)候,格式就變得繁瑣,這種方式現(xiàn)在幾乎淘汰
2、format函數(shù)
方法比較靈活,能夠自己設(shè)置參數(shù)來對應(yīng)相應(yīng)的變量;參數(shù)變多的時(shí)候,表達(dá)式同樣繁瑣,整個(gè)式子會非常長
3、f-string
相對前兩種方式會靈活些,也更直觀。Python3.6開始出現(xiàn),語句格式可能稍顯復(fù)雜
重點(diǎn)還是要掌握format函數(shù)和f-string
--END--
老表薦書
圖書介紹:《Python自動(dòng)化辦公:3分鐘完成一天工作》本書理論知識精練、代碼簡單、思路清晰、學(xué)習(xí)資源齊備,適合有一定辦公軟件使用基礎(chǔ)又想進(jìn)一步提高工作效率的辦公人員,如從事行政、人事、營銷、財(cái)務(wù)等職業(yè)的人士閱讀,也可供Python編程愛好者參考。
零基礎(chǔ)自學(xué)Python編程
迅速掌握Office(Word、PPT、Excel)自動(dòng)化、數(shù)據(jù)處理、網(wǎng)絡(luò)爬蟲
高效、精進(jìn)工作,職場逆襲
附贈(zèng)視頻、源代碼、在線答疑
(五折包郵,快快掃碼搶購吧!)
掃碼即可加我微信
老表朋友圈經(jīng)常有贈(zèng)書/紅包福利活動(dòng)
學(xué)習(xí)更多: 整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了
優(yōu)秀的讀者都知道,“點(diǎn)贊”傳統(tǒng)美德不能丟 
