【Python】55个案例:吃透Python字符串格式化
公眾號:尤而小屋
作者:Peter
編輯:Peter
在上一篇Python字符串初相識中,我們介紹了字符串的很多基礎內容。本文中介紹的字符串一個非常重要的知識點:字符串格式化輸出。
python入門教程-字符串初相識
格式化怎么理解?簡答來說:就是讓字符串按照我們設定的格式來輸出,達到我們想要的結果。主要是有4種方式:
%:基于占位符的格式化
format()函數的格式化:重點掌握
f-string格式化:重點掌握
字符串模板函數string template
一、占位符%
常見格式符
格式化符號其實是為真實的值預留出一個空位,而且還可以控制顯示的格式。格式符包含一個類型碼,用來顯示不同的數據類型,比如字符串、二進制、指數等。常見的不同的占位符如下:
%s:? ?字符串 (采用str()的顯示),常用
%r:? ?字符串 (采用repr()的顯示)
%c:? ?單個字符,格式化字符及其ASCII碼
%b:? ?二進制整數
%u:? ?格式化無符號整數,常用
%d:? ?格式化十進制整數,常用
%i:? ?十進制整數
%o:? ?八進制整數
%x:? ?十六進制整數
%g:? ?指數(e)或浮點數%f (根據顯示長度)
%G:? ?指數(E)或浮點數%F (根據顯示長度)
%e:? ?指數 (基底寫為e),用科學計數法格式化浮點數
%E:? ?指數 (基底寫為E),用法同%e
%f:? ?浮點數,格式化浮點數字,可以指定小數點后面的精度,常用
%F:? ?浮點數,與%f相同
%%:? ?字符“%”,用來顯示百分號%
對齊問題
關于對齊問題:
1.?^:居中對齊 2.?>:右對齊 3.?<:左對齊 4.?+、-:顯示正負號語法形式
常用的語法形式為:%[(name)][flags][width].[precision] typecode
(name):參數的名稱,可以省略;如果使用必須加上()
flags:對齊標志位;可以是+、-、“”、0;+右對齊,-左對齊,""填充一個空格;0表示左側使用0填充
width:顯示的寬度
precision:小數點后的精度
多種類型連用
print("%9.3f"?%?2.3)?? 2.300 # 前面4個空格第一個 % 后面的內容為顯示的格式說明,9 為顯示寬度,3 為小數點位數,f 表示輸出為浮點數類型
第二個 % 后面為顯示的內容來源,輸出結果默認為右對齊,2.300 長度為 5,故前面有4個空格
下面的代碼是通過字典對的形式來傳入不同的數據類型,字典(后面會介紹python的字典)的值就是待格式的內容。
需要注意的是name、age、height必須寫在%號的后面
print("我是:%(name)s,年齡:?%(age)d,身高是:%(height).3f"?%?{"name":name,"age":age,"height":height}) 我是:Yule Cottage,年齡: 25,身高是:1.760輸出不同進制
print("八進制:%o,十進制:%i,十六進制:%x"?%(age,age,age)) 八進制:31,十進制:25,十六進制:19 # print("二進制:%b"?%(age))???#?二進制不能使用 bin(age)??#?通過bin函數查看 '0b11001'輸出的寬度、精度等設置
number?=?1.23456789#?寬度為10,保留小數點后4位,默認是右對齊 print("%10.4f"?%?number)?? 1.2346 print("%-10.4f"?%?number)??#?-符號表示左對齊,顯示4位小數 1.2346 #?右對齊,保留10位小數,不足的用0補齊print("%10.10f"?%?number)?? 1.2345678900 print("%-10.8f"?%?number)??#?左對齊,保留8位小數 1.23456789 #?左對齊,保留7位小數,會自動地進行四舍五入print("%-10.7f"?%?number)?? 1.2345679下面是針對字符串的寬度等輸出設置:
name 'Yule Cottage' print("%.10s"?%?name)?# 9個字母+一個空格:左對齊 Yule Cotta print("%.15s"?%?name)?#?如果位數不夠,直接全部輸出 Yule Cottage print("%10.6s"?%?name)?#?右對齊,取出6個字符 Yule C解釋:總長度為10,前面4個空格,加上4+一個空格+C
二、format格式化
從python2.6+開始,新增了一種格式化字符串的函數str.format,可以說極大地增強了字符串格式化的功能,基本語法是通過{}和:來代替占位符%
接收多個不限制的參數
位置可以不按照順序
語法形式
{<參數序號>:<格式控制標記>} ,中間有一個冒號,不能省略!!!
name?=?"Yule?Cottage"??#?字符串類型 age?=?25??#?整數類型 height?=?1.76???#?浮點數類型 sex?=?"男"多個參數連用
#?1、不設置位置 print("名字是:{},年齡是:{},身高是:{},性別:{}".format(name,age,height,sex)) 名字是:Yule Cottage,年齡是:25,身高是:1.76,性別:男 #?2、設置位置參數print("名字是:{0},年齡是:{1},身高是:{2},性別:{3}".format(name,age,height,sex)) 名字是:Yule Cottage,年齡是:25,身高是:1.76,性別:男 #?設置位置參數 #?索引從0開始;2號位對應的heightprint("名字是:{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、元組形式 #?使用*進行解析information?=?("Peter",25)print("姓名是:{},年齡是:{}".format(*information)) 姓名是:Peter,年齡是:25 #?4、字典形式 #?參數為字典時候,通過**進行解析配對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,我們實現居中、靠左、靠右對齊
name 'Yule Cottage' print("{:^20s}".format(name))??#?居中 print("{:>20s}".format(name))??#?靠右 print("{:<20s}".format(name))??#?靠左 Yule Cottage Yule Cottage Yule Cottage數值多種形式
首先我們還是看看對齊問題,浮點數的對齊只保留6位小數:
pi?=?3.1415926print("{:^20f}".format(pi))??#?居中??#?默認只保留6位小數 print("{:>20f}".format(pi))??#?靠右 print("{:<20f}".format(pi))??#?靠左 3.141593 3.141593 3.141593看看不同情況下的輸出格式,浮點數需要帶上小數點,默認全部是左對齊:
#?不同的輸出方式print("{}".format(pi))??#?原數據 print("{:.2f}".format(pi))???#?2位小數 print("{:>.10f}".format(pi))??#?位數不足,右側補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))??#?字符串默認左對齊 print("{:>30}".format(sex))??#?改成右對齊 print("{0:30}".format(age))??#?數值類型默認右對齊 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++++++++++++++++++++++++++千位分隔符
主要是用來顯示數字的千位分隔符,在貨幣金額中使用的比較多:
b?=?1003005000600print("{:-^20}".format(b))???#?不用逗號 print("{:-^20,}".format(b))??#?用逗號 ---1003005000600---- -1,003,005,000,600-- #?小數的千位分隔符顯示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---------精度
精度輸出的時候前面必須有一個小數點開頭,具有兩層含義:
浮點數:表示輸出小數位的有效位數
字符串:精度表示輸出的最大長度
多種輸出類型
表示輸出整數和浮點數類型的格式規則。對于整數類型,輸出格式包括6 種:
c: 輸出整數對應的 Unicode 字符;
b: 輸出整數的二進制方式;
o: 輸出整數的八進制方式;
d: 輸出整數的十進制方式;
x: 輸出整數的小寫十六進制方式;
X: 輸出整數的大寫十六進制方式;
下面的例子表示的是365的二進制、Unicode字符、十進制、小寫16進制和大寫的16進制的不同輸出格式:
"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(365) '101101101,?,365,555,16d,16D'如果是浮點數類型,那么輸出格式包括4種:
e: 輸出浮點數對應的小寫字母 e 的指數形式;
E: 輸出浮點數對應的大寫字母 E 的指數形式;
f: 輸出浮點數的標準浮點形式;
%: 輸出浮點數的百分形式。
浮點數輸出時盡量使用<.精度>表示小數部分的寬度,有助于更好控制輸出格式。
"{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位小數,百分比輸出 '314.150000%' "{0:.2%}".format(3.1415)??#?2位小數,百分比輸出 '314.15%'三、f-string
f-string是python3.6開始引入的新字符串格式化方法。其實它的方法很多和format是類似的,下面通過具體的例子來講解。
簡單例子
首先我們看一個簡單的例子,說明f-string如何使用:
a?=?"hello" b?=?"python"f"{a}?{b}" 'hello python'指定變量格式化
#?我們顯示聲明3個變量name?=?"Yule?Cottage"??#?字符串類型 age?=?25??#?整數類型 height?=?1.76???#?浮點數類型 f'名字是:{name},年齡是:{age},身高是:{height}'??#?前面加上f '名字是:Yule Cottage,年齡是:25,身高是:1.76'我們和format進行一下對比:
"名字是:{},年齡是:{},身高是:{}".format(name,age,height)??#?format函數在最后面 '名字是:Yule Cottage,年齡是:25,身高是:1.76'指定表達式格式化
如果后面的string部分是表達式,也可以進行格式化
f'{1+2+3}' '6' f'{1*2*3*4}' '24'對表達式進行變量的賦值再格式化:
x?=?100 y?=?50f"{x*y?+?x/y}"??#?100*50?+?100?/?50?結果是浮點數 '5002.0'指定函數格式化
上面的例子是直接賦值再通過表達式來格式化,我們其實可以將上面的表達式改成函數,傳入參數來格式化,函數可以是:
python自帶的函數
自定義的函數
對齊
<:靠左,字符串默認方式
>:靠右,數值類型默認方式
^:居中
填充
print(f'{pi}')??#?原數據print(f'{pi:*^10.4f}')??#?填充*:居中?長度為10??保留4位小數 print(f'{pi:*>10.4f}')??#?填充*:靠右?長度為10??保留4位小數 print(f'{pi:*<10.4f}')??#?填充*:靠左?長度為10??保留3位小數 3.1415926 **3.1416** ****3.1416 3.1416****千位分隔符
和format中的千位分隔符相同,主要是用于金融貨幣中,自帶金錢屬性呀。可以使用逗號或者其他符號,常用逗號:
money?=?1234567890print(f'{money:,f}')??#?輸出保留6位小數 1,234,567,890.000000 print(f'{money:_f}')???#?使用下滑線 1_234_567_890.000000四、字符串模板string template
string.Template是將一個string設置為模板,通過替換變量的方法,最終得到想要的string
from?string?import?Template??#?導入模板template_string?=?'$name?is?$sex's?=?Template('$name?is?$sex') s.substitute(name="Peter",sex="male") 'Peter is male' from?string?import?Template??#?導入模板template_string?=?'$name?is?$sex'??#?1、設置模板 s?=?Template(template_string)??dic?=?{"name":"Peter","sex":"male"}s.substitute(dic) 'Peter is male'在上面的例子中:
模板s中有以$符號說明模板中有兩個變量名,用實際的變量來替換。
格式是dictionary,并且字典中的key值與模板中的變量名要保持一致
string.Template默認用$符號來標識出變量;可以進行修改
五、格式整理
整理下關于對齊、精度、數值類型的符號等知識點:
對齊
<:右對齊(數值默認對齊方式)
>:左對齊(字符串默認對齊方式)
^:居中
符號
+:負數前加負號(-),正數前加正號(+)
-:負數前加負號(-),正數前不加任何符號(默認)
空格:負數前加負號(-),正數前加一個空格
寬度和精度
width:指定寬度為width
width.precision:寬度為width,精度為precision
0width:寬度為width,指定高位用0補足寬度
六、總結
1、%占位符
表達式比較直觀,容易上手;但是當參數變多的時候,格式就變得繁瑣,這種方式現在幾乎淘汰
2、format函數
方法比較靈活,能夠自己設置參數來對應相應的變量;參數變多的時候,表達式同樣繁瑣,整個式子會非常長
3、f-string
相對前兩種方式會靈活些,也更直觀。Python3.6開始出現,語句格式可能稍顯復雜
重點還是要掌握format函數和f-string
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯黃海廣老師《機器學習課程》課件合集 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python】55个案例:吃透Python字符串格式化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关闭浏览器窗口事件
- 下一篇: Metricbeat添加ip addre