Python格式化字符串f-string概覽

簡介

f-string,亦稱為格式化字符串常量(formatted string literals)乱顾,是Python3.6新引入的一種字符串格式化方法,該方法源于PEP 498 -- Literal String Interpolation,主要目的是使格式化字符串的操作更加簡便姥敛。f-string在形式上是以 fF 修飾符引領的字符串(f'xxx'F'xxx')道逗,以大括號 {} 標明被替換的字段兵罢;f-string在本質上并不是字符串常量,而是一個在運行時運算求值的表達式:

While other string literals always have a constant value, formatted strings are really expressions evaluated at run time.
(與具有恒定值的其它字符串常量不同滓窍,格式化字符串實際上是運行時運算求值的表達式卖词。)
—— Python Documentation

f-string在功能方面不遜于傳統(tǒng)的%-formatting語句str.format()函數(shù),同時性能又優(yōu)于二者吏夯,且使用起來也更加簡潔明了此蜈,因此對于Python3.6及以后的版本,推薦使用f-string進行字符串格式化噪生。

用法

此部分內容主要參考以下資料:

簡單使用

f-string用大括號 {} 表示被替換字段裆赵,其中直接填入替換內容:

>>> name = 'Eric'
>>> f'Hello, my name is {name}'
'Hello, my name is Eric'

>>> number = 7
>>> f'My lucky number is {number}'
'My lucky number is 7'

>>> price = 19.99
>>> f'The price of this book is {price}'
'The price of this book is 19.99'

表達式求值與函數(shù)調用

f-string的大括號 {} 可以填入表達式或調用函數(shù),Python會求出其結果并填入返回的字符串內:

>>> f'A total number of {24 * 8 + 4}'
'A total number of 196'

>>> f'Complex number {(2 + 2j) / (2 - 3j)}'
'Complex number (-0.15384615384615388+0.7692307692307692j)'

>>> name = 'ERIC'
>>> f'My name is {name.lower()}'
'My name is eric'

>>> import math
>>> f'The answer is {math.log(math.pi)}'
'The answer is 1.1447298858494002'

引號跺嗽、大括號與反斜杠

f-string大括號內所用的引號不能和大括號外的引號定界符沖突战授,可根據(jù)情況靈活切換 '"

>>> f'I am {"Eric"}'
'I am Eric'
>>> f'I am {'Eric'}'
  File "<stdin>", line 1
    f'I am {'Eric'}'
                ^
SyntaxError: invalid syntax

'" 不足以滿足要求,還可以使用 '''"""

>>> f"He said {"I'm Eric"}"
  File "<stdin>", line 1
    f"He said {"I'm Eric"}"
                ^
SyntaxError: invalid syntax

>>> f'He said {"I'm Eric"}'
  File "<stdin>", line 1
    f'He said {"I'm Eric"}'
                  ^
SyntaxError: invalid syntax

>>> f"""He said {"I'm Eric"}"""
"He said I'm Eric"
>>> f'''He said {"I'm Eric"}'''
"He said I'm Eric"

大括號外的引號還可以使用 \ 轉義桨嫁,但大括號內不能使用 \ 轉義:

>>> f'''He\'ll say {"I'm Eric"}'''
"He'll say I'm Eric"
>>> f'''He'll say {"I\'m Eric"}'''
  File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

f-string大括號外如果需要顯示大括號植兰,則應輸入連續(xù)兩個大括號 {{}}

>>> f'5 {"{stars}"}'
'5 {stars}'
>>> f'{{5}} {"stars"}'
'{5} stars'

上面提到,f-string大括號內不能使用 \ 轉義璃吧,事實上不僅如此楣导,f-string大括號內根本就不允許出現(xiàn) \。如果確實需要 \畜挨,則應首先將包含 \ 的內容用一個變量表示筒繁,再在f-string大括號內填入變量名:

>>> f"newline: {ord('\n')}"
  File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

>>> newline = ord('\n')
>>> f'newline: {newline}'
'newline: 10'

多行f-string

f-string還可用于多行字符串:

>>> name = 'Eric'
>>> age = 27
>>> f"Hello!" \
... f"I'm {name}." \
... f"I'm {age}."
"Hello!I'm Eric.I'm 27."
>>> f"""Hello!
...     I'm {name}.
...     I'm {age}."""
"Hello!\n    I'm Eric.\n    I'm 27."

自定義格式:對齊彬坏、寬度、符號膝晾、補零栓始、精度、進制等

f-string采用 {content:format} 設置字符串格式血当,其中 content 是替換并填入字符串的內容幻赚,可以是變量、表達式或函數(shù)等臊旭,format 是格式描述符落恼。采用默認格式時不必指定 {:format},如上面例子所示只寫 {content} 即可离熏。

關于格式描述符的詳細語法及含義可查閱Python官方文檔佳谦,這里按使用時的先后順序簡要介紹常用格式描述符的含義與作用:

對齊相關格式描述符

格式描述符 含義與作用
< 左對齊(字符串默認對齊方式)
> 右對齊(數(shù)值默認對齊方式)
^ 居中

數(shù)字符號相關格式描述符

格式描述符 含義與作用
+ 負數(shù)前加負號(-),正數(shù)前加正號(+
- 負數(shù)前加負號(-)滋戳,正數(shù)前不加任何符號(默認)
(空格) 負數(shù)前加負號(-)钻蔑,正數(shù)前加一個空格

注:僅適用于數(shù)值類型。

數(shù)字顯示方式相關格式描述符

格式描述符 含義與作用
# 切換數(shù)字顯示方式

注1:僅適用于數(shù)值類型奸鸯。
注2:# 對不同數(shù)值類型的作用效果不同咪笑,詳見下表:

數(shù)值類型 不加#(默認) # 區(qū)別
二進制整數(shù) '1111011' '0b1111011' 開頭是否顯示 0b
八進制整數(shù) '173' '0o173' 開頭是否顯示 0o
十進制整數(shù) '123' '123' 無區(qū)別
十六進制整數(shù)(小寫字母) '7b' '0x7b' 開頭是否顯示 0x
十六進制整數(shù)(大寫字母) '7B' '0X7B' 開頭是否顯示 0X

寬度與精度相關格式描述符

格式描述符 含義與作用
width 整數(shù) width 指定寬度
0width 整數(shù) width 指定寬度,開頭的 0 指定高位用 0 補足寬度
width.precision 整數(shù) width 指定寬度娄涩,整數(shù) precision 指定顯示精度

注1:0width 不可用于復數(shù)類型和非數(shù)值類型窗怒,width.precision 不可用于整數(shù)類型。
注2:width.precision 用于不同格式類型的浮點數(shù)蓄拣、復數(shù)時的含義也不同:用于 f扬虚、Fe球恤、E%precision 指定的是小數(shù)點后的位數(shù)辜昵,用于 gGprecision 指定的是有效數(shù)字位數(shù)(小數(shù)點前位數(shù)+小數(shù)點后位數(shù))。
注3:width.precision 除浮點數(shù)碎捺、復數(shù)外還可用于字符串路鹰,此時 precision 含義是只使用字符串中前 precision 位字符。

示例:

>>> a = 123.456
>>> f'a is {a:8.2f}'
'a is   123.46'
>>> f'a is {a:08.2f}'
'a is 00123.46'
>>> f'a is {a:8.2e}'
'a is 1.23e+02'
>>> f'a is {a:8.2%}'
'a is 12345.60%'
>>> f'a is {a:8.2g}'
'a is  1.2e+02'

>>> s = 'hello'
>>> f's is {s:8s}'
's is hello   '
>>> f's is {s:8.3s}'
's is hel     '

千位分隔符相關格式描述符

格式描述符 含義與作用
, 使用,作為千位分隔符
_ 使用_作為千位分隔符

注1:若不指定 ,_收厨,則f-string不使用任何千位分隔符晋柱,此為默認設置。
注2:, 僅適用于浮點數(shù)诵叁、復數(shù)與十進制整數(shù):對于浮點數(shù)和復數(shù)雁竞,, 只分隔小數(shù)點前的數(shù)位。
注3:_ 適用于浮點數(shù)、復數(shù)與二碑诉、八彪腔、十、十六進制整數(shù):對于浮點數(shù)和復數(shù)进栽,_ 只分隔小數(shù)點前的數(shù)位德挣;對于二、八快毛、十六進制整數(shù)格嗅,固定從低位到高位每隔四位插入一個 _(十進制整數(shù)是每隔三位插入一個 _)。

示例:

>>> a = 1234567890.098765
>>> f'a is {a:f}'
'a is 1234567890.098765'
>>> f'a is {a:,f}'
'a is 1,234,567,890.098765'
>>> f'a is {a:_f}'
'a is 1_234_567_890.098765'

>>> b = 1234567890
>>> f'b is {b:_b}'
'b is 100_1001_1001_0110_0000_0010_1101_0010'
>>> f'b is {b:_o}'
'b is 111_4540_1322'
>>> f'b is {b:_d}'
'b is 1_234_567_890'
>>> f'b is {b:_x}'
'b is 4996_02d2'

格式類型相關格式描述符

基本格式類型

格式描述符 含義與作用 適用變量類型
s 普通字符串格式 字符串
b 二進制整數(shù)格式 整數(shù)
c 字符格式唠帝,按unicode編碼將整數(shù)轉換為對應字符 整數(shù)
d 十進制整數(shù)格式 整數(shù)
o 八進制整數(shù)格式 整數(shù)
x 十六進制整數(shù)格式(小寫字母) 整數(shù)
X 十六進制整數(shù)格式(大寫字母) 整數(shù)
e 科學計數(shù)格式屯掖,以 e 表示 ×10^ 浮點數(shù)、復數(shù)襟衰、整數(shù)(自動轉換為浮點數(shù))
E e 等價贴铜,但以 E 表示 ×10^ 浮點數(shù)、復數(shù)瀑晒、整數(shù)(自動轉換為浮點數(shù))
f 定點數(shù)格式绍坝,默認精度(precision)是6 浮點數(shù)、復數(shù)瑰妄、整數(shù)(自動轉換為浮點數(shù))
F f 等價陷嘴,但將 naninf 換成 NANINF 浮點數(shù)、復數(shù)间坐、整數(shù)(自動轉換為浮點數(shù))
g 通用格式,小數(shù)用 f邑退,大數(shù)用 e 浮點數(shù)竹宋、復數(shù)、整數(shù)(自動轉換為浮點數(shù))
G G 等價地技,但小數(shù)用 F蜈七,大數(shù)用 E 浮點數(shù)、復數(shù)莫矗、整數(shù)(自動轉換為浮點數(shù))
% 百分比格式飒硅,數(shù)字自動乘上100后按 f 格式排版,并加 % 后綴 浮點數(shù)作谚、整數(shù)(自動轉換為浮點數(shù))

常用的特殊格式類型:標準庫 datetime 給定的用于排版時間信息的格式類型三娩,適用于 datedatetimetime 對象

格式描述符 含義 顯示樣例
%a 星期幾(縮寫) 'Sun'
%A 星期幾(全名) 'Sunday'
%w 星期幾(數(shù)字妹懒,0 是周日雀监,6 是周六) '0'
%u 星期幾(數(shù)字,1 是周一,7 是周日) '7'
%d 日(數(shù)字会前,以 0 補足兩位) '07'
%b 月(縮寫) 'Aug'
%B 月(全名) 'August'
%m 月(數(shù)字好乐,以 0 補足兩位) '08'
%y 年(后兩位數(shù)字,以 0 補足兩位) '14'
%Y 年(完整數(shù)字瓦宜,不補零) '2014'
%H 小時(24小時制蔚万,以 0 補足兩位) '23'
%I 小時(12小時制,以 0 補足兩位) '11'
%p 上午/下午 'PM'
%M 分鐘(以 0 補足兩位) '23'
%S 秒鐘(以 0 補足兩位) '56'
%f 微秒(以 0 補足六位) '553777'
%z UTC偏移量(格式是 ±HHMM[SS]临庇,未指定時區(qū)則返回空字符串) '+1030'
%Z 時區(qū)名(未指定時區(qū)則返回空字符串) 'EST'
%j 一年中的第幾天(以 0 補足三位) '195'
%U 一年中的第幾周(以全年首個周日后的星期為第0周反璃,以 0 補足兩位) '27'
%w 一年中的第幾周(以全年首個周一后的星期為第0周,以 0 補足兩位) '28'
%V 一年中的第幾周(以全年首個包含1月4日的星期為第1周苔巨,以 0 補足兩位) '28'

綜合示例

>>> a = 1234
>>> f'a is {a:^#10X}'      # 居中版扩,寬度10位,十六進制整數(shù)(大寫字母)侄泽,顯示0X前綴
'a is   0X4D2   '

>>> b = 1234.5678
>>> f'b is {b:<+10.2f}'    # 左對齊礁芦,寬度10位,顯示正號(+)悼尾,定點數(shù)格式柿扣,2位小數(shù)
'b is +1234.57  '

>>> c = 12345678
>>> f'c is {c:015,d}'      # 高位補零,寬度15位闺魏,十進制整數(shù)未状,使用,作為千分分割位
'c is 000,012,345,678'

>>> d = 0.5 + 2.5j
>>> f'd is {d:30.3e}'      # 寬度30位,科學計數(shù)法析桥,3位小數(shù)
'd is           5.000e-01+2.500e+00j'

>>> import datetime
>>> e = datetime.datetime.today()
>>> f'the time is {e:%Y-%m-%d (%a) %H:%M:%S}'   # datetime時間格式
'the time is 2018-07-14 (Sat) 20:46:02'

lambda表達式

f-string大括號內也可填入lambda表達式司草,但lambda表達式的 : 會被f-string誤認為是表達式與格式描述符之間的分隔符,為避免歧義泡仗,需要將lambda表達式置于括號 () 內:

>>> f'result is {lambda x: x ** 2 + 1 (2)}'
  File "<fstring>", line 1
    (lambda x)
             ^
SyntaxError: unexpected EOF while parsing

>>> f'result is {(lambda x: x ** 2 + 1) (2)}'
'result is 5'
>>> f'result is {(lambda x: x ** 2 + 1) (2):<+7.2f}'
'result is +5.00  '
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末埋虹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娩怎,更是在濱河造成了極大的恐慌搔课,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件截亦,死亡現(xiàn)場離奇詭異爬泥,居然都是意外死亡,警方通過查閱死者的電腦和手機崩瓤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門袍啡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谷遂,你說我怎么就攤上這事葬馋。” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵畴嘶,是天一觀的道長蛋逾。 經常有香客問我,道長窗悯,這世上最難降的妖魔是什么区匣? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮蒋院,結果婚禮上亏钩,老公的妹妹穿的比我還像新娘。我一直安慰自己欺旧,他們只是感情好姑丑,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辞友,像睡著了一般栅哀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上称龙,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天留拾,我揣著相機與錄音,去河邊找鬼鲫尊。 笑死痴柔,一個胖子當著我的面吹牛,可吹牛的內容都是我干的疫向。 我是一名探鬼主播咳蔚,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搔驼!你這毒婦竟也來了屹篓?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匙奴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妄荔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泼菌,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年啦租,在試婚紗的時候發(fā)現(xiàn)自己被綠了哗伯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡篷角,死狀恐怖焊刹,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤虐块,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布俩滥,位于F島的核電站,受9級特大地震影響贺奠,放射性物質發(fā)生泄漏霜旧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一儡率、第九天 我趴在偏房一處隱蔽的房頂上張望挂据。 院中可真熱鬧,春花似錦儿普、人聲如沸崎逃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽个绍。三九已至,卻和暖如春勺像,著一層夾襖步出監(jiān)牢的瞬間障贸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工吟宦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篮洁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓殃姓,卻偏偏與公主長得像袁波,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜗侈,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容