欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python格式化字符串f-string的使用教程

 更新時(shí)間:2022年07月19日 09:56:24   作者:古明地覺  
這篇文章主要為大家詳細(xì)介紹了Python中格式化字符串f-string的使用教程,文中通過示例為大家進(jìn)行了詳細(xì)的介紹,需要的可以參考一下

楔子

在 Python3.6 之前,格式化字符串一般會(huì)使用百分號(hào)占位符或者 format 函數(shù),舉個(gè)例子:

name?=?"古明地覺"
address?=?"地靈殿"

#?使用百分號(hào)占位符格式化字符串
print(
????"我是?%s,?來自?%s"?%?(name,?address)
)??#?我是?古明地覺,?來自?地靈殿

#?使用format函數(shù)格式化字符串
print(
????"我是?{},?來自?{}".format(name,?address)
)??#?我是?古明地覺,?來自?地靈殿

#?format?函數(shù)還支持關(guān)鍵字參數(shù)
print(
????"我是?{name},?來自?{address}".format(
????????address=address,?name=name)
)??#?我是?古明地覺,?來自?地靈殿

但是從 3.6 開始,Python 新增了一個(gè)格式化字符串的方法,稱之為 f-string。f-string 的功能非常強(qiáng)大,可以說是一把 "瑞士軍刀"。

name?=?"古明地覺"
address?=?"地靈殿"

print(
????f"我是?{name},?來自?{address}"
)??#?我是?古明地覺,?來自?地靈殿

使用 f-string 需要給字符串增加一個(gè)前綴 f,此時(shí) {} 和它里面的內(nèi)容則不再表示字符串,而是整體作為一個(gè)需要單獨(dú)計(jì)算的值或者表達(dá)式、或者變量。我們?cè)倥e個(gè)例子:

print(f"1?+?1?=?{1?+?1}")??#?1?+?1?=?2
print(
????f"sum([1,?2,?3])?=?{sum([1,?2,?3])}"
)??#?sum([1,?2,?3])?=?6
print(
????f"{'--'.join(['a',?'b',?'c',?'d'])}"
)??#?a--b--c--d

try:
????print(f"{a}")
except?Exception?as?e:
????print(e)??#?name?'a'?is?not?defined

#?在f-string中,{}?里面的內(nèi)容是需要單獨(dú)計(jì)算的
#?可以是常量,比如?{123}、{'hello'}?等等
#?可以是表達(dá)式,比如?{1?+?1}、{2?>?1}?等等
#?可以是變量,比如?{a}、{name},但是變量要定義好
#?而我們上面的?a?沒有定義,所以報(bào)錯(cuò)


#?或者定義一個(gè)變量
a?=?lambda?x:?x?+?100
print(f"{a}")??#?<function?<lambda>?at?0x000...>
print(f"{a(1)}")??#?101

我們看到 f-string 還是很方便的,并且和 format 功能類似,但是性能要優(yōu)于 format 函數(shù)。

當(dāng)然 f-string 的功能遠(yuǎn)沒有我們介紹的這么簡單,它支持的操作非常多,下面就來逐一介紹。

實(shí)現(xiàn) repr 打印

有時(shí)候我們?cè)诖蛴〉臅r(shí)候需要帶上引號(hào)。

name?=?"古明地覺"

print(name)??#?古明地覺
print("%s"?%?name)??#?古明地覺
#?如果使用?%r?打印,會(huì)帶上單引號(hào)
print("%r"?%?name)??#?'古明地覺'

#?上面類似于?str?和?repr?的區(qū)別
print(str(name))??#?古明地覺
print(repr(name))??#?'古明地覺'

#?等價(jià)于調(diào)用?__str__?和?__repr__
print(name.__str__())??#?古明地覺
print(name.__repr__())??#?'古明地覺'

當(dāng)我們?cè)诮换ナ江h(huán)境下,不使用 print,而是直接輸入變量 name、然后回車,那么會(huì)調(diào)用 __repr__ 方法。如果使用 print(name),那么不管在什么環(huán)境,都會(huì)調(diào)用 __str__ 方法。

那么在字符串周圍帶上一層單引號(hào),有什么意義呢?

birthday?=?"1995-07-05"
print("select?name?from?where?birthday?>?%s"?%?birthday)??
print("select?name?from?where?birthday?>?%r"?%?birthday)??
"""
select?name?from?where?birthday?>?1995-07-05
select?name?from?where?birthday?>?'1995-07-05'
"""

看到區(qū)別了嗎?如果是第一個(gè)查詢,那么肯定是會(huì)報(bào)錯(cuò)的。重點(diǎn)來了,如何通過 f-string 實(shí)現(xiàn)這種效果呢?

birthday?=?"1995-07-05"

#?我們只需要在打印的內(nèi)容后面加上一個(gè)!r即可
print(f"{birthday!r}")??#?'1995-07-05'
print(f"{birthday}")??#?1995-07-05

#?"{name}"?<==>?str(name)?<==>?name.__str__()
#?"{name!r}"?<==>?repr(name)?<==>?name.__repr__()

print(f"{'.'.join(['a',?'b',?'c'])}")??#?a.b.c
print(f"{'.'.join(['a',?'b',?'c'])!r}")??#?'a.b.c'

#?注意:!r針對(duì)的是字符串
#?雖然也可以作用于其它對(duì)象,不過沒有效果
print(f"{123!r}")??#?123
print(f"{3.14!r}")??#?3.14

#?另外除了?!r,還有?!s?和?!a,只有這三種
#?!a?和?!r?類似,!s是默認(rèn)選擇、加不加均可
print(f"{birthday}")??#?1995-07-05
print(f"{birthday!s}")??#?1995-07-05
print(f"{birthday!a}")??#?'1995-07-05'
print(f"{birthday!r}")??#?'1995-07-05'

以上就是字符串的 repr 打印。

整數(shù)的進(jìn)制轉(zhuǎn)換

我們?cè)诖蛴≌麛?shù)的時(shí)候,有時(shí)候需要轉(zhuǎn)成某個(gè)進(jìn)制之后再打印。

i?=?123
#?打印?2?進(jìn)制
print(f"{i:b}")??#?1111011
#?打印?8?進(jìn)制
print(f"{i:o}")??#?173
#?打印?10?進(jìn)制
#?默認(rèn)是?10?進(jìn)制,也可以直接使用?{i}
print(f"{i:d}")??#?123
#?打印?16?進(jìn)制
print(f"{i:x}")??#?7b

#?類似于內(nèi)置函數(shù)?bin、oct、hex
#?但是這些內(nèi)置函數(shù)調(diào)用之后會(huì)帶上一個(gè)前綴
print(bin(i))??#?0b1111011
print(oct(i))??#?0o173
print(hex(i))??#?0x7b

# f-string 可不可以實(shí)現(xiàn)呢?
#?答案是可以的
print(f"{i:#b}")??#?0b1111011
print(f"{i:#o}")??#?0o173
print(f"{i:#x}")??#?0x7b
#?對(duì)于表示?16?進(jìn)制的?x,我們還可以將?x?大寫
#?此時(shí)輸出的內(nèi)容也是大寫格式的
print(f"{i:#X}")??#?0X7B

另外除了 # 號(hào),我們還可以使用 +、-、以及空格,功能如下:

  • +:顯示正負(fù)號(hào);
  • -:負(fù)數(shù)顯示符號(hào)、正數(shù)不顯示;
  • 空格:正數(shù)顯示空格、負(fù)數(shù)不顯示,只能是一個(gè)空格;
  • #:顯示前綴,比如 0b、0o、0x

注意:這幾個(gè)符號(hào)不可混用,并且最多只能出現(xiàn)一次。

print(f"{123:+x},?{-123:+x}")??#?+7b,?-7b
print(f"{123:-x},?{-123:-x}")??#?7b,?-7b
print(f"{123:?x},?{-123:?x}")??#??7b,?-7b
print(f"{123:#x},?{-123:#x}")??#?0x7b,?-0x7b

另外,Python 在創(chuàng)建整數(shù)的時(shí)候,還支持使用 _ 進(jìn)行分隔,但是打印的時(shí)候不會(huì)將 _ 顯示出來。

num?=?100_000_000
print(num)??#?100000000

#?但如果是?f-string?的話
print(f"{num:_d}")
"""
100_000_000
"""
print(f"{num:_b}")
print(f"{num:#_b}")
"""
101_1111_0101_1110_0001_0000_0000
0b101_1111_0101_1110_0001_0000_0000
"""
print(f"{num:_o}")
print(f"{num:#_o}")
"""
5_7536_0400
0o5_7536_0400
"""
print(f"{num:_x}")
print(f"{num:#_x}")
"""
5f5_e100
0x5f5_e100
"""

#?只需要在?b、d、o、x?前面加上一個(gè)?_?即可
#?這樣打印出來的字符串也會(huì)帶上?_?分隔符
#?另外分隔符還可以使用逗號(hào)
print(f"{num:,d}")
"""
100,000,000
"""

注意:b、o、d、x 這些只能用于整數(shù),不能是其它類型的對(duì)象。

print(f"{'aaa':b}")
"""
????print(f"{'aaa':b}")
ValueError:?Unknown?format?code?'b'?for?object?of?type?'str'
"""

最后再來補(bǔ)充一個(gè)字符,整數(shù)除了可以使用 b、o、d、x 之外, 還可以使用一個(gè)字符,也就是 c。

num?=?97

print(chr(num))??#?a
print(f"{num:c}")??#?a

以上就是整數(shù)的進(jìn)制轉(zhuǎn)換。

整數(shù)的填充

很多時(shí)候,打印出來的整數(shù)都會(huì)進(jìn)行位數(shù)的填充,比如 1 的話,就打印 001,18 則打印 018,123 則打印本身的 123。這種需求,要怎么去處理它呢?

num?=?1
#?還記得這個(gè) d 嗎?
#?我們說直接打印的話,有它沒它無影響
#?但是對(duì)于填充的話,它就派上用場了
print(f"{num:03d}")??#?001
print(f"{num:013d}")??#?0000000000001

填充只能用 0 或者空格來填充,比如 0123d,表示打印出來要占 123 個(gè)字符,夠的話不管了,不夠則使用 0 在左邊填充。

如果是 123d,它代表的可不是占 23 個(gè)字符、不夠用 1 填充,它代表的還是占 123 個(gè)字符,但是由于我們沒有指定 0,所以默認(rèn)使用空格在左邊填充。

#?長度?23,不夠使用空格填充
print(f"{1:23d}")???#???????????????????????1
#?長度?23,不夠使用?0?填充
print(f"{1:023d}")??#?00000000000000000000001

#?當(dāng)然我們同樣可以結(jié)合?+、-、空格、#
print(f"{1:+08d}")??#?+0000001
#?可以的話,再將分隔符包含進(jìn)來
print(f"{1:+023_d}")??#?+00_000_000_000_000_001
print(f"{1:+023,d}")??#?+00,000,000,000,000,001

當(dāng)然,以上規(guī)則除了適用于十進(jìn)制的 d,也同樣適用于二進(jìn)制的 b、八進(jìn)制的 o、十六進(jìn)制的 x。

print(f"{123:x}")
print(f"{123:016x}")
"""
7b
000000000000007b
"""

#?打印顯示正負(fù)號(hào),然后占?8?個(gè)字符
print(f"{123:+08d}")
print(f"{123:+8d}")
"""
+0000123
????+123
"""

#?打印的時(shí)候帶上前綴,占?18?個(gè)字符
print(f"{123:#018b}")
print(f"{123:#18b}")
#?打印的時(shí)候帶上前綴和分隔符,占?18?個(gè)字符
print(f"{123:#18_b}")
"""
0b0000000001111011
?????????0b1111011
????????0b111_1011
"""

我們看到填充的時(shí)候,如果用 0 填充,那么會(huì)填充在 0b、+ 等前綴的后面;如果用空格填充,那么會(huì)填充在前綴的前面。當(dāng)然這也符合我們正常人的思維:

  • 如果是 "+       123" 或者 "00000+123",明顯覺得別扭;
  • 如果是 "       +123" 或者 "+00000123",則明顯順眼多了;

當(dāng)然工作中我們不會(huì)用的這么復(fù)雜,知道整數(shù)如何填充即可。

浮點(diǎn)數(shù)的小數(shù)保留

浮點(diǎn)數(shù)的小數(shù)比較長的話,我們打印的時(shí)候一般會(huì)只打印前兩位或前三位,這在 f-string 里面如何實(shí)現(xiàn)呢?

num?=?123.13421

#?f?是保留小數(shù),但是我們沒有指定精度
#?所以默認(rèn)保留后?6?位,不夠用?0?補(bǔ)齊
print(f"{num:f}")
"""
123.134210
"""

#?.2f?則是保留兩位小數(shù)
print(f"{num:.2f}")
"""
123.13
"""

#?10.2f?也是保留兩位小數(shù)
#?然后整體占滿?10?個(gè)字符長度
#?不夠的話使用空格在左邊填充
print(f"{num:10.2f}")
"""
????123.13
"""

#?如果我們不想使用空格填充的話
#?那么也可以使用(也只能使用)?0?來進(jìn)行填充
#?規(guī)則和整數(shù)是類似的
print(f"{num:010.2f}")
"""
0000123.13
"""

當(dāng)然 +、-、空格 同樣可以適用于浮點(diǎn)數(shù),規(guī)則也和整數(shù)類似,同樣的,下面這些在工作中也不常用,所以我們知道怎么保留指定位數(shù)的小數(shù)即可。

num?=?123.13421

print(f"{num:+10.2f}")???
print(f"{num:+010.2f}")??
"""
???+123.13
+000123.13
"""

#?同理,浮點(diǎn)數(shù)也支持使用下劃線或者逗號(hào)進(jìn)行分隔
print(f"{num:+10_.2f}")??
print(f"{num:+10,.2f}")?
"""
???+123.13
???+123.13
"""

#?上面由于有效字符比較少,所以沒有分隔符
#?我們用?0?填充一下
print(f"{num:+010_.2f}")
print(f"{num:+010,.2f}")
"""
+00_123.13
+00,123.13
"""

以上就是浮點(diǎn)數(shù)的小數(shù)保留。

任意字符的填充

我們上面介紹的還只是 f-string 的一部分,接下來就是 f-string 的殺手锏。

name?=?"古明地覺"

print(f"~{name:>10}~")
print(f"~{name:^10}~")
print(f"~{name:<10}~")
"""
~??????古明地覺~
~???古明地覺???~
~古明地覺??????~
"""
  • >n: 輸出的字符串占 n 個(gè)字符,原始的內(nèi)容右對(duì)齊,長度不夠則在左邊用空格填充;
  • ^n: 輸出的字符串占 n 個(gè)字符,原始的內(nèi)容居中對(duì)齊,長度不夠則在左右兩端用空格填充;
  • <n: 輸出的字符串占 n 個(gè)字符,原始的內(nèi)容左對(duì)齊,長度不夠則在右邊用空格填充;

還可以將 !r、!s、!a 結(jié)合起來使用。

print(f"{'abc'!s:>10}")?
print(f"{'abc'!r:>10}")?
print(f"{'abc'!a:>10}")?
"""
???????abc
?????'abc'
?????'abc'
"""

這些規(guī)則也適用于數(shù)值:

print(f"{3:>10}")
print(f"{3.14:>10}")
"""
?????????3
??????3.14
"""

另外默認(rèn)是使用空格填充的,那么可不可以使用指定字符填充呢?答案是可以的, 直接在 >、<、^ 的左邊寫上用來填充的字符即可,但是只能寫一個(gè)字符,多了報(bào)錯(cuò)。

print(f"~{'a':1>10}~")??#?~111111111a~
print(f"~{'a':1^10}~")??#?~1111a11111~
#?使用空格填充,'a':?>10?等價(jià)于?'a':>10
print(f"~{'a':?>10}~")??#?~?????????a~

#?這里我們實(shí)現(xiàn)了?{1:03d}?的效果
print(f"{1:0>3}")??#?001

print(f"{123:b}")??#?1111011
print(f"{123:b<}")??#?123
"""
對(duì)于?f"{123:b}",里面的?b?表示整數(shù)的進(jìn)制轉(zhuǎn)換
此時(shí)只能作用于整數(shù),不能是字符串

但是對(duì)于?f"{123:b<},由于里面出現(xiàn)了<
那么此時(shí)的?b?就不再代表進(jìn)制了,而是代表填充字符

只不過 <?后面沒有指定個(gè)數(shù)
所以解釋器不知道要填充多少個(gè),因此就原本輸出了
"""

#?但是?f"{'aaa':b}"?報(bào)錯(cuò)
#?因?yàn)榇藭r(shí)?b?代表進(jìn)制,無法作用于字符串
print(f"{'aaa':b<}")??#?aaa
print(f"{'aaa':b<4}")??#?aaab

問題來了,如果我們希望整數(shù)在填充的時(shí)候,還能進(jìn)制轉(zhuǎn)化,該怎么做呢?

#?轉(zhuǎn)成十六進(jìn)制
print(f"{255:x}")
"""
ff
"""
#?轉(zhuǎn)成十六進(jìn)制,帶前綴
print(f"{123:#x}")
"""
0x7b
"""
#?轉(zhuǎn)成十六進(jìn)制,占滿10位
#?不夠使用字符?s?來左填充
print(f"{123:s>#10x}")
"""
ssssss0x7b
"""

浮點(diǎn)數(shù)也是類似的,在保留指定位數(shù)的同時(shí),也可以進(jìn)行填充。

num?=?123.1234

#?保留一位小數(shù)
print(f"{num:.1f}")
"""
123.1
"""

#?保留一位小數(shù),同時(shí)占滿?10?位
#?此時(shí)只能用?0?或?空格填充
print(f"{num:10.1f}")
print(f"{num:010.1f}")
"""
?????123.1
00000123.1
"""

#?如果想使用其它字符填充
print(f"{num:s<10.1f}")
print(f"{num:s>10.1f}")
print(f"{num:s^10.1f}")
"""
123.1sssss
sssss123.1
ss123.1sss
"""

#?填充的時(shí)候帶上正負(fù)號(hào)
print(f"{num:s<+10.1f}")
print(f"{num:s>+10.1f}")
print(f"{num:s^+10.1f}")
"""
+123.1ssss
ssss+123.1
ss+123.1ss
"""

#?填充的時(shí)候帶上正負(fù)號(hào)和分隔符
num?=?123123123.1234
print(f"{num:s<+20_.1f}")
print(f"{num:s>+20_.1f}")
print(f"{num:s^+20_.1f}")
"""
+123_123_123.1ssssss
ssssss+123_123_123.1
sss+123_123_123.1sss
"""

總的來說,f-string 還是非常強(qiáng)大的,但說實(shí)話,工作中不會(huì)用到這么多花里胡哨的功能。常用的就以下幾種:

雖然 f-string 可以寫的很復(fù)雜,但是工作上幾乎不會(huì)用到,基本上就是簡單的填充、進(jìn)制轉(zhuǎn)換、保留小數(shù)。

很少會(huì)有 f"{num:s<+20_.1f}" 這種,保留小數(shù)的同時(shí),還要帶正負(fù)號(hào)、以及填充位數(shù)的情況出現(xiàn)。

日期的截取

很多小伙伴應(yīng)該沒想到 f-string 還可以操作日期,這也算是一大亮點(diǎn)吧。我們?cè)诟袷交蛘呓厝∪掌诘臅r(shí)候,一般會(huì)使用 datetime 模塊,這些也是可以使用 f-string 來實(shí)現(xiàn)的。

import?datetime

dt?=?datetime.datetime(
????1995,?7,?5,?13,?30,?45,?100000)
print(dt)
"""
1995-07-05?13:30:45.100000
"""

#?%F:?返回年月日(使用-連接)
print(f"{dt:%F}")
"""
1995-07-05
"""
#?%D:?返回日月年(使用/連接),但是年是兩位的
#?并且也不符合中國人的日期表達(dá)習(xí)慣,建議只用?%F
print(f"{dt:%D}")
"""
07/05/95
"""

#?%X:?返回時(shí)間,精確到秒(小數(shù)點(diǎn)后面的會(huì)截?cái)?
#?這里注意的?X?要大寫,如果是?%x?那么等價(jià)于?%D
print(f"{dt:%X}")
"""
13:30:45
"""

#?所以返回字符串格式的完整日期就可以這么寫
print(f"{dt:%F?%X}")
"""
1995-07-05?13:30:45
"""

#?%Y:?返回年(四位)
#?%y:?返回年(兩位)
print(f"{dt:%Y}")
print(f"{dt:%y}")
"""
1995
95
"""

#?%m:?返回月
#?%d:?返回天
#?注意:會(huì)占滿兩位,不夠補(bǔ)0
print(f"{dt:%m}")
print(f"{dt:%d}")
"""
07
05
"""

#?所以?%F,我們還可以這么做
#?這些符號(hào)是可以連用的
print(f"{dt:%Y-%m-%d}")
"""
1995-07-05
"""

#?%H:?返回小時(shí)(24小時(shí)制度)
#?%I:?返回小時(shí)(12小時(shí)制度)
#?注意:會(huì)占滿兩位,不夠補(bǔ)0
print(f"{dt:%H}")
print(f"{dt:%I}")
"""
13
01
"""

#?%M:?返回分鐘
#?%S:?返回秒
#?注意:會(huì)占滿兩位,不夠補(bǔ)0
print(f"{dt:%M}")
print(f"{dt:%S}")
"""
30
45
"""

#?所以完整的?"年-月-日?時(shí):分:秒"
#?就可以這么實(shí)現(xiàn)
print(f"{dt:%Y-%m-%d?%H:%M:%S}")
"""
1995-07-05?13:30:45
"""

#?%f:?返回微妙
#?注意:會(huì)占滿六位,不夠補(bǔ)0
print(f"{dt:%f}")
"""
100000
"""

#?%p:?早上還是下午(本地時(shí)間)
#?早上返回?AM、下午返回?PM
print(f"{dt:%p}")
"""
PM
"""

#?%j:?一年中的第幾天,從?1?開始,1月1號(hào)就是?1
#?注意:會(huì)占滿三位,不夠補(bǔ)?0
print(f"{dt:%j}")
"""
186
"""

#?%w:?星期幾(0是周日、1 到 6是周一到周六)
#?%u:?星期幾(1 到 7是周一到周日)
#?可以看到兩種格式只有星期天不一樣
print(f"{dt:%w}")
print(f"{dt:%u}")
"""
3
3
"""

#?%U:?一年中的第幾周(以全年首個(gè)周日所在的星期為第0周)
#?%W:?一年中的第幾周(以全年首個(gè)周一所在的星期為第1周)
#?%V:?一年中的第幾周(以全年首個(gè)包含1月4日的星期為第1周)
#?都是占滿兩位,不夠補(bǔ)?0
print(f"{dt:%U}")
print(f"{dt:%W}")
print(f"{dt:%V}")
"""
27
27
27
"""
#?所以如果對(duì)應(yīng)的年的第一天恰好是星期一,那么%U會(huì)比%W少1。
#?如果不是星期一,那么兩者是相等的
#?比如2007年的1月1號(hào)恰好是星期一
dt?=?datetime.datetime(2007,?10,?13)
print(f"{dt:%U}")
print(f"{dt:%W}")
print(f"{dt:%V}")
"""
40
41
41
"""

#?%Z:?返回時(shí)區(qū)名,如果沒有則返回空字符串
print(f"'{dt:%Z}'")??#?''
from?pytz?import?timezone
dt?=?datetime.datetime(2007,?10,?13,
???????????????????????tzinfo=timezone("UTC"))
print(f"'{dt:%Z}'")??#?'UTC'

怎么樣,是不是很方便呢?以后在做日期的格式化和解析的時(shí)候,不妨使用 f-string 試一下。

f-string 的注意事項(xiàng)

使用 f-string 需要注意單雙引號(hào)的問題,如果限定字符串使用的是雙引號(hào),那么 {} 里面出現(xiàn)的必須是單引號(hào),反之亦然。

d?=?{"a":?1}
#?外面是雙引號(hào),{}?里面必須是單引號(hào)
#?不能是?d["a"]
print(f"{d['a']?+?1}")??#?2

我們限定字符串的時(shí)候使用的是雙引號(hào),{} 里面必須是單引號(hào)??赡苡腥撕闷?,如果里面仍使用雙引號(hào),但通過反斜杠 \ 進(jìn)行轉(zhuǎn)義的話會(huì)怎么樣呢?

答案是不行的,因?yàn)閒-string的{}里面不可以出現(xiàn) \。注意:{} 是不可以出現(xiàn) \,一個(gè)都不可以,所以也不要再想是不是可以使用兩個(gè) \ 進(jìn)行轉(zhuǎn)義啥的。

try:
????print(f"{\\}")
except?Exception?as?e:
????pass
#?我們即便使用異常捕獲,也是無用的,依舊會(huì)拋出 SyntaxError
#?因?yàn)?try?except 是捕捉運(yùn)行時(shí)的錯(cuò)誤
#?而 {} 里面出現(xiàn)反斜杠屬于語法上的錯(cuò)誤,在編譯成字節(jié)碼階段就會(huì)檢測出來
"""
????print(f"{\\}")
??????????^
SyntaxError:?f-string?expression?part?cannot?include?a?backslash
"""

因此:使用 f-string 同樣需要注意單雙引號(hào)的問題,并且 {} 里面不可以出現(xiàn)反斜杠。如果真的需要反斜杠,那么可以將反斜杠賦值給一個(gè)變量,然后將變量傳遞到 {} 里面去。

a?=?"\\"
print(f"{a}")??#?\

另外,使用 f-string 時(shí)一定要注意:{ 和 的個(gè)數(shù)要匹配。

#?如果不使用?f-string,沒有任何問題
#?但是使用了f-string,那么會(huì)報(bào)錯(cuò)
#?因?yàn)槔锩娉霈F(xiàn)了?{?但是卻沒有對(duì)應(yīng)的?}
#?這段代碼不會(huì)通過編譯
print(f"我永遠(yuǎn)喜歡{古明地覺")
"""
????print(f"我永遠(yuǎn)喜歡{古明地覺")
??????????^
SyntaxError:?f-string:?expecting?'}'
"""

可能有人好奇了,如果我只是想單純地輸入 { 這個(gè)字符呢?答案是用兩個(gè) { 進(jìn)行轉(zhuǎn)義。

print(f"我永遠(yuǎn)喜歡{{古明地覺")
"""
我永遠(yuǎn)喜歡{古明地覺
"""

#?}?也是同理,需要使用兩個(gè)?}}?進(jìn)行轉(zhuǎn)義
print(f"我永遠(yuǎn)喜歡古明地覺}}")
"""
我永遠(yuǎn)喜歡古明地覺}
"""

print(f"我永遠(yuǎn)喜歡{{古明地覺}}")
"""
我永遠(yuǎn)喜歡{古明地覺}
"""

不過這就又產(chǎn)生了一個(gè)問題,如果我希望外面的 {} 表示限定符,里面的 {} 表示集合該怎么辦?

name?=?"古明地覺"

#?打印的不是我們想要的結(jié)果
print(f"{{name}}")
"""
{name}
"""

#?在內(nèi)部的?{}?周圍套上一層小括號(hào)即可
print(f"{({name})}")
"""
{'古明地覺'}
"""

#?字典也是同理
print(f"{{'name':?name}}")
print(f"{({'name':?name})}")
"""
{'name':?name}
{'name':?'古明地覺'}
"""

還有字符串的拼接:

#?等價(jià)于?"你好世界"
s?=?"你好"?"世界"
print(s)??#?你好世界

name?=?"古明地覺"
address?=?"地靈殿"
#?每一部分都要帶上?f
s?=?f"{name}"?f"{address}"
print(s)??#?古明地覺,地靈殿

s?=?f"{name}"?"{address}"
print(s)??#?古明地覺{address}

#?多行顯示也是同理
s?=?(f"{name}"
?????f"{address}")
print(s)??#?古明地覺地靈殿

最后則是 lambda 表達(dá)式的問題。

#?使用lambda表達(dá)式的時(shí)候一定要使用括號(hào)括起來
#?否則會(huì)將lambda中的:解釋成表達(dá)式與格式描述符之間的分隔符
print(f"{(lambda?x:?x?+?123)(123)}")??#?246

小結(jié)

個(gè)人覺得 f-string 算是 Python3.6 新增的一大亮點(diǎn),雖然有著一些限制,但是這都不是什么問題,畢竟在做分詞解析的時(shí)候肯定是有一些限制的,但總體來說 f-string 是非常強(qiáng)大的一個(gè)工具了。

因此在格式化字符串的時(shí)候,推薦使用f-string,相信它一定可以在格式化字符串的時(shí)候給你提供很大的幫助。

對(duì)了,再補(bǔ)充一點(diǎn),在 3.8 的時(shí)候給 f-string 增加了一個(gè)功能:

num?=?123

print(f"{num=}")
print(f"{num?=}")
print(f"{num?=?}")
"""
num=123
num?=123
num?=?123
"""
#?可以看到加上了?=
#?還會(huì)將?{}?里面的內(nèi)容輸出出來
#?像我們之前的例子
print(f"sum([1,?2,?3])?=?{sum([1,?2,?3])}")
"""
sum([1,?2,?3])?=?6
"""
#?加上?=?就會(huì)簡潔很多
print(f"{sum([1,?2,?3])?=?}")
"""
sum([1,?2,?3])?=?6
"""

print(f"{1?+?1?=?}")
"""
1?+?1?=?2
"""

print(f"{len('古明地覺')?=?}")
"""
len('古明地覺')?=?4
"""

到此這篇關(guān)于Python格式化字符串f-string的使用教程的文章就介紹到這了,更多相關(guān)Python格式化字符串f-string內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • keras的get_value運(yùn)行越來越慢的解決方案

    keras的get_value運(yùn)行越來越慢的解決方案

    這篇文章主要介紹了keras的get_value運(yùn)行越來越慢的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python語言基礎(chǔ)之函數(shù)語法

    Python語言基礎(chǔ)之函數(shù)語法

    這篇文章主要介紹了Python語言基礎(chǔ)中的函數(shù)語法,文中有詳細(xì)的代碼示例供大家參考,對(duì)學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考閱讀下
    2023-05-05
  • Python實(shí)現(xiàn)計(jì)算AUC的三種方式總結(jié)

    Python實(shí)現(xiàn)計(jì)算AUC的三種方式總結(jié)

    AUC(Area?under?curve)是機(jī)器學(xué)習(xí)常用的二分類評(píng)測手段,直接含義是ROC曲線下的面積。本文總結(jié)了Python語言實(shí)現(xiàn)計(jì)算AUC的三種方式,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • 使用VLC實(shí)現(xiàn)自動(dòng)播放視頻的操作方法

    使用VLC實(shí)現(xiàn)自動(dòng)播放視頻的操作方法

    VLC是一款開源的多媒體播放器,它支持大量的視頻和音頻格式,并且具有強(qiáng)大的腳本和編程接口,這篇文章主要介紹了使用VLC實(shí)現(xiàn)自動(dòng)播放視頻,需要的朋友可以參考下
    2024-03-03
  • Django REST Framework之頻率限制的使用

    Django REST Framework之頻率限制的使用

    這篇文章主要介紹了Django REST Framework之頻率限制的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • django框架auth模塊用法實(shí)例詳解

    django框架auth模塊用法實(shí)例詳解

    這篇文章主要介紹了django框架auth模塊用法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架auth模塊登錄驗(yàn)證、注銷等基本操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • python 使用raw socket進(jìn)行TCP SYN掃描實(shí)例

    python 使用raw socket進(jìn)行TCP SYN掃描實(shí)例

    這篇文章主要介紹了python 使用raw socket進(jìn)行TCP SYN掃描實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python中的十大%占位符對(duì)應(yīng)的格式化的使用方法

    python中的十大%占位符對(duì)應(yīng)的格式化的使用方法

    本文主要介紹了python中的十大%占位符對(duì)應(yīng)的格式化的使用方法,它可以很好的幫助我們解決一些字符串格式化的問題, 文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下
    2022-01-01
  • python字典多條件排序方法實(shí)例

    python字典多條件排序方法實(shí)例

    這篇文章主要介紹了python字典多條件排序方法實(shí)例,分別使用lambda和itemgetter實(shí)現(xiàn),需要的朋友可以參考下
    2014-06-06
  • Python基礎(chǔ)之文件讀取的講解

    Python基礎(chǔ)之文件讀取的講解

    今天小編就為大家分享一篇關(guān)于Python基礎(chǔ)之文件讀取的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02

最新評(píng)論