DAY 7. 格式化字符串
到目前為止,我所知道的,python格式化字符串有三種方法,第一是早期就有的%,其次是2.5之后的format(),還有就是3.6添加的f字符串調試
7.1 %格式化字符串
%格式化字符串是python最早的,也是能兼容所有版本的一種字符串格式化方法,在一些python早期的庫中,建議使用%格式化方式,他會把字符串中的格式化符按順序后面參數替換,格式是
"xxxxxx %s xxxxxx" % (value1, value2)
- 其中
%s
就是格式化符,意思是把后面的值格式化為字符類型,類似的格式化符還有%d
,%f
等,具體參考文章Python字符串格式化 - 后面的
value1
,value2
就是要格式化的值,不論是字符還是數值,都會被格式化為格式化符對應的類型 - 當然可以不用以元組的形式傳值,你可以直接寫這樣:
"xxxxx %s" % value
,不過不建議這樣寫,一是應為這樣只能傳遞一個參數,二是如果value是元組或列表等類型,這樣會觸發TypeErrer - 如果只傳一個參數,并且很確定參數類型不會觸發異常,可以使用上面的寫法,否則,我建議你提供一個單元素元組,就像
"xxxx %s " % (value,)
value1 = (7, 8)
value2 = [9, 0]
print("DAY %s 格式化字符串 %s " % (value1,value2))
value3 = 1
s = "xxxix %s" % value3 # 不推薦
print(s)
s1 = "xxxx %s " % value1
print(s1) # TypeError: not all arguments converted during string formatting
7.2 format()
%雖然強大,但用起來難免有些麻煩,代碼也不是特別美觀,因此,在python 2.5 之后,提供了更加優雅的str.format()
方法。
def format(self, *args, **kwargs): # known special case of str.format"""S.format(*args, **kwargs) -> strReturn a formatted version of S, using substitutions from args and kwargs.The substitutions are identified by braces ('{' and '}')."""pass
- format()的常用用法
# 使用名稱占位符
s2 = "xxxx {age} xxxx {name}".format(age=18, name="hangman")
print(s2) # xxxx 18 xxxx hangman# 使用序號占位符,為空默認從左到右01234.。。
s3 = "xxxx {1} xxx{0}".format(value1,value2)
print(s3) # xxxx [9, 0] xxx(7, 8)# 也可以混合使用
s4 = "xxxx {} XXX {name} xxx {}".format(value2,value1,name="s4")
print(s4) # xxxx [9, 0] XXX s4 xxx (7, 8)
7.3 f-string
f-string是2015年python 3.6 根據PEP 498新添加的一種字符串格式化方法,f-string實際上是在運行時計算的表達式,而不是常量值。在Python源代碼中,f-string是一個文字字符串,前綴為’f’,其中包含大括號內的表達式。表達式會將大括號中的內容替換為其值。例如
import datetime
name = "zings"
age = 17
date = datetime.date(2019,7,18)
print(f'my name is {name}, this year is {date:%Y},Next year, I\'m {age+1}') # my name is zings, this year is 2019,Next year, I'm 18
7.3.2 格式規范迷你語言
“格式規范”用于格式字符串中包含的替換字段中,以定義各個值的顯示方式
標準格式說明符的一般形式是:
format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= digit+
grouping_option ::= "_" | ","
precision ::= digit+
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
(1) 對齊 align
align(對齊方式) | 作用 |
---|---|
< | 左對齊(字符串默認對齊方式) |
> | 右對齊(數值默認對齊方式) |
= | 填充時強制在正負號與數字之間進行填充,只支持對數字的填充 |
^ | 居中 |
- 除非定義了最小字段寬度,否則字段寬度將始終與填充它的數據大小相同,因此在這種情況下,對齊選項沒有意義。
- 如果指定了align值,則可以在其前面加上可以是任何字符的填充字符,如果省略則默認為空格。 無法使用文字大括號(“{”或“}”)作為格式化字符串文字中的填充字符或使用str.format()方法。 但是,可以插入帶有嵌套替換字段的大括號。
print(f'{name:^18}') # | zings |
(2) sign
sign只對數字起作用
sign | 作用 |
---|---|
+ | 強制對數字使用正負號 |
- | 僅對負數使用前導負號(默認) |
空格 | 對正數使用一個’ ‘作前導,負數仍以’-'為前導 |
print(f'{money:+}') # +19999999877
(3) #選項
'#'選項使“替代形式”用于轉換。 對于不同類型,替代形式的定義不同。 此選項僅對integer,float,complex和Decimal類型有效。 對于整數,當使用二進制,八進制或十六進制輸出時,此選項將前綴“0b”,“0o”或“0x”添加到輸出值。 對于浮點數,復數和十進制,替換形式會導致轉換結果始終包含小數點字符,即使后面沒有數字也是如此。 通常,只有在跟隨數字的情況下,這些轉換的結果中才會出現小數點字符。 此外,對于“g”和“G”轉換,不會從結果中刪除尾隨零。
(4) ,選項
','被用來對數字整數部分進行千分位分隔
描述符 | 作用 |
---|---|
, | 使用,作為千位分隔符 |
_ | 使用_作為千位分隔符 |
,
僅適用于浮點數、復數與十進制整數:對于浮點數和復數,, 只分隔小數點前的數位。_
適用于浮點數、復數與二、八、十、十六進制整數:對于浮點數和復數,_ 只分隔小數點前的數位;對于二、八、十六進制整數,固定從低位到高位每隔四位插入一個 _(十進制整數是每隔三位插入一個 _)。
print(f'{money:,}') # 19,999,999,877
(5) width
width是定義最小字段寬度的十進制整數。 如果未指定,則字段寬度將由內容確定。
當然,format還有很多彪悍的特性,還可以看這位大佬的文章:Python字符串格式化
(6) .precision
.precision對于數字對象,用來指定數字的小數位數,如果有小數;對于非數字對象,用來指定最終返回的格式化字符的最大長度,即格式化完成后,以這個precision參數對結果進行截取
(7) type
[外鏈圖片轉存失敗(img-AtydwvFj-1563463465332)(…/…/image/python_總結_01.png)]
**注意:**格式規范迷你語言對format一樣適用(本來就是format的)
7.4 總結
python最先的格式化字符串方法是%,但他的致命缺點是支持的類型有限,只支持int,str,double,其他所有類型只能轉換為這幾個類型,還有如果傳遞的是元組,那么必須還要傳入一個單值元組,為此,添加了str.format()以解決%-formatting中的一些問題,特別是,它使用普通函數調用語法(并因此支持多個參數),并且可以通過__format __()方法在被轉換為字符串的對象上進行擴展。但str.format()又存在代碼冗余的問題,例如
v = 6*8
print("the value is {}".format(v))
而使用f-string只需要
print(f'the value is{6*8}')
F字符串提供了一種簡潔易讀的方式,可以在字符串中包含Python表達式的值。包括lambda表達式(要放在括號里)
參考文章
PEP 498
python doc
Python字符串格式化
Python格式化字符串f-string概覽
GitHub python 面試題