Str.format()方法

自學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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/diannao/36603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36603.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36603.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于ADRC自抗擾算法的UAV飛行姿態控制系統simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 4.1 控制系統概述 4.2 ADRC基本框架 4.3 控制律設計 5.完整工程文件 1.課題概述 基于ADRC自抗擾算法的UAV飛行姿態控制系統simulink建模與仿真&#xff0c;分別對YAW&#xff0c;PITCH&#xff0c;ROL…

K-Means 算法詳解

K-Means 是一種常用的無監督學習算法&#xff0c;廣泛應用于數據聚類分析。本文將詳細講解 K-Means 算法的原理、步驟、公式以及 Python 實現&#xff0c;幫助你深入理解這一經典算法。 什么是 K-Means 算法&#xff1f; K-Means 算法是一種基于原型的聚類算法&#xff0c;其…

Linux分區以及磁盤管理

目錄 一、磁盤 1.磁盤結構 1.1物理結構 1.2數據結構 2.1磁盤容量 2.2磁盤接口類型 2.磁盤分區的表示 3.MBR與磁盤分區表示 4.磁盤分區結構 二、文件系統 1、類型 三、命令 1.檢測并確認新硬盤 2.創建系統文件(格式化) 2.1mkfs命令 2.2SWAP 3.掛載、卸載文件系統…

Simulink中三相PMSM配置及使用

1. 模塊介紹 Simulink提供了專門用于電力系統仿真&#xff0c;包括電機的動態建模和控制的電機模型&#xff0c;其中&#xff0c;永磁同步電機模塊 Permanent Magnet Synchronous Machine 支持實現三相或五相永磁同步電機模擬&#xff0c;電機繞組采用星型連接&#xff0c;在這…

【圖像分類】Yolov8 完整教程 |分類 |計算機視覺

目標&#xff1a;用YOLOV8進行圖像分類。 圖像分類器。 學習資源&#xff1a;https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 記錄計算機視覺學習道路上的所思所得。 1、文件結構化 劃分數據集&#xff1a;train,val,test 知道怎么劃分數據集很重要。 文件夾…

應用圖撲 HT for Web 搭建拓撲關系圖

拓撲結構在計算機網絡設計和通信領域中非常重要&#xff0c;因為它描述了網絡中的設備&#xff08;即“點”&#xff09;如何相互連接&#xff08;即通過“線”&#xff09;。這種結構不僅涉及物理布局&#xff0c;即物理拓撲&#xff0c;還可以涉及邏輯或虛擬的連接方式&#…

【系統架構設計師】計算機組成與體系結構 ③ ( 層次化存儲結構 | 寄存器 | 高速緩存 | 內存 | 外存 )

文章目錄 一、層次化存儲結構1、層次化存儲結構2、層次化存儲結構 - 示例說明3、程序員可操作的部分 計算機 采用 分級存儲結構 , 主要目的是 為了 解決 容量 / 價格 / 速度 之間的矛盾 ; 一、層次化存儲結構 1、層次化存儲結構 計算機 存儲器 按照存儲速度 由快到慢 進行排序 …

吐血推薦!3款視頻生成工具,全部國產,都免費

AI視頻大模型的爆發&#xff0c;讓創作爆款視頻不再是專業人士的能力。 今天二師兄給大家推薦3款免費的視頻生成工具。 01 可靈 推薦指數 &#xff1a; 五顆星 先看效果 可靈大模型測試 可靈大模型是快手AI團隊自主研發的視頻生成大模型&#xff0c;具備強大的視頻創作能力&a…

【經典面試題】RabbitMQ如何防止重復消費?

RabbitMQ的消息消費是有確認機制的&#xff0c;正常情況下&#xff0c;消費者在消費消息成功后&#xff0c;會發送一個確認消息&#xff0c;消息隊列接收到之后&#xff0c;就會將該消息從消息隊列中刪除&#xff0c;下次也就不會再投遞了。 但是如果存在網絡延遲的問題&#…

教程:在 Kubernetes 集群上部署 WordPress 網站

WordPress 是專為每個人設計的開源軟件&#xff0c;強調創建網站、博客或應用程序的可訪問性、性能、安全性和易用性。WordPress 是一個基于 PHP 的內容管理系統&#xff08;CMS&#xff09;&#xff0c;使用 MySQL 作為數據存儲&#xff0c;目前很多網站、電商獨立站、個人博客…

AI新紀元-GPT-5

GPT-5&#xff1a;引領AI新紀元 隨著OpenAI首席技術官米拉穆拉蒂的確認&#xff0c;GPT-5的發布正在逐漸接近我們。從GPT-4到GPT-5的躍遷&#xff0c;不僅標志著技術層面的巨大進步&#xff0c;更是AI智能水平的一次質的飛躍。穆拉蒂將這一進步比喻為從高中生到博士生的成長&am…

深入比較:Symfony與Laravel框架的異同

引言 在現代Web開發領域&#xff0c;PHP框架扮演著至關重要的角色。Symfony和Laravel是兩個非常流行的PHP框架&#xff0c;它們各自有著獨特的設計理念、功能特性和社區支持。本文將深入探討這兩個框架的不同之處&#xff0c;包括設計理念、架構、性能、學習曲線、社區支持等方…

推薦系統三十六式學習筆記:原理篇.模型融合14|一網打盡協同過濾、矩陣分解和線性模型

目錄 從特征組合說起FM模型1.原理2.模型訓練3.預測階段4.一網打盡其他模型5.FFM 總結 在上一篇文章中&#xff0c;我們講到了使用邏輯回歸和梯度提升決策樹組合的模型融合辦法&#xff0c;用于CTR預估&#xff0c;給這個組合起了個名字&#xff0c;叫“輯度組合”。這對組合中&…

Yokogawa AQ6370E 10與AQ6370E 20 光譜儀的區別?

Yokogawa AQ6370E 20相比AQ6370E 10在波長準確度上有哪些改進&#xff1f; AQ6370E 20在波長準確度上相對于AQ6370E 10有明顯的提升&#xff0c;這對于需要高精度波長測量的應用來說是非常有益的。 波長精度提升&#xff1a;AQ6370E 20的波長精度相比AQ6370E 10有所提升&#…

SQL面試題練習 —— 查詢每個用戶的第一條和最后一條記錄

目錄 1 題目2 建表語句3 題解 題目來源&#xff1a;小紅書。 1 題目 現有一張訂單表 t_order 有訂單ID、用戶ID、商品ID、購買商品數量、購買時間&#xff0c;請查詢出每個用戶的第一條記錄和最后一條記錄。樣例數據如下&#xff1a; ---------------------------------------…

個人支付系統實現

基礎首頁&#xff1a; 訂單&#xff1a; 智能售卡系統 基于webmanworkerman開發 禁用函數檢查 使用這個腳本檢查是否有禁用函數。命令行運行curl -Ss https://www.workerman.net/check | php 如果有提示Function 函數名 may be disabled. Please check disable_functions in …

外星生命在地球的潛在存在:科學、哲學與社會的交織

外星生命在地球的潛在存在&#xff1a;科學、哲學與社會的交織 摘要&#xff1a;近年來&#xff0c;關于外星生命是否存在的討論日益激烈。有研究表明&#xff0c;外星人可能已經在地球漫步&#xff0c;這一觀點引發了廣泛的科學、哲學和社會學思考。本文將從科學角度探討外星…

線程池FutureTask淺談

一,概述 FuturnTask實現了Future與Runnable接口,筆者知道,ThreadPoolExecutor#submit可以傳入Callable接口而非Runnable,區別點在于Callable可以返回值,而整個FuturnTask可以理解為Callable設計,用來優雅地異步獲取執行結果,無需手動Condition去實現。 圍繞此,需知道…

鴻蒙開發系統基礎能力:【@ohos.wallpaper (壁紙)】

壁紙 說明&#xff1a; 本模塊首批接口從API version 7開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import wallpaper from ohos.wallpaper;WallpaperType 定義壁紙類型。 系統能力: 以下各項對應的系統能力均為SystemCapability…

python接口自動化的腳本

使用Requests庫進行GET請求 Requests是Python中最常用的HTTP庫,用于發送HTTP請求。下面是一個簡單的GET請求示例,用于從API獲取數據。 import requests url = "https://api.example.com/data" response = requests.get(url) if response.status_code == 200:prin…