1. 程式人生 > >關於使用format()方法格式化字串,讀這一篇就夠了!

關於使用format()方法格式化字串,讀這一篇就夠了!

從Python 2.6開始,又出現了另外一種格式化字串的方法——format()方法。format()方法是字串眾多方法中的一個,呼叫這個方法時要使用點操作符(.),該方法返回一個格式化好的字串。其呼叫格式如下:

 

s.format(……)

 

其中,s是一個待格式化的字串,裡面包含若干組格式說明符(format specifiers),每組格式說明符都放在一對花括號({})之中。格式化之後,花括號連同其中的格式說明符都會被格式好的物件所取代,每組格式說明符都對應一個待格式化的物件。我們要把待格式化的物件以引數的形式傳給format函式,待格式化的物件可以有很多個,你可以把它們逐個傳遞給format函式,也可以先把它們放入元組、列表或者字典再傳給format函式。

 

>>> 'I am {},and I am {} years old.'.format('Jack',18)

'I am Jack,and I am 18 years old.'

 

上例中,'I am {},and I am {} years old.'是待格式化的字串,其中包含兩個花括號({}),依次對應於兩個待格式化的物件('Jack'和18)。格式化之後,這兩個花括號就會被格式化好的物件替換掉。需要強調的是,如果花括號中是空的,那花括號的順序和待格式化的物件的順序就是一致的,它們之間是一一對應的關係,即左側第一個花括號對應第一個引數,第二個花括號對應第二個引數,以此類推。並且,由於花括號({})最終全部要被替換,所以花括號的個數應該小於或等於待格式化物件的個數,否則就會引發索引錯誤。

 

# {}個數(3個)大於待格式化物件的個數(2個)

>>> 'I am {},and I am {} years old.I love {}'.format('Jack',18)

Traceback (most recent call last):

  File "<pyshell#21>", line 1, in <module>

    'I am {},and I am {} years old.I love {}'.format('Jack',18)

IndexError: tuple index out of range

 

此外,我們還可以主動為花括號進行編號。在待格式化的字串中,從左到右依次為{0}、{1}、{2}……其中,{0}對應第一個引數、{1}對應第二個引數、{2}對應第三個引數……在對花括號進行了編號之後,我們就可以靈活地調整它們的位置了。

 

>>> 'I am {2} years old.I am {1} and I love {0}'.format('Python','Jack',18)

'I am 18 years old.I am Jack and I love Python'

 

上例中,{0}對應'Python'、{1}對應'Jack'、{2}對應18。如前所述,當待格式化的物件有多個時,我們既可以像上面這樣把它們以引數的形式傳遞給format函式,也可以先把它們放入一個元組或列表中,再把整個元組或列表傳遞給format函式。

 

>>> tu = ('Python','Jack',18)

# {0}對應tu[0],即'Python'

# {1}對應tu[1],即'Jack'

# {2}對應tu[2],即18

# *把元組解包成位置引數

>>> 'I am {2} years old.I am {1} and I love {0}'.format(*tu)

'I am 18 years old.I am Jack and I love Python'

 

# 使用位置編號和索引從元組獲取元素

>>> 'I am {0[2]} years old.I am {0[1]} and I love {0[0]}'.format(tu)

'I am 18 years old.I am Jack and I love Python'

 

# 把整個元組視為一個物件

>>> 'I love {}'.format(tu)

 

請注意,在把元組tu傳遞給format函式時,我們通常會在元組前面加上*號,這表示把元組解包成位置引數,即對元組tu中的各個元素進行格式化。當然,我們也可以不使用*,通過位置編號和索引來獲取元組中的各個元素。如果你既沒有使用*號,也沒有使用位置編號和索引從元組中獲取元素,那整個元組會被視作一個物件,且只與前面一個{}相對應。

 

當然,我們也可以先把待格式化的物件放入一個列表中,然後再把整個列表傳遞給format函式,傳遞列表時也要在前面加上*,把列表解包成位置引數。

 

>>> li = ['Python','Jack',18]

# {0}對應li[0],即'Python'

# {1}對應li[1],即'Jack'

# {2}對應li[2],即18

# *把列表解包成位置引數

>>> 'I am {2} years old.I am {1} and I love {0}'.format(*li)

'I am 18 years old.I am Jack and I love Python'

 

此外,我們還可以使用位置編號和索引從列表中獲取元素,如下:

>>> 'I am {0[2]} years old.I am {0[1]} and I love {0[0]}'.format(li)

'I am 18 years old.I am Jack and I love Python'

 

與元組一樣,如果你既沒有使用*號,也沒有使用位置編號和索引來獲取列表中的元素,那整個列表都會被視作一個物件,且只與前面一個{}相對應。

 

>>> li

['Python', 'Jack', 18]

# 把整個列表視為一個物件

>>> 'I love {}'.format(li)

"I love ['Python', 'Jack', 18]"

 

此外,我們還可以把多個待格式化的值放入到一個字典中,然後再把字典作為引數傳給format函式。傳遞字典時,我們要在前面新增兩個**號,這表示把字典解包成關鍵字引數,並在{}中使用字典的鍵來引用字典中的值。

 

# **表示把字典解包成關鍵字引數

>>> dic = {'name': 'Jack', 'age': 18, 'favorite': 'Python'}

>>> 'I am {age} years old.I am {name} and I love {favorite}'.format(**dic)

'I am 18 years old.I am Jack and I love Python'

 

當然,我們也可以不使用**,而結合使用位置編號和字典的鍵來獲取字典中的值,如下:

>>> dic = {'name': 'Jack', 'age': 18, 'favorite': 'Python'}

# 請注意:在使用字典的鍵獲取值時,請不要在鍵上加引號。

# 這一點與從普通字典獲取值的方法有所不同

>>> 'I am {0[age]} years old.I am {0[name]} and I love {0[favorite]}'.format(dic)

'I am 18 years old.I am Jack and I love Python'

 

上例中,我們是先建立好了字典,再把字典傳遞給format函式。其實,我們可以不建立字典,而直接把字典中的鍵與值傳遞給format函式,但此時鍵與值之間不再使用冒號(:),而要使用賦值號(=),形成所謂的“關鍵字引數”。

 

# 使用關鍵字引數

>>> 'I am {age} years old.I am {name} and I love {favorite}'\

    .format(name = 'Jack',age = 18,favorite = 'Python')

'I am 18 years old.I am Jack and I love Python'

 


 

“人生苦膽,要學Python!”

更多內容,請關注:


 

那麼,花括號中都可以有些什麼呢?整理如下:

 

 

請注意:使用中括號([])括起來的部分是可選的,你可以根據具體情況自行決定是否使用。

 

-          No或Key:編號或字典鍵,用來指定花括號與哪個待格式化的物件對應。該部分可省略,省略表示從左到右從0開始編號。

-          顯式轉換標誌(Explicit Conversion Flag,可選):在對待格式化物件進行格式化之前先做一下轉換。目前只有如下兩種轉換標誌可用:

  •  !r:使用repr()把待格式化的物件轉換為字串
  •  !s:使用str()把待格式化的物件轉換為字串

 

接下來,從冒號開始是格式化說明符部分,格式化說明符可以省略。若不指定格式說明符,則預設使用標準格式說明符。如果指定了格式化說明符,則前面的冒號一定不能省略。

-          填充(fill):指定空白處的填充字元,只能是單個字元。若不指定,則預設使用空格填充。

-          對齊方式(align):指定被格式化物件在字串中的對齊方式。可使用的對齊方式有:

  • <:內容左對齊,這是字串的預設對齊方式。若未指定填充字元,則空白處使用空格填充。
  • >:內容右對齊,這是數字的預設對齊方式。若未指定填充字元,則空白處使用空格填充。
  • =:內容右對齊,且只對數字型別有效。若有符號,將其放在填充字元左側,形成“符號+填充字元+數字”的格式,比如-000000120。
  •  ^:內容居中對齊。空白處按fill指定的字元進行填充。若未指定填充字元,則空白處使用空格填充。

 

請注意,fill、align與minimum width(最小寬度)有密切關係。若不指定最小寬度,則預設使用填充資料的寬度,此時fill和align就不再有意義。若最小寬度大於填充資料寬度,並指定了填充字元,則後面必須指定align,否則會報錯。

 

-        符號(sign):sign只對數字型別有效,有如下三種取值:

  • +:顯示數字的正負號。
  • -:只顯示數字的負號(正號不顯示,這是預設行為)。
  • 空格:正數前加空格,負數前加負號

-          #:輸出二進位制、八進位制、十六進位制整數時,新增字首0b、0o、0x。

-          0:這個0位於最小寬度前,表示空白處填充0,相當於把fill設定為0且使用=對齊方式。

-          最小寬度(minimum width):這是一個十進位制整數,用來指定格式化欄位寬度(以字元計)。若不指定最小寬度或指定寬度小於或等於被格式化資料的寬度,則使用被格式化資料的寬度。

-          分組符號(grouping_option):為數字新增千位分隔符,可以使用,或_。

-          精度(precision):精度是一個十進位制數字,指定精度時,前面一定要加上點號。若被格式化的資料為浮點數,精度用來指定要保留的小數位數;若被格式化的資料為字串,精度用來指定保留多少個字元,當精度值等於或大於字串長度時,顯示整個字串。

-          格式化型別(type):格式化型別用來指定資料的格式化方式,具體分為如下幾種情況:

1)         當待格式化的資料為字串時,使用s格式化型別,此時s可以省略。

2)         當待格式化的資料為整數時,可以使用的格式化型別有:

      • b:把十進位制整數轉換成二進位制數然後格式化
      • c:把十進位制整數視作Unicode碼,轉換成相應的Unicode字元,再做格式化
      • d:十進位制整數
      •  o:把十進位制整數轉換成八進位制數然後格式化
      • x:把十進位制整數轉換成十六進位制數然後格式化(9以上的數字為小寫)
      • X:把十進位制整數轉換成十六進位制數然後格式化(9以上的數字為大寫)
      • n:等同於d,但它使用當前區域設定插入合適的數字分隔字元
      • 省略:等同於d

3)         當待格式化的資料為浮點數時,可以使用的格式化型別有:

      • e:使用科學計數法(小e)表示浮點數,然後再格式化。
      • E:使用科學計數法(大E)表示浮點數,然後再格式化。
      •  f:先轉換成浮點數(預設保留6位),再做格式化
      • F:先轉換成浮點數(預設保留6位),再做格式化
      • g:根據數字大小,自動在f和e之間進行切換
      • G:根據數字大小,自動在f和E之間進行切換
      • n:數字,功能與g相同。但但它使用當前區域設定插入合適的數字分隔字元
      • %:顯示百分比。預設顯示小數點後六位
      • 省略:等同於g,但至少列印小數點後一位數

 

下面舉一些例子:

# 未指定填充字元,則使用空格填充

# 20為最小寬度

>>> 'I love {:20}'.format('Python')

'I love Python              '

 

# 使用星號填充,並把字串居中對齊

>>> 'I love {:*^20}'.format('Python')

'I love *******Python*******'

 

>>> '{:*<20}'.format(-52)

'-52*****************'

>>> '{:*=20}'.format(-52)

'-*****************52' 

 

>>> '{:*<20}'.format(52)

'52******************'

 

# <和20之間有空格

>>> '{:*< 20}'.format(52)

' 52*****************' # 52前面有個空格

 

# <和20之間有空格

>>> '{:*< 20}'.format(-52)

'-52*****************'

 

# +表示顯示正負號

# #表示顯示二進位制、八進位制、十六進位制字首

# 第一個0表示用0填充

#10表示最小寬度

# x表示把55轉換為十六進位制數

>>> '{:+#010x}'.format(55)

'+0x0000037'

 

# 10是最小寬度

# .3是數字精度

>>> '{:10.3f}'.format(3.1415926)

'     3.142'

 

# .3表示保留3個字元

>>> '{:10.3s}'.format('Python')

'Pyt       '

 

# 顯示百分比

>>> '{:10.3%}'.format(3.1415926)

'  314.159%'

 

最後,提醒大家注意的是,{}可以巢狀使用,例如:

# {1}用來獲取第二個引數3,用作數字精度

>>> 'pi = {0:.{1}f}'.format(3.1415926,3)

'pi = 3.142'

 

到此為止,關於使用format函式格式化字串的內容就全部講完了。相比於使用%格式化字串,使用format函式格式化字串更靈活、更強大,但也更復雜。對於簡單的字串格式化,我們完全可以使用%來做,但對於一些較為複雜的字串格式化任務,毫無疑問,使用format會更合適一些。


 

“人生苦膽,要學Python!”

更多內容,請關注: