Python字符串格式化:f-strings
目 錄
一、字符串格式化方法概覽
方法 1 %
方法 2 format
方法 3 f-strings
二、f-strings 常用格式化方法
1、簡單使用
2、表達式求值
3、調(diào)用函數(shù)
4、lambda表達式
5、多行代碼f-string
6、引號、大括號與反斜杠
7、格式限定符
1)填充與對齊
2)數(shù)字符號
3)數(shù)字顯示格式
3)寬度與精度
4)千位分隔符
5)格式類型
6)時間格式
格式化字符串文字,也稱為 f-strings,是一種非常實用的字符串插值方法。它使用大括號作為變量占位符,使操作和豐富字符串變得容易。使用字符串插值,使得 print 語句的功能強大了很多。
f-string,亦稱為格式化字符串常量(formatted string literals),是Python3.6新引入的一種字符串格式化方法,該方法源于PEP 498 – Literal String Interpolation,主要目的是使格式化字符串的操作更加簡便。f-string在形式上是以 f 或 F 修飾符引領的字符串(f'xxx'或 F'xxx'),以大括號 {} 標明被替換的字段;f-string在本質(zhì)上并不是字符串常量,而是一個在運行時運算求值的表達式:
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進行字符串格式化。
Python中常見的格式化的方法主要有三種,本文講解目前最常用的f-strings格式化方式,后期講進行對比講解。
一、字符串格式化方法概覽
方法 1 %
過去的格式化方法,代碼中還能經(jīng)常見到,在 python 2.6 之前,利用 百分號 % 表示占位符,進行格式化
name='小伍哥''Hello,%s'%nameHello,小伍哥
方法 2 format
現(xiàn)階段使用最多的方法,Python2.6 引入,它通過 {} 和 : 來代替%表示占位符,性能比 % 更強大,字符串的 format 方法
name='小伍哥''Hello,{}'.format(name)'Hello,小伍哥'
方法 3 f-strings
推薦使用的方法,為了進一步簡化格式化方法,Eric Smith 在2015年提交了 PEP 498 -- Literal String Interpolation 提案。Python 3.6 引入了新的字符串格式化方式 f-strings,字符串開頭加上一個字母 f ,與其它格式化方式相比,不僅簡潔明了,可讀性更好,更不容易出錯,而且運行效率也更高
name='小伍哥'f'Hello,{name}''Hello,小伍哥'
二、f-strings 常用格式化方法
1、簡單使用
f-string用大括號 {} 表示被替換字段,其中直接填入替換內(nèi)容:
name = 'Eric'f'Hello, my name is {name}''Hello, my name is Eric'number = 8f'My lucky number is {number}''My lucky number is 8'#保留4位小數(shù)點price = 19.99f'The price of this book is {price:.4f}''The price of this book is 19.9900'
2、表達式求值
f-string的大括號 {} 可以填入表達式,Python會求出其結(jié)果并填入返回的字符串內(nèi)
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)'
3、調(diào)用函數(shù)
f-string的大括號 {} 可以調(diào)用函數(shù),并返回函數(shù)的結(jié)果。
#調(diào)用內(nèi)置的函數(shù),大小寫轉(zhuǎn)換
name = 'ERIC'f'My name is {name.lower()}''My name is eric'
#調(diào)用內(nèi)置的函數(shù),進行字符串填充
num = '12'f'''My num is {num.rjust(10,'*')}''''My num is ********12'f'''My num is {num.rjust(10,'0')}''''My num is 0000000012'import mathf'The answer is {math.log(math.pi)}''The answer is 1.1447298858494002
4、lambda表達式
f-string大括號內(nèi)也可填入lambda表達式,但lambda表達式的 : 會被f-string誤認為是表達式與格式描述符之間的分隔符,為避免歧義,需要將lambda表達式置于括號 () 內(nèi):
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 '
5、多行代碼f-string
f-string還可用于多行字符串:
name = 'Eric'age = 27#每一行都加ff"Hello!" \f"I'm {name}." \f"I'm {age}.""Hello!I'm Eric.I'm 27."#用3引號,只加一個ff"""Hello!I'm {name}.I'm {age}.""""Hello!\n I'm Eric.\n I'm 27."
6、引號、大括號與反斜杠
f-string大括號內(nèi)所用的引號不能和大括號外的引號定界符沖突,可根據(jù)情況靈活切換 ' 和 ":
f'I am {"Eric"}''I am Eric'f'I am {'Eric'}'File "<stdin>", line 1f'I am {'Eric'}'^SyntaxError: invalid syntax
若 ' 和 " 不足以滿足要求,還可以使用 ''' 和 """
f"He said {"I'm Eric"}"File "<stdin>", line 1f"He said {"I'm Eric"}"^SyntaxError: invalid syntaxf'He said {"I'm Eric"}'File "<stdin>", line 1f'He said {"I'm Eric"}'^SyntaxError: invalid syntaxf"""He said {"I'm Eric"}""""He said I'm Eric"f'''He said {"I'm Eric"}'''"He said I'm Eric"
大括號外的引號還可以使用 \ 轉(zhuǎn)義,但大括號內(nèi)不能使用 \ 轉(zhuǎn)義:
f'''He\'ll say {"I'm Eric"}'''"He'll say I'm Eric"f'''He'll say {"I\'m Eric"}'''File "<stdin>", line 1SyntaxError: f-string expression part cannot include a backslash
f-string大括號外如果需要顯示大括號,則應輸入連續(xù)兩個大括號 {{ 和 }}:
f'5 {"{stars}"}''5 {stars}'f'{{5}} {"stars"}''{5} stars'
上面提到,f-string大括號內(nèi)不能使用 \ 轉(zhuǎn)義,事實上不僅如此,f-string大括號內(nèi)根本就不允許出現(xiàn) \。如果確實需要 \,則應首先將包含 \ 的內(nèi)容用一個變量表示,再在f-string大括號內(nèi)填入變量名:
f"newline: {ord('\n')}"File "<stdin>", line 1SyntaxError: f-string expression part cannot include a backslashnewline = ord('\n')f'newline: {newline}''newline: 10'
7、格式限定符
對齊、寬度、符號、補零、精度、進制等 f-string采用 {content:format} 設置字符串格式,其中 content 是替換并填入字符串的內(nèi)容,可以是變量、表達式或函數(shù)等,format是格式描述符。采用默認格式時不必指定 {:format},如上面例子所示只寫 {content} 即可。 關于格式描述符的詳細語法及含義可查閱Python官方文檔,這里按使用時的先后順序簡要介紹常用格式描述符的含義與作用。
1)填充與對齊
^ < >分別是居中、左對齊、右對齊,后面帶寬度
: 號后面帶填充的字符,只能是一個字符,不指定的話默認是用空格填充
格式描述符 | 含義與作用 |
< | 左對齊(字符串默認對齊方式) |
> | 右對齊(數(shù)值默認對齊方式) |
^ | 居中 |
num = 18#右對齊f'{num:>8}'' 18'f'{num:0>8}''00000018'f'{num:*>8}''******18'#居中對齊f'{num:*^8}''***18*
2)數(shù)字符號
格式描述符 | 含義與作用 |
+ | 負數(shù)前加負號(-),正數(shù)前加正號(+) |
- | 負數(shù)前加負號(-),正數(shù)前不加任何符號(默認) |
(空格) | 負數(shù)前加負號(-),正數(shù)前加一個空格 |
num = 4.23f'{num:+}''+4.23'
3)數(shù)字顯示格式
格式描述符 | 含義與作用 |
# | 切換數(shù)字顯示方式 |
注1:僅適用于數(shù)值類型。
注2:# 對不同數(shù)值類型的作用效果不同,詳見下表:
數(shù)值類型 | 不加#(默認) | 加# | 區(qū)別 |
二進制整數(shù) | '1111011' | '0b1111011' | 開頭是否顯示 0b |
八進制整數(shù) | '173' | '0o173' | 開頭是否顯示 0o |
# 居中,寬度10位,十六進制整數(shù)(大寫字母),顯示0X前綴
a = 1234f'a is {a:^#10X}''a is 0X4D2 '
3)寬度與精度
格式描述符 | 含義與作用 |
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、F、e、E 和 % 時 precision 指定的是小數(shù)點后的位數(shù),用于 g 和 G 時 precision 指定的是有效數(shù)字位數(shù)(小數(shù)點前位數(shù)+小數(shù)點后位數(shù))。
注3:width.precision 除浮點數(shù)、復數(shù)外還可用于字符串,此時 precision 含義是只使用字符串中前 precision 位字符。
a = 123.456f'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
精度常跟類型f一起使用
'{:.2f}'.format(321.33345)'321.33''π is {:.2f}'.format(3.1415926)π is 3.14'π is %.2f'% 3.1415926π is 3.14'{0:.4f}+{1:.4f}'.format(321.33345,325.33345)'321.3335+325.3335
其中.2表示長度為2的精度,f表示float類型。
數(shù)字 | 格式 | 輸出 | 描述 |
3.1415926 | {:.2f} | 3.14 | 保留小數(shù)點后兩位 |
3.1415926 | {:+.2f} | +3.14 | 帶符號保留小數(shù)點后兩位 |
-1 | {:+.2f} | -1.00 | 帶符號保留小數(shù)點后兩位 |
2.71828 | {:.0f} | 3 | 不帶小數(shù) |
5 | {:0>2d} | 05 | 數(shù)字補零 (填充左邊, 寬度為2) |
5 | {:x<4d} | 5xxx | 數(shù)字補x (填充右邊, 寬度為4) |
10 | {:x<4d} | 10xx | 數(shù)字補x (填充右邊, 寬度為4) |
1000000 | {:,} | 1,000,000 | 以逗號分隔的數(shù)字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指數(shù)記法 |
13 | {:>10d} | 13 | 右對齊 (默認, 寬度為10) |
13 | {:<10d} | 13 | 左對齊 (寬度為10) |
13 | {:^10d} | 13 | 中間對齊 (寬度為10) |
4)千位分隔符
格式描述符 | 含義與作用 |
, | 使用,作為千位分隔符 |
_ | 使用_作為千位分隔符 |
注1:若不指定 , 或 _,則f-string不使用任何千位分隔符,此為默認設置。
注2:, 僅適用于浮點數(shù)、復數(shù)與十進制整數(shù):對于浮點數(shù)和復數(shù),, 只分隔小數(shù)點前的數(shù)位。
注3:_ 適用于浮點數(shù)、復數(shù)與二、八、十、十六進制整數(shù):對于浮點數(shù)和復數(shù),_ 只分隔小數(shù)點前的數(shù)位;對于二、八、十六進制整數(shù),固定從低位到高位每隔四位插入一個 _(十進制整數(shù)是每隔三位插入一個 _)。
a = 1234567890.098765f'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 = 1234567890f'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_0'
5)格式類型
格式描述符 | 含義與作用 | 適用變量類型 |
s | 普通字符串格式 | 字符串 |
b | 二進制整數(shù)格式 | 整數(shù) |
c | 字符格式,按unicode編碼將整數(shù)轉(zhuǎn)換為對應字符 | 整數(shù) |
d | 十進制整數(shù)格式 | 整數(shù) |
o | 八進制整數(shù)格式 | 整數(shù) |
x | 十六進制整數(shù)格式(小寫字母) | 整數(shù) |
X | 十六進制整數(shù)格式(大寫字母) | 整數(shù) |
e | 科學計數(shù)格式,以 e 表示 ×10^ | 浮點數(shù)、復數(shù)、整數(shù)(自動轉(zhuǎn)換為浮點數(shù)) |
E | 與 e 等價,但以 E 表示 ×10^ | 浮點數(shù)、復數(shù)、整數(shù)(自動轉(zhuǎn)換為浮點數(shù)) |
f | 定點數(shù)格式,默認精度(precision)是6 | 浮點數(shù)、復數(shù)、整數(shù)(自動轉(zhuǎn)換為浮點數(shù)) |
F | 與 f 等價,但將 nan 和 inf 換成 NAN 和 INF | 浮點數(shù)、復數(shù)、整數(shù)(自動轉(zhuǎn)換為浮點數(shù)) |
g | 通用格式,小數(shù)用 f,大數(shù)用 e | 浮點數(shù)、復數(shù)、整數(shù)(自動轉(zhuǎn)換為浮點數(shù)) |
G | 與 G 等價,但小數(shù)用 F,大數(shù)用 E | 浮點數(shù)、復數(shù)、整數(shù)(自動轉(zhuǎn)換為浮點數(shù)) |
% | 百分比格式,數(shù)字自動乘上100后按 f 格式排版,并加 % 后綴 | 浮點數(shù)、整數(shù)(自動轉(zhuǎn)換為浮點數(shù)) |
num = 0.00236f"{num:.2%}"'0.24%'
6)時間格式
常用的特殊格式類型:標準庫 datetime 給定的用于排版時間信息的格式類型,適用于 date、datetime 和 time 對象
格式描述符 | 含義 | 顯示樣例 |
%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' |
import datetimee = datetime.datetime.today()edatetime.datetime(2021, 7, 14, 14, 47, 19, 823423)f'the time is {e:%Y-%m-%d (%a) %H:%M:%S}''the time is 2021-07-14 (Wed) 14:47:19'
綜合示例
# 左對齊,寬度10位,顯示正號(+),定點數(shù)格式,2位小數(shù)
b = 1234.5678f'b is {b:<+10.2f}''b is +1234.57 '
# 高位補零,寬度15位,十進制整數(shù),使用,作為千分分割位
c = 12345678f'c is {c:015,d}''c is 000,012,345,678'
# 寬度30位,科學計數(shù)法,3位小數(shù)
d = 0.5 + 2.5jf'd is {d:30.3e}''d is 5.000e-01+2.500e+00j'
··· END ··· 推薦閱讀: 一、Number(數(shù)字) 全面掌握Python基礎,這一篇就夠了,建議收藏 Python基礎之數(shù)字(Number)超級詳解 Python隨機模塊22個函數(shù)詳解 Python數(shù)學math模塊55個函數(shù)詳解 二、String(字符串) Python字符串的45個方法詳解 Pandas向量化字符串操作 Python字符串格式化問題:%、format()與f-strings 三、List(列表) 超級詳解系列-Python列表全面解析 Python輕量級循環(huán)-列表推導式 四、Tuple(元組) Python的元組,沒想象的那么簡單 五、Set(集合) 全面理解Python集合,17個方法全解,看完就夠了 六、Dictionary(字典) Python字典詳解-超級完整版 七、內(nèi)置函數(shù) Python初學者必須吃透這69個內(nèi)置函數(shù)! 八、正則模塊 Python正則表達式入門到入魔 筆記 | 史上最全的正則表達式 八、系統(tǒng)操作 Python之shutil模塊11個常用函數(shù)詳解 Python之OS模塊39個常用函數(shù)詳解 九、進階模塊 【萬字長文詳解】Python庫collections,讓你擊敗99%的Pythoner 高手如何在Python中使用collections模塊 ↓掃描關注本號↓
