在 Python 中,咱們可使用 +
來鏈接字符串,在簡單狀況下這種方式可以很好的工做。可是當咱們須要進行復雜的字符串鏈接時,若是依然使用 +
來完成,不只會使代碼變得晦澀難懂,還會讓代碼變得難以維護,此時這種方式就顯得力不從心了。javascript
例如,咱們想打印這樣一條記錄:java
User:John has completed Action:payment at Time:13:30:00複製代碼
若是使用加號實現,會是下面這種形式:python
print "User:" + user_name + " has completed Action:" + \
action_name + " at Time:" + current_time複製代碼
若是之後回過頭來閱讀這段代碼,咱們很難直觀看出它的輸出格式,且修改起來也相對麻煩。spa
咱們能夠換用 %
來實現:code
print "User:%s has completed Action:%s at Time:%s" % \
(user_name, action_name, current_time)複製代碼
這回代碼變得清晰簡潔多了。orm
不過,Python 爲咱們提供了另外一種簡潔優雅的實現方式,也是官方更加推薦的方式:使用 str.format()
來實現字符串的格式化:索引
print "User:{} has completed Action:{} at Time:{}".format(
user_name, action_name, current_time)複製代碼
str.format
既可以用於簡單的場景,也可以勝任複雜的字符串替換,而無需繁瑣的字符串鏈接操做。Python 的內置類型 str
和 unicode
均支持使用 str.format()
來格式化字符串。ip
咱們接下來就詳細地討論 str.format()
的具體用法。ci
格式化字符串使用花括號 {}
來包圍替換字段,也就是待替換的字符串。而未被花括號包圍的字符會原封不動地出如今結果中。unicode
如下兩種寫法是等價的:
"Hello, {} and {}!".format("John", "Mary")
"Hello, {0} and {1}!".format("John", "Mary")複製代碼
花括號內部能夠寫上目標字符串的索引,也能夠省略。若是省略,則按 format
括號裏的目標字符串順序依次替換。
除了經過位置來指定目標字符串,咱們還能夠經過關鍵字來指定它。
例如:
"Hello, {boy} and {girl}!".format(boy="John", girl="Mary")複製代碼
使用關鍵字索引的好處是,咱們無需關心參數的位置,且字符串的最終結果可以一目瞭然。在之後的代碼維護中,咱們可以快速地修改對應的參數,而不用對照字符串挨個去尋找相應的參數。
注意:若是字符串自己含有花括號,則須要將其重複兩次來轉義。例如,字符串自己含有 {
,爲了讓 Python 知道這是一個普通字符,而不是用於包圍替換字段的花括號,咱們只需將它改寫成 {{
便可。
str.format
很是強大,足以完成平常工做中遇到的格式化輸出。熟練掌握該方法,可以爲之後的字符串處理打好基礎,還能節省很多時間。
在使用 str.format
來格式化字符串時,咱們一般將目標字符串做爲參數傳遞給 format
方法。實際上,咱們還能夠在格式化字符串中訪問參數的某個屬性或某個元素:
"My car is {0.color}.".format(black_car)
"The first student is {student[0]}.".format(student=stu_list)
"John is {d[john]} years old.".format(d=age_dict)複製代碼
參數的字符串輸出,默認是由其自身的 __format__
方法來實現的。也就是說,Python 使用參數的 __format__
輸出來取代替換字段。若是咱們想調用 str()
或 repr()
來轉換參數,能夠經過添加 轉換標誌 來實現:
# call str() on argument
"It's a {0!s}."
#call repr() on argument
"We can get info from {name!r}."複製代碼
格式化字符串的通常形式以下:
"... {field_name!conversion:format_spec} ..."複製代碼
從上面的代碼能夠看到,格式化字符串可分爲 field_name、conversion、format_spec 三部分,分別對應替換字段名稱(索引)、轉換標誌、格式描述。其中,字段名稱是必選的,然後二者是可選的。轉換標誌緊跟在英文感嘆號後面,而格式描述緊跟在英文冒號後面。
前面已經提到過,字段名稱既但是位置索引,也但是關鍵字索引。字段名稱後面能夠經過點來訪問屬性,或經過方括號來訪問元素。
在這裏,咱們重點看一下格式描述(format_spec)這一項。
格式描述中含有6個選項,分別是 fill、align、sign、width、precision、type。
它們的位置關係以下:
[[fill]align][sign][#][0][width][,][.precision][type]複製代碼
fill
能夠是任意字符,默認爲空格。
align
僅當指定最小寬度時有效。
<
左對齊(默認選項)>
右對齊=
僅對數字有效;將填充字符放到符號與數字間,例如 +0001234
^
居中對齊sign
僅對數字有效
+
全部數字均帶有符號-
僅負數帶有符號(默認選項)
即空格;正數前面帶空格,負數前面帶符號'#'
只對整數有效
自動在二進制、八進制、十六進制數值前添加對應的 0b
、0o
、 0x
。
','
自動在每三個數字之間添加 ,
分隔符。
width
十進制數字,定義最小寬度。若是未指定,則由內容的寬度來決定。
若是沒有指定對齊方式(align),那麼能夠在 width
前面添加一個0來實現自動填充0,等價於 fill
設爲 0
而且 align
設爲 =
。
precision
用於肯定浮點數的精度,或字符串的最大長度。不可用於整型數值。
type
肯定參數類型,默認爲 s
,即字符串。
整數輸出類型:
十進制浮點數輸出類型:
precision
爲6precision
爲6precision
p >= 1,取數值的p位有效數字,並以定點或科學計數法輸出(默認選項)