關於使用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!”

更多內容,請關注:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM