從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!”
更多內容,請關注: