課時15:字串:格式化

那是個好男孩發表於2018-08-03

目錄:

    一、format()

    二、格式化操作符:%

    三、Python的轉義字元及含義

    四、課時15課後習題及答案

 

***************

一、format()

***************

格式化字串,就是按照統一的規格去輸出一個字串。如果規格不統一,就很有可能造成誤會,例如十六進位制的10跟十進位制的10完全是不同的概念(十六進位制的10等於十進位制16,二進位制10等於十進位制2),字串格式化。正式幫助我們糾正並規範這類問題而存在的。

format()方法接受位置引數和關鍵字引數(位置引數和關鍵字引數在函式章節有詳細的講解),二者均傳遞到一個叫作replacement欄位。而這個replacement欄位在字串內由大括號( { } )表示。

>>> "{0} love {1}.{2}".format("I","FishC","com")
'I love FishC.com'

仔細看,字串中的{0}、{1}和{2}應該跟位置有關,依此被format()的三個引數替換,那麼format()的三個引數就叫作位置引數。那什麼是關鍵字引數呢,再來看一個例子:

>>> "{a} love {b}.{c}".format(a="I",b="FishC",c="com")
'I love FishC.com'

{a}{b}和{c}就相當於三個標籤,format()將引數中等值的字串替換出去,這就是關鍵字引數啦。另外,也可以綜合位置引數和關鍵字引數一起使用:

>>> "{0} love {b}.{c}".format("I",b="FishC",c="com")
'I love FishC.com'

但是要注意的是,如果把位置引數和關鍵字引數一起綜合起來使用,那麼位置引數必須在關鍵字引數之前,否則就會出錯;

>>> "{a} love {b}.{0}".format(a="I",b="FishC","com")
SyntaxError: positional argument follows keyword argument

如果把大括號列印出來,你有辦法嗎?沒錯,這跟字串轉義字元有點像,只需要用一層大括號包起來即可(要列印轉義字元(\),只需要轉義字元轉義本身(\\)):

>>> "{{0}}".format("不列印")
'{0}'

位置引數“不列印”沒有被輸出,這是因為{0}的特殊功能被外層的大括號( { } )剝奪,因此沒有欄位可以輸出。注意,這並不會產生錯誤哦。最後再來看另外一個例子:

>>> "{0}:{1:.2f}".format("圓周率",3.14159)
'圓周率:3.14'

可以看到,位置引數{1}跟平常有些不同,後邊多了一個冒號。在替換域中,冒號表示格式化符號開始,“.2”的意思是四捨五入到保留兩位小數點,而f的意思是浮點數,所以按照格式化的要求列印除了3.14。

 

**************************

二、格式化操作符:%

**************************

 剛才講的是字串的格式化方法,現在來談談字串所獨享的一個操作符:%,有人說,這不是求餘數的操作符嗎?是的,沒錯!當%左右均為數字的時候,那麼它表示求餘數的操作;但當它出現在字串中的時候,它表示的是格式化操作符。下表列舉了Python的格式化符號及含義。

符號    說明
%c    格式化字元及其 ASCII 碼
%s    格式化字串
%d    格式化整數
%o    格式化無符號八進位制數
%x    格式化無符號十六進位制數
%X    格式化無符號十六進位制數(大寫)
%f    格式化浮點數字,可指定小數點後的精度
%e    用科學計數法格式化浮點數
%E    作用同 %e,用科學計數法格式化浮點數
%g    根據值的大小決定使用 %f 或 %e
%G    作用同 %g,根據值的大小決定使用 %f 或者 %E

下面舉幾個例子供參考:

>>> '%c'%97
'a'
>>> '%c%c%c%c%c'%(70,105,115,104,67)
'FishC'
>>> '%d轉換為八進位制是:%o'%(123,123)
'123轉換為八進位制是:173'
>>> '%f用科學計數法表示為:%e'%(149500000,149500000)
'149500000.000000用科學計數法表示為:1.495000e+08'

Python還提供了格式化操作符的輔助指令,如下表所示:

符號    說明
m.n    m 是顯示的最小總寬度,n 是小數點後的位數
-      用於左對齊
+      在正數前面顯示加號(+#      在八進位制數前面顯示 '0o',在十六進位制數前面顯示 '0x' 或 '0X'
0      顯示的數字前面填充 '0' 取代空格

同樣列舉幾個例子:

>>> '%5.1f'%27.658
' 27.7'
>>> '%.2e'%27.658
'2.77e+01'
>>> '%10d'%5
'         5'
>>> '%-10d'%5
'5         '
>>> '%010d'%5
'0000000005'
>>> '%#X'%100
'0X64'

 

**********************************

三、Python的轉義字元及含義

**********************************

 Python的部分轉義字元已經使用一段時間,是時候來給它做個總結了,見下表:

符號    說明
\'    單引號
\"    雙引號
\a    發出系統響鈴聲
\b    退格符
\n    換行符
\t    橫向製表符(TAB)
\v    縱向製表符
\r    回車符
\f    換頁符
\o    八進位制數代表的字元
\x    十六進位制數代表的字元
\0    表示一個空字元
\\    反斜槓

 

*******************************

四、課時15課後習題及答案

*******************************

0. 根據說明填寫相應的字串格式化符號

   符   號       說     明
     %       格式化字元及其ASCII碼
     %       格式化字串
     %       格式化整數
     %       格式化無符號八進位制數
     %       格式化無符號十六進位制數
     %       格式化無符號十六進位制數(大寫)
     %       格式化定點數,可指定小數點後的精度
     %       用科學計數法格式化定點數
     %       根據值的大小決定使用%f或者%e
     %       根據值的大小決定使用%F或者%E

 1. 請問以下這行程式碼會列印什麼內容?

>>> "{{1}}".format("不列印", "列印")

2. 以下程式碼中,a, b, c是什麼引數?

>>> "{a} love {b}.{c}".format(a="I", b="FishC", c="com")

'I love FishC.com'

3. 以下程式碼中,{0}, {1}, {2}是什麼引數?

>>> "{0} love {1}.{2}".format("I", "FishC", "com")
'I love FishC.com'

4. 如果想要顯示Pi = 3.14format前邊的字串應該怎麼填寫呢?

''.format('Pi = ', 3.1415)

 

動動手:

0. 編寫一個進位制轉換程式,程式演示如下(提示,十進位制轉換二進位制可以用bin()這個BIF):

 

 

 

答案:

測試題答案

0. 根據說明填寫相應的字串格式化符號

   符   號       說     明
     %c       格式化字元及其ASCII碼
     %s       格式化字串
     %d       格式化整數
     %o       格式化無符號八進位制數
     %x       格式化無符號十六進位制數
     %X       格式化無符號十六進位制數(大寫)
     %f       格式化定點數,可指定小數點後的精度
     %e       用科學計數法格式化定點數
     %E       作用同%e,用科學計數法格式化定點數
     %g       根據值的大小決定使用%f或者%e
     %G       作用同%g,根據值的大小決定使用%F或者%E

 

1. 請問以下這行程式碼會列印什麼內容?

>>> "{{1}}".format("不列印", "列印")
'{1}'

 

2. 以下程式碼中,a, b, c是什麼引數?

>>> "{a} love {b}.{c}".format(a="I", b="FishC", c="com")
'I love FishC.com'

關鍵字引數

 

3. 以下程式碼中,{0}, {1}, {2}是什麼引數?

>>> "{0} love {1}.{2}".format("I", "FishC", "com")
'I love FishC.com'

位置引數

 

4. 如果想要顯示Pi = 3.14format前邊的字串應該怎麼填寫呢?

>>> '{0}{1:.2f}'.format('Pi = ', 3.1415)
'Pi = 3.14'

 

動動手答案:

0. 編寫一個進位制轉換程式

 1 q = True
 2 while q:
 3     num = input('請輸入一個整數(輸入Q結束程式):')
 4     if num != 'Q':
 5         num = int(num)
 6         print('十進位制 -> 十六進位制 : %d -> 0x%x' % (num, num))
 7         print('十進位制 -> 八進位制 : %d -> 0o%o' % (num, num))
 8         print('十進位制 -> 二進位制 : %d -> ' % num, bin(num))
 9     else:
10         q = False

 

相關文章