為什么字需要格式化輸出呢?如果你需要將文本和數(shù)字拼接起來像這樣: a=15 print('你好,你今年'+str(a)+'歲了嗎') 像這樣是不是很麻煩,現(xiàn)在我們只是傳入了一個變量,如果我們有很多變量: age=20 name='aaa' country='China' city='Beijing' print('我的名字是'+name+'今年'+str(age)+'歲了,'+'我住在'+country+city+',一個很美麗的城市') 是不是太麻煩了,還很容易出錯,但是python提供了一個格式化輸出的方法,不見簡化了代碼,更有利于閱讀,更方便了編程人員編寫代碼,效率提升明顯。 格式化輸出方法一:%%方法的語法: 支持的方法: 先來看幾個簡單的例子: s1 = 'i am %s, i am %d years old' % ('jeck',26) #按位置順序依次輸出 s2 = 'i am %(name)s, i am %(age)d years old' % {'name':'jeck','age':26} #自定義key輸出 s3 = 'i am %(name)+10s, i am %(age)d years old, i am %(height).2f' % {'name':'jeck','age':26,'height':1.7512} #定義名字寬度為10,并右對齊.定義身高為浮點類型,保留小數(shù)點2位 s4 = '原數(shù): %d, 八進(jìn)制:%o , 十六進(jìn)制:%x' % (15,15,15) #八進(jìn)制\十六進(jìn)制轉(zhuǎn)換 s5 = '原數(shù):%d, 科學(xué)計數(shù)法e:%e, 科學(xué)計數(shù)法E:%E' %(1000000000,1000000000,1000000000) #科學(xué)計數(shù)法表示 s6 = '百分比顯示:%.2f %%' % 0.75 #百分號表示 格式化輔助命令: 實例:%s 1、%s打印時結(jié)果是hello string = 'hello' print('string=%s' % string) # output: string=hello 2、%2s意思是字符串長度為2,當(dāng)原字符串的長度超過2時,按原長度打印,所以%2s的打印結(jié)果還是hello print('string=%2s' % string) # output: string=hello 3、%7s意思是字符串長度為7,當(dāng)原字符串的長度小于7時,在原字符串左側(cè)補(bǔ)空格, 所以%7s的打印結(jié)果是 hello print('string=%7s' % string) # output: string= hello 4、%-7s意思是字符串長度為7,當(dāng)原字符串的長度小于7時,在原字符串右側(cè)補(bǔ)空格, # 所以%-7s的打印結(jié)果是 hello print('string=%-7s!' % string) # output: string=hello ! 5、 %.2s意思是截取字符串的前2個字符,所以%.2s的打印結(jié)果是he print('string=%.2s' % string) # output: string=he 6、%.7s意思是截取字符串的前7個字符,當(dāng)原字符串長度小于7時,即是字符串本身, # 所以%.7s的打印結(jié)果是hello print('string=%.7s' % string) # output: string=hello 7、%a.bs這種格式是上面兩種格式的綜合,首先根據(jù)小數(shù)點后面的數(shù)b截取字符串, # 當(dāng)截取的字符串長度小于a時,還需要在其左側(cè)補(bǔ)空格 print('string=%7.2s' % string) # output: string= he print('string=%2.7s' % string) # output: string=hello print('string=%10.7s' % string) # output: string= hello 8、還可以用%*.*s來表示精度,兩個*的值分別在后面小括號的前兩位數(shù)值指定 print('string=%*.*s' % (7, 2, string)) # output: string= he %d 1、%d打印時結(jié)果是14 num = 14 print('num=%d' % num) # output: num=14 2、%1d意思是打印結(jié)果為1位整數(shù),當(dāng)整數(shù)的位數(shù)超過1位時,按整數(shù)原值打印,所以%1d的打印結(jié)果還是14 print('num=%1d' % num) # output: num=14 3、%3d意思是打印結(jié)果為3位整數(shù),當(dāng)整數(shù)的位數(shù)不夠3位時,在整數(shù)左側(cè)補(bǔ)空格,所以%3d的打印結(jié)果是 14 print('num=%3d' % num) # output: num= 14 4、%-3d意思是打印結(jié)果為3位整數(shù),當(dāng)整數(shù)的位數(shù)不夠3位時,在整數(shù)右側(cè)補(bǔ)空格,所以%3d的打印結(jié)果是14_ print('num=%-3d' % num) # output: num=14_ 5、%05d意思是打印結(jié)果為5位整數(shù),當(dāng)整數(shù)的位數(shù)不夠5位時,在整數(shù)左側(cè)補(bǔ)0,所以%05d的打印結(jié)果是00014 print('num=%05d' % num) # output: num=00014 6、%.3d小數(shù)點后面的3意思是打印結(jié)果為3位整數(shù), # 當(dāng)整數(shù)的位數(shù)不夠3位時,在整數(shù)左側(cè)補(bǔ)0,所以%.3d的打印結(jié)果是014 print('num=%.3d' % num) # output: num=014 7、 %.0003d小數(shù)點后面的0003和3一樣,都表示3,意思是打印結(jié)果為3位整數(shù), # 當(dāng)整數(shù)的位數(shù)不夠3位時,在整數(shù)左側(cè)補(bǔ)0,所以%.3d的打印結(jié)果還是014 print('num=%.0003d' % num) # output: num=014 8、%5.3d是兩種補(bǔ)齊方式的綜合,當(dāng)整數(shù)的位數(shù)不夠3時,先在左側(cè)補(bǔ)0,還是不夠5位時,再在左側(cè)補(bǔ)空格, 規(guī)則就是補(bǔ)0優(yōu)先,最終的長度選數(shù)值較大的那個,所以%5.3d的打印結(jié)果還是 014 print('num=%5.3d' % num) # output: num= 014 9、%05.3d是兩種補(bǔ)齊方式的綜合,當(dāng)整數(shù)的位數(shù)不夠3時,先在左側(cè)補(bǔ)0,還是不夠5位時, # 由于是05,再在左側(cè)補(bǔ)0,最終的長度選數(shù)值較大的那個,所以%05.3d的打印結(jié)果還是00014 print('num=%05.3d' % num) # output: num=00014 10、還可以用%*.*d來表示精度,兩個*的值分別在后面小括號的前兩位數(shù)值指定 # 如下,不過這種方式04就失去補(bǔ)0的功能,只能補(bǔ)空格,只有小數(shù)點后面的3才能補(bǔ)0 print('num=%*.*d' % (0, 3, num)) # output: num= 014 %f import math %a.bf,a表示浮點數(shù)的打印長度,b表示浮點數(shù)小數(shù)點后面的精度 1、只是%f時表示原值,默認(rèn)是小數(shù)點后5位數(shù) print('PI=%f' % math.pi) # output: PI=3.141593 2、只是%9f時,表示打印長度9位數(shù),小數(shù)點也占一位,不夠左側(cè)補(bǔ)空格 print('PI=%9f' % math.pi) # output: PI=_3.141593 3、只有.沒有后面的數(shù)字時,表示去掉小數(shù)輸出整數(shù),03表示不夠3位數(shù)左側(cè)補(bǔ)0 print('PI=%03.f' % math.pi) # output: PI=003 4、%6.3f表示小數(shù)點后面精確到3位,總長度6位數(shù),包括小數(shù)點,不夠左側(cè)補(bǔ)空格 print('PI=%6.3f' % math.pi) # output: PI=_3.142 5、%-6.3f表示小數(shù)點后面精確到3位,總長度6位數(shù),包括小數(shù)點,不夠右側(cè)補(bǔ)空格 print('PI=%-6.3f' % math.pi) # output: PI=3.142_ 6、 還可以用%*.*f來表示精度,兩個*的值分別在后面小括號的前兩位數(shù)值指定 如下,不過這種方式06就失去補(bǔ)0的功能,只能補(bǔ)空格 print('PI=%*.*f' % (6, 3, math.pi)) # output: PI=_3.142 格式化輸出方法二:{}.formatformat()方法優(yōu)點如下:
先看幾個簡單的例子: f1 = 'i am {0}, i am {1}d years old'.format('Jeck',26) #采用位置參數(shù)來索引 f2 = 'i am {name}, i am {age}d years old'.format(**{'name':'jeck','age':26}) #采用自定義key來縮影,此時**表示將字典的k/v取出 f3 = '--{name:*^10s}-- =={age:<10.2f}=='.format(name='Jeck',age=26.457) #將name的寬度設(shè)置為10,空余的使用*號不全,并居中顯示,age類型設(shè)置為浮點型,寬度為10.并左對齊 f4 = '原數(shù):{:d} 二進(jìn)制:{:b}, 八進(jìn)制:{:o}, 十六進(jìn)制x:{:x},十六進(jìn)制X:{:X}'.format(15, 15, 15, 15, 15) #進(jìn)制轉(zhuǎn)換 f5 = '原數(shù):{:d}, 科學(xué)計數(shù)法e:{:e}, 科學(xué)計數(shù)法E:{:E}' .format(1000000000,1000000000,1000000000) #科學(xué)計數(shù)法表示 f6 = '原數(shù):{:2F}, 百分號表示{:.2%}, 原數(shù):{:d},自動分割表示:{:,}'.format(0.75,0.7584,10000000,10000000 ) #百分號表示及自動分割 支持的種類也非常的多: 知識點講解:順序匹配: hello {}, my name is {}'.format('everyone', 'python') 自定義順序匹配:
'hello {1}, my name is {0}'.format('python', 'everyone') 鍵值匹配: 關(guān)鍵字參數(shù)的位置可以隨意調(diào)換。 'hello {a}, my name is '.format(a='everyone', b='python') 字典方式匹配:在字典前面加上**,并傳入format()函數(shù)實現(xiàn)。 x = {'a':'everyone', 'b':'python'} 'hello {a}, my name is '.format(**x) 對齊方式和填充: format也是小編推薦的格式化方式,將來%也勢必想會被format取代。 實例:1、最簡單的使用方法: print('我叫{},今年{}歲。'.format('小明', 18)) 我叫小明,今年18歲。 花括號個數(shù)可以少于位置參數(shù)的個數(shù) print('我愛吃{}和{}。'.format('香蕉', '蘋果', '大鴨梨')) 我愛吃香蕉和蘋果。 2、數(shù)字形式的簡單字段名 通過數(shù)字形式的簡單字段名傳遞位置參數(shù) print('身高{0},家住{1}。'.format(1.8, '銅鑼灣')) 身高1.8,家住銅鑼灣 數(shù)字形式的簡單字段名可以重復(fù)使用。 print('我愛{0}。\n她今年{1}。\n{0}也愛我。'.format('阿香', 17)) 我愛阿香。 她今年17。 阿香也愛我。 體會把所有位置參數(shù)整體當(dāng)成元組來取值 print('阿香愛吃{1}、{3}和{0}。'.format('榴蓮', '臭豆腐', '皮蛋', '鯡魚罐頭', '螺獅粉')) 阿香愛吃臭豆腐、鯡魚罐頭和榴蓮。 3、變量名形式的簡單字段名 使用變量名形式的簡單字段名傳遞關(guān)鍵字參數(shù) print('我大哥是{name},今年{age}歲。'.format(name='阿飛', age=20)) 我大哥是阿飛,今年20歲。 關(guān)鍵字參數(shù)的順序可以隨意調(diào)換 print('我大哥是{name},今年{age}歲。'.format(age=20, name='阿飛')) 我大哥是阿飛,今年20歲。 4、簡單字段名的混合使用 混合使用數(shù)字形式和變量名形式的字段名,可以同時傳遞位置參數(shù)和關(guān)鍵字參數(shù) print('這是一個關(guān)于{0}、{1}和{girl}的故事。'.format( '小明', '阿飛', girl='阿香')) 這是一個關(guān)于小明、阿飛和阿香的故事。 但是關(guān)鍵字參數(shù)必須位于位置參數(shù)之后 print('這是一個關(guān)于{0}、{1}和{girl}的故事。'.format('小明', girl='阿香' , '阿飛')) SyntaxError: positional argument follows keyword argument 數(shù)字也可以省略 print('這是一個關(guān)于{}、{}和{girl}的故事。'.format('小明', '阿飛', girl='阿香')) 但是省略字段名不能和數(shù)字形式的字段名同時出現(xiàn) # print('這是一個關(guān)于{}、{1}和{girl}的故事。'.format( '小明', '阿飛', girl='阿香')) ValueError: cannot switch from automatic field numbering to manual field specification 5、可以使用 *元組 和 **字典 的形式傳參,兩者可以混合使用。位置參數(shù)、關(guān)鍵字參數(shù)、*元組 和 **字典 也可以同時使用,但是要注意,位置參數(shù)要在關(guān)鍵字參數(shù)前面,*元組 要在 **字典 前面。 使用元組傳參 infos = '鋼鐵俠', 66, '小辣椒' print('我是{},身價{}億。'.format(*infos)) 我是鋼鐵俠,身家66億。 print('我是{2},身價{1}億。'.format(*infos)) 我是小辣椒,身家66億。 使用字典傳參 venom = {'name': '毒液', 'weakness': '火'} print('我是{name},我怕{weakness}。'.format(**venom)) 我是毒液,我怕火。 同時使用元組和字典傳參 hulk = '綠巨人', '拳頭' captain = {'name': '美國隊長', 'weapon': '盾'} print('我是{}, 我怕{weapon}。'.format(*hulk, **captain)) print('我是{name}, 我怕{1}。'.format(*hulk, **captain)) 我是綠巨人, 我怕盾。 我是美國隊長, 我怕拳頭。 同時使用位置參數(shù)、元組、關(guān)鍵字參數(shù)、字典傳參注意:
tup = '鷹眼', dic = {'weapon': '箭'} text = '我是{1},我怕{weakness}。我是{0},我用{weapon}。' text = text.format( *tup, '黑寡婦', weakness='男人', **dic) print(text) 我是黑寡婦,我怕男人。我是鷹眼,我用箭。 6、[] 方括號的使用 傳遞位置參數(shù)
方括號用法:用列表傳遞位置參數(shù) infos = ['阿星', 9527] food = ['霸王花', '爆米花'] print('我叫{0[0]},警號{0[1]},愛吃{1[0]}。'.format(infos, food)) 我叫阿星,警號9527,愛吃霸王花。 方括號用法:用元組傳遞位置參數(shù) food = ('僵尸', '腦子') print('我叫{0[0]},年齡{1},愛吃{0[1]}。'.format(food, 66)) 我叫僵尸,年齡66,愛吃腦子。 方括號用法:用字典傳遞位置參數(shù) dic = dict(name='阿星', pid=9527) print('我是{[name]}!'.format(dic)) 多個替換字段,不能省略數(shù)字 print('我是{0[name]},警號{0[pid]}。'.format(dic)) 我是阿星! 我是阿星,警號9527。 7、填充與對齊方式 各種對齊選項的含義如下: ^、<、>分別是居中、左對齊、右對齊,后面帶寬度 看以下的例子: '{:>8}'.format('189') 輸出:' 189' '{:0>8}'.format('189') 輸出:'00000189' '{:a>8}'.format('189') 輸出:'aaaaa189' 8、正負(fù)號
# 正負(fù)號 print('{:哈=+8.2f}'.format(3.14159)) print('{:哈=+8.2f}'.format(-3.14159)) print('{:哈=+8.2f}'.format(0)) print('{:哈=+8.2f}'.format(-0)) ''' +哈哈哈3.14 -哈哈哈3.14 +哈哈哈0.00 +哈哈哈0.00 ''' 9、分組選項 分組選項 grouping_option 的取值有兩種:
n 類型在本機(jī)無法使用分組選項 ,原因可能是中文沒有數(shù)字分隔符 # n 類型使用本地化的分組選項 , # 此項報錯,我懷疑是因為中文沒有數(shù)字的分隔符 # print('數(shù)字:{0:,n}'.format(6666)) ValueError: Cannot specify ',' with 'n'. # 使用 d 類型確實是可以的 print('數(shù)字:{0:,d}'.format(6666)) 數(shù)字:6,666 下劃線 _:使用下劃線對浮點數(shù)和 d 類型的整數(shù)以千為單位進(jìn)行分隔。對于 b、o、x 和 X 類型,每四位插入一個下劃線,其他類型都會報錯。 # 分組選項 _ 作用于 b 類型 print('數(shù)字:{0:_b}'.format(0b100111011)) 數(shù)字:1_0011_1011 # 分組選項 _ 作用于 o 類型 print('數(shù)字:{0:_o}'.format(0o426754316)) 數(shù)字:4_2675_4316 分組選項 _ 作用于 x 類型 print('數(shù)字:{0:_x}'.format(0x2a846e98d)) 數(shù)字:2_a846_e98d 分組選項 _ 作用于 X 類型 print('數(shù)字:{0:_X}'.format(0X2a846e98d)) 數(shù)字:2_A846_E98D 分組選項 _ 作用于其他類型(比如 n 類型) print('字符串:{0:_n}'.format(1234567)) ValueError: Cannot specify ',' with 'n'. 10、精度
對于非數(shù)字類型,精度指定最大字段寬度 print('{0:.3}'.format('哇哈哈哈哈哈')) 哇哈哈 整數(shù)類型不能指定精度 print('{:.3d}'.format(666)) ValueError: Precision not allowed in integer format specifier 11、整數(shù)類型 b 類型:二進(jìn)制 print('{0:b}'.format(3)) 11 c 類型:把整數(shù)轉(zhuǎn)換成 unicode 字符 print('{:c}'.format(97)) a d 類型:十進(jìn)制整數(shù) print('{:d}'.format(666)) 666 o 類型:八進(jìn)制數(shù) print('{:o}'.format(10)) 12 x 類型:十六進(jìn)制數(shù),a到f小寫 print('{:x}'.format(15)) f X 類型:十六進(jìn)制數(shù),A到F大寫 print('{:X}'.format(15)) F n 類型:與d相同,會插入本地化的分隔符
print('{:n}'.format(66666)) 經(jīng)試驗,本機(jī)無法為 n 指定任何分組選項(,_) # print('{:,n}'.format(66666)) ValueError: Cannot specify ',' with 'n'. print('{:_n}'.format(66666)) ValueError: Cannot specify ',' with 'n'. None 不指定類型,與 d 相同。 浮點數(shù)類型 e 類型:科學(xué)記數(shù)法默認(rèn)精度為 6 位 print('{:e}'.format(1234567.1234567)) 1.234567e+06 E 類型:與 e 相同,用大寫 E 表示指數(shù)默認(rèn)精度為 6 位 print('{:E}'.format(1234567.1234567)) # 修改精度為 10 位 print('{:.10E}'.format(1234567.1234567)) 1.234567E+06 1.2345671235E+06 f 類型,定點記法,默認(rèn)精度為 6。 print('{:f}'.format(1234567.1234567)) 1234567.123457 F 類型,F(xiàn) 定點記法,同 f,但是會把 nan 轉(zhuǎn)換成 NAN,把 inf 轉(zhuǎn)換成 INF nan = float('nan') inf = float('inf') print('{:F}\n{:F}'.format(nan, inf)) NAN INF g 類型,自動轉(zhuǎn)換到 e 或者 f 格式
print('{:g}'.format(1234567.1234567)) print('{:g}'.format(1234.1234)) 1.23457e+06 1234.12 n 類型,n 數(shù)字 number 類型。跟 g 一樣,只不過用本地化的分隔符來分隔數(shù)字。 print('{:n}'.format(1234567.1234567)) print('{:n}'.format(1234.1234)) 1.23457E+06 1234.12 # 經(jīng)試驗,本機(jī)指定分組選項會報錯 print('{:,n}'.format(1234.1234)) ValueError: Cannot specify ',' with 'n'. print('{:_n}'.format(1234.1234)) ValueError: Cannot specify ',' with 'n'. % 類型,% 百分號類型。會將數(shù)字乘以 100,然后以 f 定點 fixed-point 格式顯示,最后加上一個百分號 %。 print('{:%}'.format(1)) 100.000000% None 不指定類型。輸出效果類似調(diào)用 str() 函數(shù)。 |
|