官术网_书友最值得收藏!

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ù)值的對齊。

主站蜘蛛池模板: 临沧市| 沙河市| 松桃| 宝丰县| 溧阳市| 谢通门县| 海阳市| 当雄县| 苏尼特右旗| 肃宁县| 伊春市| 延津县| 和政县| 唐海县| 南京市| 隆安县| 吴旗县| 大厂| 都江堰市| 安康市| 崇阳县| 长海县| 阿拉善左旗| 松桃| 剑阁县| 西宁市| 连山| 碌曲县| 上林县| 濮阳市| 斗六市| 新乡县| 林甸县| 开江县| 文水县| 腾冲县| 开化县| 波密县| 夏津县| 静宁县| 张家港市|