- Python3.5從零開始學(xué)
- 劉宇宙
- 2896字
- 2020-11-28 16:07:04
4.2 字符串格式化
到目前為止,我們對字符串的操作都是停留在賦值、重新賦值、索引、分片和輸出等一些比較基本的操作上,其實(shí)字符串還有更多、更好的操作方式,比如在實(shí)際項(xiàng)目開發(fā)中經(jīng)常使用的字符串格式化操作。
4.2.1 字符串格式化符號
字符串格式化使用操作符百分號(%)實(shí)現(xiàn)。
注意 %也可以用作模運(yùn)(求余)操作符。
例如:
>>> print ('hello, %s' % 'world') hello, world >>> print (’小智今年%s歲了’ % 10) 小智今年10歲了
由上面輸入的內(nèi)容可知,%左邊放置了一個(gè)待格式化的字符串,右邊放置的是希望格式化的值。格式化的值可以是一個(gè)字符串或數(shù)字。
格式化字符串的%s部分稱為轉(zhuǎn)換說明符,標(biāo)記了需要放置轉(zhuǎn)換值的位置,通用術(shù)語為占位符。可以想象成在學(xué)校上自習(xí),我們通常會(huì)放一個(gè)物品在一個(gè)位置上,其他人一看就知道這個(gè)位置被占了,而我們無論什么時(shí)候去自習(xí),直接到自己占好的位置坐下即可。這里可以把%s當(dāng)作我們使用的物品,我們相當(dāng)于后面%右邊的值。
在上面的示例中,s表示百分號右邊的值會(huì)被格式化為字符串,s指的是str。如果不是字符串,就會(huì)使用str將其轉(zhuǎn)換為字符串。示例中就將10轉(zhuǎn)換為字符串了,這種方式對大多數(shù)數(shù)值都有效。
這里提供了字符串格式化的方式,但若需要轉(zhuǎn)換為其他格式,該怎么辦呢?Python為我們提供了表4-2所示的格式化符號。
表4-2 字符串格式化符號

根據(jù)表4-2,前面的示例可以使用以下兩種方式:
>>>print (’小智今年%s歲了’% 10) #使用%s作為10的占位符 小智今年10歲了 >>>print (’小智今年%d歲了’% 10) #使用%d作為10的占位符 小智今年10歲了
由操作結(jié)果看到,整數(shù)既可以使用%s也可以使用%d進(jìn)行格式化。
如果要格式化實(shí)數(shù)(浮點(diǎn)數(shù)),就可以使用%f進(jìn)行格式化,例如:
>>> print (’圓周率PI的值為:%f' % 3.14) 圓周率PI的值為:3.140000
輸出結(jié)果中有很多位小數(shù),但傳入的值只有兩位小數(shù),要解決這個(gè)問題可以使用格式化符號。
從表4-2可知,%f可指定精度值。在Python中,使用%f時(shí),若不指定精度,則默認(rèn)輸出6位小數(shù)。
以指定2位小數(shù)為例,指定精度的格式如下:
%.2f
指定精度的格式為一個(gè)英文格式下的句點(diǎn)加上希望保留的小數(shù)位數(shù)。因?yàn)楦袷交f明符以表示類型的字符結(jié)束,所以精度應(yīng)該放在類型字符前面。
使用這個(gè)格式更改上面圓周率輸出的示例:
>>> print (’圓周率PI的值為:%.2f' % 3.14) 圓周率PI的值為:3.14
輸出結(jié)果正是我們希望得到的。
表4-2中的符號不是所有都常用,比較常用的有%s、%d、%f三個(gè),%e和%E在科學(xué)計(jì)算中使用比較多,其他符號了解就可以,有興趣也可以自行研究。
假如我們要輸出類似1.23%這樣的結(jié)果,直接使用加號加一個(gè)百分號可以嗎?嘗試如下:
>>> print (’小智的識別能力比去年提高了:%.2f' % 1.23+'%') 小智的識別能力比去年提高了:1.23%
輸出結(jié)果得到了我們想要的,說明這種方式可以。不過輸入的代碼看起來怪怪的,有沒有更好的辦法呢?例如:
>>> print (’小智的識別能力比去年提高了:%.2f%%' % 1.23) 小智的識別能力比去年提高了:1.23%
用這種方式也得到了我們想要的結(jié)果。不過我們在f字符后面使用了兩個(gè)%,結(jié)果只輸出了一個(gè),這是怎么回事?
在Python中,字符串中的百分號是轉(zhuǎn)換說明符,如果要輸出%,就需要格式化字符%,從而需要使用%%。使用這種方式操作的功能類似:
>>> print (’輸出百分號:%s' % '%') 輸出百分號:%
4.2.2 字符串格式化元組
格式化操作符的右操作數(shù)可以是任何元素。如果是元組或映射類型(如字典,下一章進(jìn)行講解),那么字符串格式化將會(huì)有所不同。我們尚未涉及映射(字典),這里先了解一下元組。
如果右操作數(shù)是元組,其中每一個(gè)元素都會(huì)被單獨(dú)格式化,每個(gè)值都需要一個(gè)對應(yīng)的轉(zhuǎn)換說明符。例如:
>>> print (’今年是%s年,中國女排奪得本屆奧運(yùn)會(huì)%s,中國共獲得%d枚金牌’%('2016', ’冠軍’,26)) 今年是2016年,中國女排奪得本屆奧運(yùn)會(huì)冠軍,中國共獲得26枚金牌 >>> print (’今年是%s年,中國女排奪得本屆奧運(yùn)會(huì)%s,中國共獲得%d枚金牌’ % '2016', ’冠軍’,26) Traceback (most recent call last): File "<pyshell#149>", line 1, in <module> print (’今年是%s年,中國女排奪得本屆奧運(yùn)會(huì)%s,中國共獲得%d枚金牌’ % '2016', ’冠軍’,26) TypeError: not enough arguments for format string
由以上輸出結(jié)果看到,在有多個(gè)占位符的字符串中,可以使用元組傳入多個(gè)格式化值。如果需要轉(zhuǎn)換的元組作為轉(zhuǎn)換表達(dá)式的一部分存在,就必須將它用圓括號括起來,否則會(huì)出錯(cuò)。
注意 如果使用列表或其他序列代替元組,序列就會(huì)被解釋為一個(gè)值。只有元組和字典可以格式化一個(gè)以上的值。
下面介紹基本轉(zhuǎn)換說明符。注意,這些項(xiàng)的順序是至關(guān)重要的。
(1)%字符:標(biāo)記轉(zhuǎn)換說明符開始。
(2)轉(zhuǎn)換標(biāo)志(可選):-表示對齊;+表示在轉(zhuǎn)換值之前要加上正負(fù)號;“”(空白字符)表示正數(shù)之前保留空格;0表示轉(zhuǎn)換值位數(shù)不夠時(shí)用0填充。
(3)最小字段寬度(可選):轉(zhuǎn)換后的字符串至少應(yīng)該具有該值指定的寬度。如果是*,寬度就會(huì)從值元組中讀出。
(4)點(diǎn)(.)后跟精度值(可選):如果轉(zhuǎn)換的是實(shí)數(shù),精度值表示出現(xiàn)在小數(shù)點(diǎn)后的位數(shù);如果轉(zhuǎn)換的是字符串,該數(shù)字就表示最大字段寬度;如果是*,精度就會(huì)從元組中讀出。
(5)轉(zhuǎn)換類型:參見表4-2。
下面將詳細(xì)討論上述5個(gè)注意項(xiàng)。
1.簡單轉(zhuǎn)換
例如,輸入以下代碼:
>>> print (’圓周率PI的值為:%.2f' % 3.14) 圓周率PI的值為:3.14 >>> print (’石油價(jià)格為每桶:$%d' % 96) 石油價(jià)格為每桶:$96
由上面的輸出結(jié)果可以看到,簡單轉(zhuǎn)換只需要寫出轉(zhuǎn)換類型,使用起來很簡單。
2.字段寬度和精度
轉(zhuǎn)換說明符包括字段寬度和精度。字段寬度是轉(zhuǎn)換后的值所保留的最小字符個(gè)數(shù),精度是數(shù)字轉(zhuǎn)換結(jié)果中應(yīng)該包含的小數(shù)位數(shù)或字符串轉(zhuǎn)換后的值所能包含的最大字符個(gè)數(shù)。
例如:
>>> print (’圓周率PI的值為:%10f' % 3.141593) #字段寬度為10 圓周率PI的值為: 3.141593 #字符串寬度為10,被字符串占據(jù)8個(gè)空格,剩余兩個(gè)空格 >>>print (’保留2位小數(shù),圓周率PI的值為:%10.2f'% 3.141593) #字段寬度為10 保留2位小數(shù),圓周率PI的值為: 3.14 #字符串寬度為10,字符串占據(jù)4個(gè),剩6個(gè) >>> print (’保留2位小數(shù),圓周率PI的值為:%.2f' % 3.141593) 保留2位小數(shù),圓周率PI的值為:3.14 #輸出,沒有字段寬度參數(shù) >>>print (’字符串精度獲取:%.5s'% ('hello world')) #打印字符串前5個(gè)字符 字符串精度獲取:hello
由輸出結(jié)果可知,字段寬度和精度都是整數(shù),并通過點(diǎn)號(.)分隔。兩個(gè)都是可選參數(shù),如果給出精度,就必須包含點(diǎn)號。
再看以下代碼:
>>> print (’從元組中獲取字符串精度:%*.*s' % (10,5, 'hello world')) 從元組中獲取字符串精度: hello #輸出字符串寬度為10、精度為5 >>> print (’從元組中獲取字符串精度:%.*s' % (5, 'hello world')) 從元組中獲取字符串精度:hello #輸出精度為5
由輸出結(jié)果看到,可以使用*(星號)作為字段寬度或精度(或兩者都用*),數(shù)值會(huì)從元組中讀出。
3. 符號、對齊和0填充
開始介紹之前先看一個(gè)示例:
>>> print (’圓周率PI的值為:%010.2f' % 3.141593) 圓周率PI的值為:0000003.14
輸出結(jié)果是不是怪怪的,這個(gè)我們稱之為“標(biāo)表”。在字段寬度和精度之前可以放置一個(gè)“標(biāo)表”,可以是零、加號、減號或空格。零表示用0進(jìn)行填充。
減號(-)用來左對齊數(shù)值,例如:
>>> print (’圓周率PI的值為:%10.2f' % 3.14) 圓周率PI的值為: 3.14 >>> print (’圓周率PI的值為:%-10.2f' % 3.14) 圓周率PI的值為:3.14 #此處右側(cè)為多出的空格
從輸出結(jié)果看到,使用減號時(shí),數(shù)字右側(cè)多出了額外的空格。
空白(“”)表示在正數(shù)前加上空格,例如:
>>> print(('% 5d' % 10)+'\n'+('% 5d' % -10)) 10 -10
由輸出結(jié)果可以看到,該操作可以用于對齊正負(fù)數(shù)。
加號(+)表示無論是正數(shù)還是負(fù)數(shù)都表示出符號,例如:
>>> print((’寬度前加加號:%+5d'%10)+'\n'+(’寬度前加加號:%+5d'%-10)) 寬度前加加號: +10 寬度前加加號: -10
該操作也可以用于數(shù)值的對齊。
- JavaScript前端開發(fā)模塊化教程
- Vue.js 3.x從入門到精通(視頻教學(xué)版)
- 算法基礎(chǔ):打開程序設(shè)計(jì)之門
- Git高手之路
- jQuery從入門到精通 (軟件開發(fā)視頻大講堂)
- Oracle BAM 11gR1 Handbook
- 飛槳PaddlePaddle深度學(xué)習(xí)實(shí)戰(zhàn)
- Hands-On Full Stack Development with Spring Boot 2.0 and React
- Raspberry Pi Robotic Blueprints
- 超簡單:用Python讓Excel飛起來(實(shí)戰(zhàn)150例)
- Xamarin Cross-Platform Development Cookbook
- SAP Web Dynpro for ABAP開發(fā)技術(shù)詳解:基礎(chǔ)應(yīng)用
- Python Automation Cookbook
- 菜鳥成長之路
- Django 3 Web Development Cookbook