自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
語法參考
在Python2.6之后,提供了字符串的format()方法對字符串進行格式化操作。format()功能非常強大,格式也比較復雜,具體語法分解如下:
{參數序號:?格式控制標記}.format(*args,**kwargs)
l??參數序號:參數序號其實是位置參數或關鍵字參數傳遞過來的參數變量,對參數序號進行格式控制標記設置其實就是對位置參數或關鍵字參數進行格式化處理。參數序號可以為空值,為空值時一定對應的是位置參數,并且在順序上和位置參數一一對應。
l??格式控制標記:用來控制參數顯示時的格式,和format()函數的format_spec參數是一樣的,包括:<填充><對齊><寬度>,<.精度><類型>6?個字段,這些字段都是可選的,可以組合使用。參數序號和格式設置標記用大括號({})表示,可以有多個。{}表示按照順序匹配位置參數,{n}表示取位置參數索引為n的值
l??*args:位置參數,是一個元組,可以為多個值。其和參數序號在位置上是一一對應的,數量上是一致的。
l??**kwargs是關鍵字參數,是一個字典,其通過序號和參數序號進行對應,可以一對一,也可以一對多。使用關鍵字參數時,參數序號和關鍵字參數不一定數量一致。
如圖1所示為通過位置參數或關鍵字參數進行格式化處理的流程。
圖1??格式化處理的流程
下面具體介紹如何通過位置參數或關鍵字參數進行格式化操作。
其中,參數序號為傳入的參數,格式設置模板是一個由字符串和格式控制說明字符組成的字符串,用來對傳入的參數進行格式化設置。格式設置模板用大括號({})表示,可以有多個,其對應format()方法中逗號分隔的參數。
常量可以是符號、文字,甚至是一段話,根據程序開發需要進行設置。靈活使用常量,可以更大范圍發揮format()方法的功效。
索引序號與參數映射
'{索引序號:?格式控制標記}'.format(*args,**kwargs)
l??args是位置參數,是一個元組
l??kwargs是關鍵字參數,是一個字典
l??{}表示按照順序匹配位置參數,{n}表示取位置參數索引為n的值
(1)通過位置參數映射
就是按照位置順序用位置參數替換前面的格式字符串的占位符。位置參數按照序號匹配,關鍵字參數按照名稱匹配(注:按照位置填充,大括號只是占位符注,一一對應,按照位置輸出結果)
l??索引序號為空
如果索引序號為空,索引序號與位置參數按照從左到右的順序上可以建立映射,實現對傳入參數的格式化處理。如索引序號和格式設置標記均為空值時,直接輸出位置參數。代碼如下:
'{}'.format('中國')????? ???????#?輸出為“中國”
位置參數與索引序號對應關系如圖2所示。
圖2??位置參數與索引序號對應關系
位置參數可以為兩個或更多,其對應的索引序號也應該和位置索引一一對應。如果索引序號和格式設置標記均為空值時,其實就是直接連接位置參數的字符串。如通過format()方法連接字符串?“中國”、“1949”及“70”,代碼如下:
'{}{}'.format('中國','1949')???????????? #?輸出為“中國1949”
'{}{}{}'.format('中國','1949','70')?????? #?輸出為“中國194970”
位置參數對應關系如圖3和圖4所示。
圖3??傳遞兩個參數的情況
圖4???傳遞三個參數的情況
通過常量可以直接連接或修飾各個序號索引之間的關系,如分別通過字符串常量“:”和“?????”連接“中國“、”1949”?及“70”,代碼如下:
'{}:{}:{}'.format('中國','1949','70')?????? #?輸出為“中國:1949:70”
'{}???{}???{}'.format('中國','1949','70')? #?輸出為“中國???1949???70”
通過常量連接或修飾各個序號索引之間的關系如圖5所示。
圖5??通過常量連接或修飾各個序號索引之間的關系
可以通過不同的漢字常量對位置參數進行修飾,如通過“建國于”、“到2019年已經”?、“年”連接“中國“、”1949”?及“70”,代碼如下:
'{}建國于{}年,到2019年已經{}年!'.format('中國','1949','70')
輸出為:
中國建國于1949年,到2019年已經70年!
通過不同的漢字常量對位置參數進行修飾的對應關系如圖6所示。
圖6??通過不同的漢字常量對位置參數進行修飾
l??索引序號不為空(同一個參數可以填充多次)
如果索引序號不為空,可以通過設置索引序號內的值和位置參數的索引值進行對應,即通過{n}對位置參數索引為n的值進行對應,從而實現對傳入的位置參數進行格式化處理。如格式化2019年世界500強企業名單的第一名,代碼如下:
'排名:{0}?企業:{1}?收入:{2}?利潤:{3}'.format('1','沃爾瑪','5144.05','66.7')
使用print()函數輸出結果如下:
排名:1?企業:沃爾瑪?收入:5144.05?利潤:66.7
索引序號和位置參數不一定要按照這順序一一對應,可以根據程序需要對索引序號內的位置索引進行設置,本例的索引序號和位置參數是一一對應的,對應關系如圖7所示。
圖7??索引序號和位置參數的對應關系
改變索引序號的,可以通過設置索引序號和位置參數的索引值對應,即通過{n}對位置參數索引為n的值進行對應,從而實現對傳入的位置參數進行格式化處理。如格式化2019年世界500強企業名單的第一名,代碼如下:
'企業:{1}?收入:{2}?排名:{0}'.format('1','沃爾瑪','5144.05','66.7')
使用print()函數輸出結果如下:
企業:沃爾瑪?收入:5144.05?排名:1
本例索引序號和位置參數是非對應的,位置參數“沃爾瑪”的索引為1,位置參數“5144.06”的索引為2,位置參數“1”的索引為0,根據程序需要將相應的索引值通過索引序號進行了對應,如圖8所示。
圖8??索引值和索引序號的對應關系
索引序號的值可以重復,即多個索引序號的值可以是同一個位置參數的索引。如輸出2018年和2019年世界500強企業名單的第一名企業沃爾瑪,代碼如下:
'2018:{0}?收入:{2} 2019:{0}?收入:{1}'.format('沃爾瑪','5144.05','5003.43')
位置參數“沃爾瑪”的索引為0,位置參數“5144.06”為2019年的收入(億美元),位置參數“5003.43”為2018年的收入。在代碼中,位置參數“沃爾瑪”的索引為0在索引序號引用了兩次,如圖9所示。
圖9??位置參數與索引序號的對應關系
同一個位置參數可以填充多次,下面是索引序號和位置參數進行映射的示例:
print('{0}, {1}, {2}'.format('I', 'B', 'M'))????????#?輸出結果為:I, B, M
print('{}, {}, {}'.format('I',?'B',?'M'))???????????#?輸出結果為:I, B, M
print('{2}{2}{0}{1}{1}'.format('I', 'B', 'M'))??????#?輸出結果為:MMIBB
print('{0}{1},{0}{2}'.format('I','B','M'))??????????#?輸出結果為:IB,IM
print('{2}{1}{0}-{0}{1}{2}'.format('I', 'B', 'M'))??#?輸出結果為:MBI-IBM
如果位置參數不確定,也可以使用“*args”形式的位置參數來進行映射,*args可以將*號后面的字符串拆解成一個一個元素,如*'IBM',將“IBM”拆解成'I','B','M',下面代碼實現的效果是一樣的。
print('{2}, {1}, {0}'.format(*'IBM'))????????????????#?輸出?M, B, I
print('{2}, {1}, {0}'.format('I',?'B',?'M'))?????????#?輸出?M, B, I
位置參數的值可以來自元祖或表,然后使用“*args”形式的位置參數來進行映射,如:
mingri=['www','mingrisoft','com']
print('{0}.{1}.{2}'.format(*mingri))?????#?輸出結果為:www.mingrisoft.com
如果索引序號設置字符串過長,可以使用變量代替索引序號設置字符串,如:
order='排名:{}??企業名稱:{}??營業收入:{}萬美元??利潤:{}萬美元'
print(order.format('1','沃爾瑪','51440500','667000'))
輸出結果為:
排名:1??企業名稱:沃爾瑪??營業收入:51440500萬美元??利潤:667000萬美元
(2)通過關鍵字參數映射(關鍵字參數或命名參數)
索引序號按照關鍵字參數名稱進行映射,kwargs是關鍵字參數,是一個字典{xxx}表示在關鍵字參數中搜素名稱一致的。將元祖或字典打散成關鍵字參數給函數(通過和*或者**)format(),進行非常靈活的映射關系。
print('產品:{name}價格:{price}'.format(spec='6G+128G',name='Mate20',price=3669))?print('***{name}***, {price} '.format(spec='6G+128G',name='Mate20',price=3669))
user = {'net':'雙4G','name':'Mate 20','price':3669,'spec':'6GB+128G'}
print('{name},{net},{spec},{price}'.format(**user))
輸出結果為:
產品:Mate20價格:3669
***Mate20***, 3669
Mate 20,雙4G,6GB+128G,3669
位置參數和關鍵字參數可以混合使用,如:
print('{server}.{1}.{0}'.format('com','mingrisoft',server=?'www'))
輸出結果為:
www.mingrisoft.com
(3)通過元素進行映射
對于一些需要在字符串或元祖中截取部分元素進行格式化處理的情況,可以使用切片技術,但只能單個元素提取,如0[1],0[2],不能截取多個元素,如0[0:3],0[:2]等。(說明,0[1]查找位置參數索引為0?的元組中索引為1的元素)。代碼舉例如下:
print('{0[1]}--{0[0]}'.format(('猛龍','01')))
print('{0[0]}.{0[1]}.{0[2]}'.format(['www','mingrisoft','com']))
print('{0[2]}.{0[1]}.{0[0]}'.format('張三豐'))
print('{0[0]} {0[1]} {0[2]}'.format('www.mingrisoft.com'.split('.')))
輸出結果如下:
01--猛龍
www.mingrisoft.com
豐.三.張
www mingrisoft com
在對元素進行格式化時,利用轉義符可以對格式化的數據進行靈活的操作,如分別連接元祖中的數據,使用“\n”轉義符實現分行對NBA球隊進行輸出。代碼如下:
print('{0[1]}--{0[0]}\n{1[1]}--{1[0]}'.format(('猛龍','01'),('勇士','02')))
輸出結果如下:
01--猛龍
02--勇士
print('{0[1][1]}\n{0[0][1]}'.format((('www','mingrisoft','com'),('www','huawei','com'))))
輸出結果如下:
huawei
mingrisoft
可以對不同元祖中的對應元素進行提取,實現相應數據的對應輸出。如提取元祖中網址中的網址信息,代碼如下:
print('{0[1]}、{1[1]}'.format(('www','mingrisoft','com'),('www','huawei','com')))
mingrisoft、huawei
(4)通過組合映射
在格式化數據時,可以根據位置參數或關鍵字參數的制定元素,通過索引序號進行靈活的數據組合映射,以達到程序的需要。如將兩個元祖中的元素組合,格式化輸出三大互聯網公司,代碼如下:
print('{1[0]}{0[0]}\n{1[1]}{0[1]}\n{1[1]}{0[2]}\n{1[0]}{0[3]}'.format(('阿里巴巴','亞馬遜','谷歌','騰訊','IBM'),('中國','美國')))
輸出結果為:
中國阿里巴巴
美國亞馬遜
美國谷歌
中國騰訊
也可以將多個未知參數中的元素進行組合,如將姓名等位置參數進行組合,生成新的姓名字符串,代碼如下:
print('{0[0]}{1[0]}{2[0]}'.format('張王李趙','世常明延','國成微遠'))
輸出結果如下:
張世國
(5)通過元祖映射
通過元祖可以很好地實現索引序號與格式化數據的映射,如:
list = ['明日科技',?'www.mingrisoft.com']
print("公司名稱:{0[0]},?網址:{0[1]}".format(list))???# "0"?對應字典的索引值
info= ['joy', 22,?'1.73']
print('My name is {0[0]}, age is {0[1]}, height is {0[2]}'.format(info))
film= (('復仇者聯盟4:終局之戰',8.6,2019,2793),('阿凡達',8.7,2009,2788),('泰塔尼克號',9.4,1997,2187))
print(?'票房最高:?{0[0][3]},?評分最高:?{0[2][1]},最新發行:{0[0][2]}'.format(film))
data?=?[4,?8,?15,?16,?23,?42]
print('{d[4]} {d[5]}'.format(d=data))
輸出結果為:
公司名稱:明日科技,?網址:www.mingrisoft.com
My name is joy, age is 22, height is 1.73
票房最高:?2793,?評分最高:?9.4,最新發行:2019
(6)通過字典映射
利用字典進行映射是比較常用的格式化操作的方法,可以通過字典的參數的items訪問。
info= {'name':?'joy',?'age': 22,?'height':1.68}
print('name : {0[name]}, age :{0[age]}, height: {0[height]}'.format(info))
order= {'a001':?'joy',?'a002':?'jack',?'a003':'may',?'a004':'jobs'}
fatstr='{0['+random.choice((',').join(info).split(','))+']}'
print(fatstr.format(order))
person = {'name':?'joy',?'age': 22}
print('{p[name]} {p[age]}'.format(p=person))
輸出結果為:
name : joy, age :22, height: 1.68
joy
joy 22
元祖和字典都支持命名占位符,如:
data = {'a001':?'英國SAS',?'b001':?'美國三角洲部隊','c001':?'俄羅斯阿爾法部隊'}
print('{b001} {c001}'.format(**data))
輸出結果為:
美國三角洲部隊?俄羅斯阿爾法部隊
(7)通過循環嵌套映射
通過循環語句可以批量循序建立映射關系,如下批量建立虛擬姓名:
new=('張王李趙','世常明延','國成微遠')
for?i?in?range(4):
????print('{0}{1}{2}'.format(new[0][i],new[1][i],new[2][i]))
class?Plant(object):
??? type =?'tree'
????kinds = [{'name':?'oak'}, {'name':?'maple'}]
print('{p.type}: {p.kinds[0][name]}'.format(p=Plant()))
輸出結果為:
張世國
王常成
李明微
趙延遠
tree: oak
(8)通過傳入對象映射
class?Person:
?? def?__init__(self,name,age):
?????? self.name,self.age = name,age
?? def?__str__(self):
?????? return?'我叫{self.name},?今年{self.age}歲了'.format(self=self)
print(str(Person('joy', 22)))
輸出結果為:
我叫joy,?今年22歲了
(9)靈活應用占位符
print('{0:{fill}{align}12}'.format("python",?fill='#',?align='^'))
for?num?in?range(1,6):
????for?base?in?"dXob":
????????print("{0:{width}{base}}".format(num,?base=base,?width=6),?end=' ')
????print()
輸出結果為:
###python###
???? 1????? 1????? 1????? 1
???? 2????? 2????? 2???? 10
???? 3????? 3????? 3???? 11
???? 4????? 4????? 4??? 100
???? 5????? 5????? 5??? 101
格式化模板標簽
'{索引序號:?格式控制標記}'.format(*args,**kwargs)
本節重點講解格式控制標記,格式控制標記用來控制參數顯示時的格式,包括:<填充><對齊><寬度>,<.精度><類型>6?個字段,這些字段都是可選的,可以組合使用。其對應關系如圖10所示。
圖10??格式控制標記與顯示格式的對應關系
格式模板中的格式標記符即可以簡單、快速對數據進行格式化處理,也可以進行復雜的自動化處理和計算。
1)fill,可選參數,指”width”內除了參數外的字符采用什么方式表示,默認采用空格,可以通過<填充>更換,填充字符只能有一個。
s =?"PYTHON"
print("{0:30}".format(s))
print("{0:>30}".format(s))
print("{0:*^30}".format(s))
print("{0:-^30}".format(s))
print("{0:3}".format(s))
輸出結果為:
PYTHON???????????????????????
??????????????????????? PYTHON
************PYTHON************
------------PYTHON------------
PYTHON
print("{a:*^8}".format(a="mr"))?????#???輸出***mr***
print("{:0>8}".format("866"))
print("{:$>8}".format("866"))
print("{:0>8}".format("866"))
print("{:-<8}".format("866"))
#中間對齊方式中如果出現字符兩側無法平均分配填充符,字符后填充符可以多填充
print("{:-^8}".format("866"))
print("{:*<30}>".format("www.mingrisoft.com"))
輸出結果為:
***mr***
00000866
$$$$$866
00000866
866-----
--866---
www.mingrisoft.com************>
2)align,可選參數,可供選擇的值有:<,>,^或=。指參數在<寬度>內輸出時的對齊方式,分別使用<、>、^和=表示左對齊、右對齊、居中對齊和在符號后進行補齊。需要注意的是,如果align參數為空,對于字符串,默認左對齊。對于數字,默認右對齊。
l??<?(如果是字符串,默認左對齊)左對齊??????
l??^?中間對齊
l??>?(如果是數字,默認右對齊)右對齊
l??=?(只用于數字)在符號后進行補齊
print("{:10}".format('18'))?????
print("{:10}".format(18))
print("{:<10}".format('18'))
print("{:<10}".format(18))
print("{:>10}".format('18'))
print("{:0>10}".format('18'))
print('{:A>10}'.format('18'))
print("{:^10}".format('18'))
print('{:0=10}'.format(-18))
print('{:0<10}'.format(-18))
print('{:0>10}'.format(-18))
print('{:0=10}'.format(18))
輸出結果為:
18???????
??????? 18
18???????
18???????
??????? 18
0000000018
AAAAAAAA18
??? 18???
-000000018
-180000000
0000000-18
0000000018
注意:zfill()方法也可以返回指定長度的字符串,原字符串右對齊,前面填充0。
zfill()方法語法:str.zfill(width)
參數width指定字符串的長度。原字符串右對齊,前面填充0。
返回指定長度的字符串。
print("11".zfill(5))
結果輸出為:
00011
3)sign,可選參數,sign可以使用?"+" | "-" | " "。+表示正號,?-表示負號寬度指當前槽的設定輸出字符寬度,如果該槽參數實際值比寬度設定值大,則使用參數實際長度。如果該值的實際位數小于指定寬度,則按照對齊指定方式在寬度內對齊,默認以空格字符補充。
s =? 3.1415926
t=-3.1415926
print("{:+25}".format(s))??????#左對齊,默認
print("{:^25}".format(s))?????#居中對齊
print("{:>-25}".format(s))?????#右對齊
print("{:*^ 25}".format(t))????#居中對齊且填充*號
print("{:+^25}".format(t))????#居中對齊且填充+號
print("{:十^25}".format(t))???#居中對齊且填充漢字“十”
print("{:^+1}".format(t))??????#z指定寬度為1,不足變量s的寬度
輸出結果為:
?????????????? +3.1415926
??????? 3.1415926???????
??????????????? 3.1415926
*******-3.1415926********
+++++++-3.1415926++++++++
十十十十十十十-3.1415926十十十十十十十十
-3.1415926
4)#和0,可選參數,#為進制標志,對于進制數,在進制符前加#,輸出時會帶上進制前綴,即顯示0b,0o,0x。0為填充0,設置width時,沒設填充值,加上0,填充0指定位置用0填充。如:
print("{:0>5}".format('18'))
print("{:#x}".format(50))?????#?在進制符前加#,輸出時會帶上進制前綴
print("{:#o}".format(12))?????#?在進制符前加#,輸出時會帶上進制前綴
print("{:#b}".format(22))?????#?在進制符前加#,輸出時會帶上進制前綴
print("{:>#8x}".format(50))?????#?在進制符前加#,輸出時會帶上進制前綴
print("{:=#10o}".format(12))?????#?在進制符前加#,輸出時會帶上進制前綴
輸出結果為:
00018
0x32
0o14
0b10110
??? 0x32
0o????? 14
5)Width,可選參數,?integer?是數字寬度,表示總共輸出多少位數字。通常和align參數配合使用,示例如下:指當前槽的設定輸出字符寬度,如果該槽對應的format()參數長度比<寬度>設定值大,則使用參數實際長度。如果該值的實際位數小于指定寬度,則位數將被默認以空格字符補充。如:
print('%+6s'?%?'明日')??????????#?字符串左對齊
print('%+6d'?% -3.14)????????????#?格式化為整數,左對齊
print('%-6s'?%?'明日')??????????#?字符串左對齊
print('%-6d'?% -3.14)????????????#?格式化為整數,左對齊
print('% 6s'?%?'明日')??????????#?字符串左對齊
print('%06d'?% 3.14)????????????#?格式化為整數,左對齊
輸出結果為:
????明日
??? -3
明日???
-3???
????明日
000003
6)千位符,千位符用逗號(,),用于顯示數字的千位分隔符,例如:
print("{0:^12,}".format(31415926))
print("{0:-^12,}".format(3.1415926))
print("{0:*^12,}".format(31415.926))
輸出結果為:
31,415,926
-3.1415926--
*31,415.926*
7)?.precision,可選參數,設置浮點數或字符串的精度。對于浮點數來說,用于設置浮點數的精度,即小數點后保留的位數。對于字符串來說,就是截取字符串的位數。表示兩個含義,由小數點(.)開頭。對于浮點數,精度表示小數部分輸出的有效位數。對于字符串,精度表示輸出的最大長度。
print("{0:.2f}".format(12345.67890))
print("{0:H^20.3f}".format(12345.67890))
print("{0:.4}".format("PYTHON"))
結果輸出為:
12345.68
HHHHH12345.679HHHHHH
PYTH
8)type,可選參數,表示獲取對應類型的值并格式化到指定位置。格式符為真實值預留位置,并控制顯示的格式。格式符可以包含有一個類型碼,用以控制顯示的類型,主要的格式符有:
l??s,字符串?(采用str()的顯示)。
l??r,字符串?(采用repr()的顯示)。
l??c,整數:將數字轉換成其unicode對應的值,10進制范圍為?0 <= i <= 1114111(py27則只支持0-255);字符:將字符添加到指定位置。
l??o,將整數轉換成八進制表示,并將其格式化到指定位置。
l??x,將整數轉換成十六進制表示,并將其格式化到指定位置。
l??b????將整數轉換成二進制整數,并將其格式化到指定位置。
l??d,將整數、浮點數轉換成十進制表示,并將其格式化到指定位置。
l??e,將整數、浮點數轉換成科學計數法,并將其格式化到指定位置(小寫e)。
l??E,將整數、浮點數轉換成科學計數法,并將其格式化到指定位置(大寫E)。
l??f,?將整數、浮點數轉換成浮點數表示,并將其格式化到指定位置(默認保留小數點后6位)。
l??g,自動調整將整數、浮點數轉換成?浮點型或科學計數法表示(超過6位數用科學計數法),并將其格式化到指定位置(如果是科學計數則是e;)。
l??G,自動調整將整數、浮點數轉換成?浮點型或科學計數法表示(超過6位數用科學計數法),并將其格式化到指定位置(如果是科學計數則是E;)。
l??%,當字符串中存在格式化標志時,需要用?%%表示一個百分號。
如果類型參數未提供,則和調用str(value)效果相同,轉換成字符串格式化。如:
print("{}".format(12345.67890))
print("{0:>12}".format(12345.67890))
結果輸出為:
12345.6789
? 12345.6789
對于字符符串類型,可以提供的參數有?'s'
print("{:s}".format('3.1415926'))
print("{0:>12s}".format('mingri'))
print("{0:>12s}\n{1:>6s}".format('mingri','mr'))
結果輸出為:
?3.1415926
????? mingri
????? mingri
??? mr
整形數值可以提供的參數有?'b' 'c' 'd' 'o' 'x' 'X' 'n' None,如:
print("{:c}".format(1221))
print("{:4d}".format(3145926))
print("{:b}".format(31))
print("{:o}".format(31))
print("{:x}".format(31))
print('{0:o} :{0:x}:{0:o}'.format(31))
結果輸出為:
?
3145926
11111
37
1f
37 :1f:37
#浮點數可以提供的參數有?'e' 'E' 'f' 'F' 'g' 'G' 'n' '%' None
print('{:e}'.format(314159267))?????#科學計數法,默認保留6位小數
print('{:0.2e}'.format(314159267))??#科學計數法,指定保留2位小數
print('{:f}'.format(314159267))?????#?小數點計數法,默認保留6位小數
print('{:0.2f}'.format(314159267))??#小數點計數法,指定保留2位小數
print('{0:0.2f}\n{0:0.8f}'.format(314159267))??#小數點計數法,指定保留小數位數
print('{:0.2F}'.format(314159267))??#小數點計數法,指定保留2位小數
print('{0:0.2F}\n{0:0.8f}'.format(314159267))??#小數點計數法,指定小數位數
結果輸出為:
3.141593e+08
3.14e+08
314159267.000000
314159267.00
314159267.00
314159267.00000000
314159267.00
314159267.00
314159267.00000000
#g的格式化比較特殊,假設p為格式中指定的保留小數位數,先嘗試采用科學計數法格式化,得到冪指數exp,如果-4<=exp<p,則采用小數計數法,并保留p-1-exp位小數,否則按小數計數法計數,并按p-1保留小數位數。
print('{:1g}'.format(0.000031415926))
print('{:.2g}'.format(0.000031415926))
print('{:.5G}'.format(0.000031415926))
print('{:.3n}'.format(0.000031415926))
print('{:1g}'.format(3.1415926))
print('{:.2g}'.format(3.1415926))
print('{:.5G}'.format(3.1415926))
print('{:.3n}'.format(3.1415926))
輸出結果為:
3.14159e-05
3.1e-05
3.1416E-05
3.14e-05
3.14159
3.1
3.1416
3.14
????快用錦囊
錦囊1 ?格式轉換
如果格式控制標記未提供,則默認為將其他格式數據格式化為字符型,如:
print('{}'.format(3.14))????#?使用format ()函數將浮點數轉換成字符
import?datetime
#?將日期格式化為字符
print('{}'.format(datetime.datetime.utcnow().strftime("%Y-%m-%d?? %H:%M:%S")))
輸出結果為:
3.14
2019-08-01?? 03:34:52
設置格式化為字符型值時,可以進行相應數據類型的格式化,字符串可以提供的參數為's'?。十進制整形提供的參數為'd'?和'n',二進制的參數為'b',八進制的參數為'o',十六進制小寫的參數為?'x'?,十六進制大寫的參數為?'X'?,ASC碼的參數為'c',浮點數的參數為'f'。主要進制轉換符號說明如下:
l??'b' -?二進制。將數字以2為基數進行輸出。
l??'d' -?十進制整數。將數字以10為基數進行輸出。
l??'o' -?八進制。將數字以8為基數進行輸出。
l??'x' -?十六進制。將數字以16為基數進行輸出,9以上的位數用小寫字母。
十進制、十六進制、八進制、二進制的轉換示例如下:
print('{:d}'.format(100))????? #?轉換成字符型、整形和浮點數
print('{:s}'.format('100'))????? #?轉換成字符型、整形和浮點數
print('{:c}'.format(97))?????????????? #?轉換unicode成字符
print('{:d},{:f}'.format(100,12.2))????? #?轉換成整形和浮點數
print('{:8d},{:2d},{:2f}'.format(314,314,314))?? #?轉換成指定格式的十進制
print('{:c},{:c},{:c}'.format(65,33,8712))??????? #?轉換成unicode字符
print('{:c}{:c}{:c}{:c}'.format(39321,26684,37324,25289))??????? #?轉換unicode成字符
print('{:o},{:x},{:X}'.format(12,12,12))??????? #?將十進制轉換成八進制和十六進制
輸出結果為:
100
100
a
100,12.200000
???? 314,314,314.000000
A,!,∈
香格里拉
14,c,C
如果要將十六進制、八進制、二進制的數字轉換為十進制數,一定要標注進制前綴,如"0x"“0o”“0b”,示例代碼如下:
print('{:d}'.format(0X5A))????#?十六進制數5A轉換成10進制數,0X代表十六進制數
print('{:8d}'.format(0B011101))???#?二進制數轉換成10進制數,0B代表二進制數
print('{:d}'.format(0O34))????#?八進制數轉換成10進制數,0O代表八進制數
print('{:08d}'.format(0O123456))?# 16制數123456轉換成10進制數,不足用0填充
print('{:*>8d}'.format(+0X1234))?# 16進制數1234轉換成10進制數,右對齊,不足用*
輸出結果為:
90
????? 29
28
00042798
****4660
保留進制前綴,#為進制標志,對于進制數,在進制符前加#,輸出時會帶上進制前綴,即顯示0b,0o,0x,示例代碼如下:
print("{:#x}".format(123))?????#?在進制符前加#,輸出時會帶上進制前綴
print("{:#o}".format(28))?????#?在進制符前加#,輸出時會帶上進制前綴
print("{:#b}".format(15))?????#?在進制符前加#,輸出時會帶上進制前綴
輸出結果為:
0x7b
0o34
0b1111
錦囊2 ?格式化十進制整數
格式化整形數值可以提供的參數有’d’、?’n’,兩者相同相同。和format()函數不同,使用str.format()方法格式化數值時,被格式化的數值必須是整數,不能是浮點數。常用應用如下:
print('{:}'.format(122))???????#?格式參數為空,默認為10進制
print('{:d}'.format(122))??????#?原來是十進制數,轉換后為原值
print('{:6d}'.format(122))?????#?轉換為6位十進制數,空余部分用空格填充
print('{:-6d}'.format(122))????#?轉換為6位帶符號十進制數,在符號前填充空余部分空格
print('{:08d}'.format(122))?#?轉換為8位十進制數,空余部分填充0
print('{:+8d}'.format(122))?#?轉換為8位帶符號十進制數,在符號前填充空余部分空格
print('{:-8d}'.format(122))??#?轉換為8位十進制數,空余部分填充空格
print('{:=8d}'.format(-122))??#?轉換為8位十進制數,負號后空余部分填充空格
print('{:=8d}'.format(122))??#?轉換為8位十進制數,空余部分填充空格
print('{:*<8d}'.format(122))??#?轉換為8位十進制數,左對齊,空余部分填充*
print('{:#>8d}'.format(122))??#?轉換為8位十進制數,右對齊,空余部分填充#
print('{:n}'.format(122))??????#?原來是十進制數,轉換后為原值
print('{:6n}'.format(122))?????#?轉換為6位十進制數,空余部分用空格填充
print('{:-6n}'.format(122))????#?轉換為6位帶符號十進制數,在符號前填充空余部分空格
?輸出結果為:
122
122
?? 122
?? 122
00000122
??? +122
???? 122
-??? 122
???? 122
122*****
#####122
122
?? 122
?? 122
對于整數來說,加、減、乘、除是最基本的操作,對整數進行格式化后可以直接連接成算數式。下面是一些簡單的計算操作,代碼如下:
print('{:d}={:2d}={:3d}'.format(122,122,122))# 8位整數顯示,不足部分整數前用空格填充
print('{:4d}+{:4d}={:4d}'.format(25,10,35))?#?格式化為帶符號整數顯示數據
add1=[12,23,35,10,8]?? ???????????#?加數
add2=[7,19,6,211,790]???????????? #?被加數
for?i?in?range(5):????????????????#?循環輸出計算式
print('{:<5d}+{:5d}={:5d}'.format(add1[i],add2[i],add1[i]+add2[i]))?#?加數設成左對齊
輸出結果為:
122=122=122
? 25+? 10=? 35
12?? +??? 7=?? 19
23?? +?? 19=?? 42
35?? + ???6=?? 41
10?? +? 211=? 221
8??? +? 790=? 798
錦囊3 ?格式化浮點數
對于浮點數類型,可以提供的格式化參數有?'e'?、'E'、?'f'?、'F'、?'g'、?'G'?、'%'?等。本錦囊主要講解用?f?格式化浮點類型的方法。使用?f?格式化浮點類型時,可以在其前邊加上精度,控制輸出浮點數的值;可以設置寬度控制數字的占位寬度。如果輸出位數大于寬度,就按實際位數輸出,如果輸出位數小于寬度,則用占位符填充不足部分;也可以為浮點數指定符號,+?表示在正數前顯示?+,負數前顯示?-;?(空格)表示在正數前加空格,在幅負數前加?-;-?與什么都不加({:f})時一致:{:f}默認保留6位小數。?{:。3f}表示浮點數的精度為3(小數位保留3位),{:.f}是錯誤,必須在小數點后書寫數字。常用示例代碼如下:
print('{:f}'.format(628))????????????#?格式化為保留1位小數的浮點數
print('{:.1f}'.format(628))????????????#?格式化為保留1位小數的浮點數
print('{:.2f}'.format(628))????????????# #?格式化為保留2位小數的浮點數
print('{:.1f}'.format(3.14159))????????#?格式化為保留1位小數的浮點數
print('{:.5f}'.format(3.14159))????????#?格式化為保留5位小數的浮點數
print('{:>8.3f}'.format(-3.14159))???????#?格式化為保留1位小數的浮點數
print('{:<8f}'.format(3.1415926535898,'f'))??#?默認精度保留6位小數
print('{:f}>{:.4f}>{:.2f}'.format(3.1415926,3.1415926,3.1415926))
print('{:2f}-{:2f}={:2f}'.format(12.2345,10,2.2345))?#?格式化為帶符號整數顯示數據
輸出結果為:
628.000000
628.0
628.00
3.1
3.14159
? -3.142
3.141593
3.141593>3.1416>3.14
12.234500-10.000000=2.234500
在計算式中,可以通過格式化統一浮點數的精度(小數位數)。通常是將浮點數格式化為包含兩位小數的浮點數。下面是一些經典的應用,代碼如下:
one=[3.2345,6,5.123,12.5678,21]??????????????#?計算數
two=[18.54,43.67564,3.1315,21.21,7.543]?????????????#?計算數
thr=[9.1287,1.876,6.345,21.654,7]??????????????#?計算數
str='{:.2f}{:}{:.2f}{:}{:.2f}={:.2f}'
for?i?in?range(5):????????????????#?循環輸出計算式
????str=('{0:.2f}+{1:.2f}*{2:.2f}={3:.2f}')
??? x='{:.2f}'???#?計算精度
????all=float(x.format(one[i]))+float(x.format(two[i]))*float(x.format(thr[i]))
?? ?print(str.format(one[i],two[i],thr[i],all))
輸出結果為:
3.23+18.54*9.13=172.50
6.00+43.68*1.88=88.12
5.12+3.13*6.34=24.96
12.57+21.21*21.65=471.77
21.00+7.54*7.00=73.78
錦囊4 ?格式化百分數
在格式化解釋中單獨或者在精度之后添加“%”號,可以實現用百分數顯示浮點數,如:
print('{:%}'.format(0.161896))??????#?將小數格式化成百分數
print('{:.2%}'.format(0.161896))??????#?格式化為保留兩位小數的百分數
print('{:.6%}'.format(0.0238912))?????#?格式化為保留六位小數的百分數
print('{:.2%}'.format(2/16))??????????#?格式化為保留兩位小數的百分數
print('{:.1%}'.format(3.1415926))?????#?格式化為保留一位小數的百分數
print('{:.0%}'.format(0.161896))??????#?格式化為保留整數的百分數
print('{:8.6%}'.format(0.0238912))?????#?格式化為保留六位小數的八位百分數
print('{:8.3%}'.format(0.0238912))????#?格式化為保留三位小數的八位百分數
輸出結果為:
16.189600%
16.19%
2.389120%
12.50%
314.2%
16%
2.389120%
? 2.389%
錦囊5 ?格式化科學記數法
如果要將浮點數采用科學技術法表示,可以在格式化解釋中使用“e”和“E”或者“g”和“G”。'e'?為通用的冪符號,用科學計數法打印數字,用'e'表示冪。使用'g'時,將數值以fixed-point格式輸出。當數值特別大的時候,用冪形式打印。
#####e和E
print('{:e}'.format(3141592653589))??#?科學計數法,默認保留6位小數
print('{:e}'.format(3.14))??????#?科學計數法,默認保留6位小數
print('{:e}'.format(3.14,'0.4e'))??????#?科學計數法,默認保留6位小數
print('{:0.2e}'.format(3141592653589))???#科學計數法,保留2位小數
print('{:0.2E}'.format(3141592653589))???#科學計數法,保留2位小數,大寫E表示
#####g和G
print('{:F}'.format(3.14e+1000000))??????#小數點計數法,無窮大轉換成大小字母
print('{:g}'.format(3141592653589))??????#科學計數法,保留2位小數
print('{:g}'.format(314))????????????????#科學計數法,保留2位小數
print('{:0.2g}'.format(3141592653589))???#科學計數法,保留2位小數,大寫E表示
print('{:G}'.format(3141592653589))??????#小數點計數法,無窮大轉換成大小字母
print('{:g}'.format(3.14e+1000000))??????#小數點計數法,無窮大轉換成大小字母
輸出結果為:
3.141593e+12
3.140000e+00
3.140000e+00
3.14e+12
3.14E+12
INF
3.14159e+12
314
3.1e+12
3.14159E+12
inf
錦囊6 ?格式化金額
format()函數提供千位分隔符用逗號還能用來做金額的千位分隔符。如果要實現通常格式化后金額前面帶上相關貨幣的符號,需要在該函數前面手動加上相應貨幣符號。如:
print('${:.2f}'.format(1201398.2315))??#?添加美元符號,小數保留兩位
print(chr(36) +?'{:.2f}'.format(1201398.2315))?# ASCII碼添加美元,小數保留兩位
print(?'¥{:,.2f}'.format(1201398.2315))??#?添加人民幣符號,用千位分隔符進行區分
print(?'£{:,.2f}'.format(888800))???????#?添加英鎊符號,用千位分隔符進行區分
print(?'{:.2f}'.format(123.6612))???????#?添加歐元符號,保留兩位小數,千位分隔
print(?chr(0x20ac) +'{:,.2f}'.format(1201398.2315))??#?使用16進制編碼添加歐元
print(chr(36) +?'{:.2f}'.format(1201398.2315))# ASCII碼加美元符號,小數保留兩位
輸出效果為:
$1201398.23
$1201398.23
¥1,201,398.23
£888,800.00
123.66
1,201,398.23
$1201398.23
錦囊7 ?格式化字符
格式化字符主要包括截取字符串,字符串對齊方式顯示,填充字符串等幾個方面,下面舉例如下:
print('{:M^20.3}'.format('PYTHON'))?#截取3個字符,寬度20居中,不足用‘M’填充
print('{:10}'.format("PYTHON",'10'))??????????#?默認居左,不足部分用‘?’填充
print('{:.3}'.format('mingrisoft.com'))??#?截取3個字符,默認居左顯示
print('{:>10}'.format("PYTHON"))?????????#?居右顯示,不足部分用‘?’填充
s='mingrisoft.com'
print('{:>20}'.format(s))???#?右對齊,不足指定寬度部分用0號填充
print('{:>4}'.format(s))??????#?右對齊,因字符實際寬度大于指定寬度4,不用填充
print('{:*>20}'.format(s))????#?右對齊,不足指定寬度部分用*號填充
print('{:0>20}'.format(s))????#?右對齊,指定0標志位填充
print('{:>20}'.format(s))?????#?右對齊,沒指定填充值,用默認值空格填充
print('{:0^30}'.format(s))????#?居中對齊,用+號填充不足部分
結果輸出為:
MMMMMMMMPYTMMMMMMMMM
PYTHON???
min
??? PYTHON
????? mingrisoft.com
mingrisoft.com
******mingrisoft.com
000000mingrisoft.com
錦囊8 ?指定轉化
轉換字段?conversion field?的取值有三種,前面要加?!:
l??s:傳遞參數之前先對參數調用?str()
l??r:傳遞參數之前先對參數調用?repr()
l??a:傳遞參數之前先對參數調用?ascii()
可以指定字符串的轉化類型:其中?"!r"?對應?repr();?"!s"?對應?str(); "!a"?對應?ascii()。
print("repr() shows quotes: {!r}; str() doesn't: {!s}".format('mingri',?'soft'))
print("joy is a cute {!s}".format("baby"))??# !s?相當于對于參數調用str()
print("joy is a cute {!r}".format("baby"))??# !s?相當于對于參數調用str()
print('I am {!s}!'.format('Bruce Lee?李小龍'))
print('I am {!r}!'.format('Bruce Lee?李小龍'))
print('I am {!a}!'.format('Bruce Lee?李小龍'))
結果輸出為:
repr() shows quotes: 'mingri'; str() doesn't: soft
joy is a cute baby
joy is a cute 'baby'
I am Bruce Lee?李小龍!
I am 'Bruce Lee?李小龍'!
I am 'Bruce Lee \u674e\u5c0f\u9f99'!
錦囊9 ?格式化日期月份
format()函數也可以對日期和時間進行格式化,格式化時可以通過日期和時間格式符號進行設置,常用python中時間日期格式化符號如表1所示。常用操作代碼如下:
import?datetime
now=datetime.datetime.now()
print('{:%Y-%m-%d %H:%M:%S %A}'.format(now))??#?當前時間格式化為年月日+完整英文星期
print('{:%Y-%m-%d %H:%M:%S %a}'.format(now))???#?當前時間格式化為年月日+簡寫英文星期
#?中文年月日顯示
print('{:%Y}'.format(now),'年','{:%m}'.format(now),'月','{:%d}'.format(now),?'日')
#?中文時間顯示
print('{:%H}'.format(now),'時','{:%M}'.format(now),'分','{:%S}'.format(now),?'秒')
print('{:%Y-%m-%d %H:%M:%S %a}'.format(now))??#?當前時間格式化為年月日+簡寫英文星期
print('{:%Y-%m-%d}'.format(now))?#?當前時間格式化為標準年月日
print('{:%y-%m-%d}'.format(now))?#?當前時間格式化為短日期年月日
print('{:%Y<%m>%d}'.format(now))?#?當前時間格式化為長日期年月日,?間隔符為“<”和“>”
print('{:%c}'.format(now))????????#?本地對應的年月日星期表示
輸出結果為:
2019-09-15 20:37:42 Sunday
2019-09-15 20:37:42 Sun
2019?年?09?月?15?日
20?時?37?分?42?秒
2019-09-15 20:37:42 Sun
2019-09-15
19-09-15
2019<09>15
Sun Sep 15 20:37:42 2019
import?datetime
now=datetime.datetime.now()
print('{:%B}'.format(now))??????????????????????????#?本地完整的英文月份表示
print('現在是今年第{:%j}天'.format(now))????????????#?今天是一年中第幾天
print('本周是今年第{:%U}周'.format(now))????????????#?本周是一年中第幾周
print('{:%y%m%d}'.format(now))?????????????#?無間隔符短年月日
print('{:%Y-%m}'.format(now))??????????????#?長日期格式年月
print('{:%m-%d}'.format(now))??????????????#?月日顯示、
print('{:%m}'.format(now))?????????????????#?月份單獨顯示
print('{:%d}'.format(now))?????????????????#?日期單獨顯示
輸出結果為:
September
現在是今年第258天
本周是今年第37周
190915
2019-09
09-15
09
15
import?datetime
now=datetime.datetime.now()
print('{:%H%M%S}'.format(now))?????????#?時分秒。無間隔符
print('{:%H:%M:%S}'.format(now))???????#?標準時分秒
print('{:%H:%M:%S %I}'.format(now))????# 12小時制?時分秒
print('{:%H:%M}'.format(now))???????????#?時+分
print('{:%M%S}'.format(now))????????????#?時鐘+分
print('{:%h}'.format(now))??????????????#?只顯示時鐘點
print('{:%H:%M:%S %p}'.format(now))????#?日期顯示按AM,PM顯示
輸出結果為:
205140
20:51:40
20:51:40 08
20:51
5140
Sep
20:51:40 PM
import?datetime
now=datetime.datetime.now()
print('{:%a}'.format(now))?????????#?英文星期簡寫
print('{:%A}'.format(now))?????????#?英文星期完整顯示
week=['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
print(week[int('{:%w}'.format(now))])????#?中文星期
輸出結果為:
Sun
Sunday
星期日
import?datetime
dt = datetime.datetime(2019, 9, 9)
dm=datetime.datetime(2019, 9, 9, 12, 50,20)
#?將輸入的日期按年月日和時間格式化,因時間沒有輸入,按0時處理
print('{:%Y-%m-%d %H:%M:%S}'.format(dt))
print('{:%Y-%m-%d}'.format(dt))??????????????????#?將輸入的日期按年月日格式化
print('{:%Y-%m-%d %H:%M:%S}'.format(dm))?????????#?將輸入的日期按年月日和時間格式化
輸出結果為:
2019-09-09 00:00:00
2019-09-09
2019-09-09 12:50:20
import?datetime
now=datetime.datetime.now()
print('{0:%Y%m%d}{1:03d}'.format(now,1))???????#?年月日?+3位編號
print('{0:%Y%m%d}NO{1:03d}'.format(now,5))?????#?年月日+NO+3位編號
print('{0:%d}NO{1:05d}'.format(now,8))??????????#?日期+NO+5位編號
print('{0:%H%M}NO{1:05d}'.format(now,8))????????#?時鐘+分?+NO+5位編號
for?i?in?range(5):????????????????#?循環輸出計算式
print('{0:%Y%m%d}NO{1:05d}'.format(now,i+1))
輸出結果為:
20190915001
20190915NO005
15NO00008
2135NO00008
20190915NO00001
20190915NO00002
20190915NO00003
20190915NO00004
20190915NO00005
錦囊10 ?數據對齊
在輸出數據時,數據對齊的工整程度和數據之間的間距非常影響用戶的閱讀感受,如下面的2019年世界500強企業排行,如圖11所示,數據間距過小,后面的數據也沒有對齊,閱讀感受不是很好。
圖11??原數據閱讀感較差
通過制表符“\t”,利用format()方法設置對齊字符串的寬度和對齊方式,可以很容易排列對齊數據,下面對世界500強企業進行對齊輸出(數據保存在源文件目錄下500.txt文件中),代碼如下:
with?open("500.txt",?'r')?as?fp:
??? lines=fp.readlines()
????for?line?in?lines:
??????? list=line.strip().split(' ')
??????? str=''
????????for?item?in?list:
??????????? str=str +'\t{:10}'.format(item)
????????print(str)
運行程序,輸出結果如圖12所示,從圖中可以看到數據對齊比較工整,能較好地瀏覽數據。
圖12 ?設置玩對齊的效果
對于常規的數據,使用通過制表符“\t”和通過format()方法設置寬度和對齊方式就可以很好地實現對齊,但對于中文字段較多,字段較長的數據,如果設置文字寬度不合適,就很容出現文字不對齊的情況,如輸出2018年全球大學排名前20名,代碼如下:
with?open("dx.txt",?'r')?as?fp:
??? lines=fp.readlines()
????for?line?in?lines:
??????? list=line.strip().split(',')
??????? str='\t{:0>2}'.format(list[0])+'\t{:<6}'.format(list[1])+'\t{0:<16}'.format(list[2])+'\t{:<40}'.format(list[3])
????????print(str)?
運行程序,輸出效果如圖13所示。
圖13 ?漢字字段較多時不對齊
從圖13可以看到,輸出的一些數據沒有對齊,主要問題是utf-8中中文占用3個字節,GBK中占用了2個字節,英文字符占用一個字節,所以設置文字寬度時統一按英文文字占用一個1字節設置就會造成文字寬度不一致的情況。如果設置中文字段寬度時寬度不夠時采用中文空格編碼chr(12288)填充,就可以很好地解決這個問題,代碼如下:
with?open("dx.txt",?'r')?as?fp:
??? lines=fp.readlines()
????for?line?in?lines:
??????? list=line.strip().split(',')
??????? str='\t{0:0>2}'.format(list[0])+'\t{0:{1}<5}'.format(list[3],chr(12288))+'\t{0:{1}<10}'.format(list[1],chr(12288))+'\t{0:<45}'.format(list[2])
????????print(str)
運行程序,輸出效果如圖14所示
圖14 ?設置對齊的效果
錦囊11 ?生成數據編號
對數據進行編號,也是對字符串格式化操作的一種方式,設置填充字符(編號通常設置0),設置對齊方式時可以使用<、>和^符號表示左對齊、右對齊和居中對齊,對齊填充的符號在“寬度”范圍內輸出時填充,如:
print('{:0>3}'.format(1))
print('{:0>5}'.format('03'))
print('a{:0>6}'.format(111))
輸出結果為:
001
00003
a000111
要生成的編號通常比較復雜,如根據當天的日期建立編號,或者批量生成編號,或者將給定的批量數據中的數字轉換成位數固定的編號,下面給出實現如上編號的實現方法:
import?datetime
wx=datetime.datetime.now().date()
now=datetime.datetime.now()
print(str(wx)+'{:0>3}'.format(1))????#?年月日?+3位編號
print('{:%Y%m%d}{:0>3}'.format(now,1))???#?年月日?+3位編號
print('{:%Y%m%d}NO{:0>5}'.format(now,5))???#?年月日+NO+3位編號
print('{:%Y}NO{:0>5}'.format(now,5))???#?日期+NO+3位編號
print('{:%H%M}NO{:0>3}'.format(now,5))???# #?時鐘+分?+NO+3位編號
輸出結果為:
2019-08-01001
20190801001
20190801NO00005
2019NO00005
1155NO005
20190801 NO001
01 NO001
1155 NO001
for?i?in?range(1,6):
print('mr{:0>3}'.format(i))
mr001
mr002
mr003
mr004
mr005
要實現嵌套編號,如A001-A005,B001-B005,C001-005的嵌套編號。代碼如下:
for?i?in?range(65,69):
????for?j?in?range(1,6):
??????? data=chr(i)+'{:0>3}'.format(j)+' '
????????print(data,end='')
????print()
結果輸出如下:
錦囊12 ?format的索引序號作為函數變量
Format()的索引序號可以在Format()的位置參數或關鍵字參數中給定,也可以把索引序號作為函數變量,動態添加,如對輸入的數字格式化為5位編號,編寫函數mark,變量num作為索引序號,調用時直接賦值給num變量即可,實現代碼如下:
mark =?"編號:{num:0>5d}".format
print(mark(num=3))
輸出結果為:
編號:00003
調用mark函數可以實現批量輸出格式化的編號,如輸出10個5位編號,編號從0001到00009,代碼如下:
mark =?"編號:{num:0>5d}".format
for?i?in?range(10):
?????print(mark(num=i))
輸出結果為:
編號:00000
編號:00001
編號:00002
編號:00003
編號:00004
編號:00005
編號:00006
編號:00007
編號:00008
編號:00009
錦囊13 ?{}內嵌{}
格式化標簽模板中的格式設置參數也可以通過str.Format()方法的位置參數或關鍵字參數給定,但必須放在{}里面,如通過{}內嵌{}將位置參數2的值設置位置參數1(3.1415926)的小數位數為2,則格式化模板為{0:>.{1}f},其中{1}指定的是第2個位置參數2。代碼如下:
print('{0:>.{1}f} '.format(3.1415926,2))?????? ?#? {1}對應位置參數2
輸出結果為:
3.14
通過{}內嵌{}在批量處理數據時非常有用,可以方便的設置變量,不用按個修改模板參數中的值,如輸出9*9的乘法口訣,可以設置輸出口訣元素的寬度,如設置long為‘1d’或‘2d’,把long設置為位置參數即可。代碼如下:
long='1d'
for?i?in?range(1,10):
?????for?j?in?range(1,10):
?????????print("{0:<{3}}*{1:>{3}}={2:{3}}".format (i,j,i*j,long),end=" ")
?????print("")
運行程序,如圖15所示,因為設置元素寬度為1個寬度,所以輸出效果不是很整齊。修改第一行代碼中的long='2d',運行程序,如圖16所示,運行效果就比較整齊了。
圖15 ?long為‘1d’的運行效果
圖16 ?long為‘2d’的運行效果
錦囊14 ?format變形
可以簡化為f'xxxx'形式,在字符串前加f以達到格式化的目的,在{}里加入對象,如下面的代碼:
print('{0} {1}'.format('hello','world'))
可以簡化為:
a =?'hello'
b =?'world'
print(f'{a} {b}')
運行結果如下:
hello world
hello world