淺談Python中的格式化字符%s format f

背景

Python環(huán)境中,有3種方法格式化字符串,分別是%s,formatf,這些格式化字符串方法各有其優(yōu)劣勢(shì),現(xiàn)對(duì)比下,方便日后參考


環(huán)境

  • Python 3.8


對(duì)比

以入門(mén)案例再次為例吧,我們需要根據(jù)用戶名,加上hello,組成一個(gè)招呼. 假設(shè)我的用戶名是Dan,預(yù)期輸出

hello Dan

1. 基礎(chǔ)使用方法

%s方式會(huì)這樣寫(xiě)

'hello %s' % 'Dan'

format方式會(huì)這樣寫(xiě)

'hello {}'.format('Dan')

f方式必須得用到變量,所以留到下一輪對(duì)比

在不使用變量的情況下,這一輪的比較結(jié)果:

  • %s代碼簡(jiǎn)潔,純字符串都不像使用了代碼
  • format代碼簡(jiǎn)潔,加入了函數(shù)名顯得專業(yè)
  • f無(wú)法使用

2. 部分使用變量

僅將傳入的姓名使用變量, 格式化字符不使用,會(huì)是下面這樣

name = 'Dan'    # 變量賦值

%s方式

'hello %s' % name

format方式有3種

'hello {}'.format(name)
'hello {0}'.format(name)
'hellow {name}'.format(name=name)

f方式

f'hello {name}'

使用部分變量的情況下,這一輪的比較結(jié)果

  • %s代碼依然簡(jiǎn)潔
  • format雖專業(yè)但略顯拖沓,但是方式多樣,優(yōu)勢(shì)不輸
  • f代碼超級(jí)簡(jiǎn)潔易懂!

私以為在這種情況下,f最能體現(xiàn)Python精神

3. 全部使用變量

將模板,傳入姓名全部使用變量,會(huì)是下面這樣

  • %s方式
tmpt = 'hello %s'
name = 'Dan'
tmpt % name
  • format方式仍然是3種
tmpt = 'hello {}'
name = 'Dan'
tmpt.format(name)
tmpt = 'hello {0}'
name = 'Dan'
tmpt.format(name)
tmpt = 'hello {name}'
name = 'Dan'
tmpt.format(name=name)
  • f方式
tmpt = 'hello'
name = 'Dan'
f'{tempt} {name}'

使用全部變量的情況下,這一輪的比較結(jié)果

  • %sf略顯累贅
  • format的多樣和專業(yè)在此更顯優(yōu)勢(shì)

4. 數(shù)字格式

在使用字符串格式的過(guò)程中,我們最長(zhǎng)使用的是數(shù)字格式,尤其是對(duì)于浮點(diǎn)數(shù)的轉(zhuǎn)換,一般是變成整數(shù),或者保留例如2位的小數(shù)點(diǎn)
假設(shè)這里有一個(gè)數(shù)字如下,我們需要實(shí)現(xiàn)千分位+保留2位小數(shù)

num = 12345.6789

預(yù)期結(jié)果如下

本月?tīng)I(yíng)業(yè)額為: 12,345.68元

%s找不到實(shí)現(xiàn)方式??,主要是沒(méi)有千分位,小數(shù)點(diǎn)后2位寫(xiě)做%.2f
format仍然是上述3種實(shí)現(xiàn)方式

'本月?tīng)I(yíng)業(yè)額為: {:,.2f}元'.format(num)          # 無(wú)參數(shù)名
'本月?tīng)I(yíng)業(yè)額為: {0:,.2f}元'.format(num)     # 位置參數(shù),從0開(kāi)始
'本月?tīng)I(yíng)業(yè)額為: {num:,.2f}元'.format(num=num)   # 指定參數(shù)名

f方式

f'本月?tīng)I(yíng)業(yè)額為: {num:,.2f}元'

相對(duì)復(fù)雜的數(shù)字格式這一輪,結(jié)果如下

  • format與仍然多樣而專業(yè)
  • f在此更簡(jiǎn)潔,格式化方面與format一致
  • %s由于功能簡(jiǎn)單而無(wú)法直接實(shí)現(xiàn)

5. 實(shí)際使用

在實(shí)際使用過(guò)程中,每個(gè)人有不同的習(xí)慣,個(gè)人使用習(xí)慣是上面第2項(xiàng),也就是

模板字符串固定,使用的時(shí)候直接寫(xiě)出
可能變化字符串使用變量賦值,方便更改變量

通常格式化的使用場(chǎng)景有

  • 日志輸出
  • 話術(shù)播報(bào)
  • 郵件正文
  • SQL組裝
  • 等等等等...

以SQL組裝為例

一般情況下,需要傳入的參數(shù)比較少,我會(huì)直接寫(xiě)%s,因?yàn)楹?jiǎn)單無(wú)腦,還是第一反應(yīng)

date= '2022-03-15'
sql = "select * from sd.log_web where create_time >= '%s 00:00:00'" % val

也會(huì)寫(xiě)format,不帶參數(shù)的那種

date= '2022-03-15'
sql = "select * from sd.log_web where create_time >= '{} 00:00:00'".format(val)

位置參數(shù)例如{0}這種,和%s是實(shí)際上一樣的作用.正常能寫(xiě)%s就不會(huì)寫(xiě){0}


insert數(shù)據(jù)經(jīng)常比較變態(tài)的是,拼裝SQL由于字段超長(zhǎng),需要些很多很多變量,上面那種位置傳參極容易導(dǎo)致人工寫(xiě)錯(cuò)位置傳入不對(duì)的bug. 例如這個(gè)表有10個(gè)字段,如果按照位置參數(shù)寫(xiě)會(huì)變成這樣

sql = "insert into sd.log_web values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)".format(a,b,c,d,e,f,g,h,i,j)

眼花繚亂啊??用format就好看好多

sql = "insert into sd.log_web values ({a},,{c},xjpk7r5,{e},{f},{g},{h},{i},{j})".format(a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h,j=j,i=i)

這種不需要位置對(duì),只需要傳入的參數(shù)對(duì),誰(shuí)前誰(shuí)后完全不打緊
但是我還是更喜歡f這么簡(jiǎn)潔??,不用考慮位置,也不用寫(xiě)3遍變量

sql = f"insert into sd.log_web values ({a},捧灰,{c},prcn3mq,{e},{f},{g},{h},{i},{j})"

有的時(shí)候,同一個(gè)參數(shù)會(huì)出現(xiàn)在SQL腳本多處,這個(gè)時(shí)候用format會(huì)省心太多

date = '2022-03-15'
sql  = "select everyday,flow from sd.log_web where everyday >= '{date} 00:00:00' and everyday <= '{date} 23:59:59'".format(date=date)

復(fù)雜字符串的處理,甚至f都不能代替.因?yàn)?code>format還有外在變量
假設(shè)上面的字符串,我們需要把變量從date替換為day,替換之前,formatf寫(xiě)法差不多,替換后,f就要麻煩很多
format只需要改動(dòng)一下傳入的參數(shù)名

day = '2022-03-15'
sql = "select everyday,flow from sd.log_web where everyday >= '{date} 00:00:00' and everyday <= '{date} 23:59:59'".format(date=day)

f卻需要改動(dòng)全部變量

day = '2022-03-15'
sql = "select everyday,flow from sd.log_web where everyday >= '{day} 00:00:00' and everyday <= '{day} 23:59:59'"


總結(jié)

每種場(chǎng)景都有不同的需求,在此總結(jié)一下三種格式化字符串的對(duì)比結(jié)果

適用場(chǎng)景 %s format f
重復(fù)出現(xiàn)同樣的變量 ?
需要按位置傳參
代碼盡可能簡(jiǎn)潔易懂
數(shù)字格式化
無(wú)腦快速傳參
變量很多
編寫(xiě)SQL
提前預(yù)備模板字符串 ?
變量名變化頻繁 ?
代碼閱讀友好

format在其多樣的寫(xiě)法基礎(chǔ)上,幾乎全能了
但我還是更偏愛(ài)f

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洼畅,一起剝皮案震驚了整個(gè)濱河市不见,隨后出現(xiàn)的幾起案子柑营,更是在濱河造成了極大的恐慌蒋纬,老刑警劉巖萤彩,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粪滤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雀扶,警方通過(guò)查閱死者的電腦和手機(jī)杖小,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)愚墓,“玉大人予权,你說(shuō)我怎么就攤上這事±瞬幔” “怎么了扫腺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)村象。 經(jīng)常有香客問(wèn)我笆环,道長(zhǎng),這世上最難降的妖魔是什么厚者? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任躁劣,我火速辦了婚禮,結(jié)果婚禮上库菲,老公的妹妹穿的比我還像新娘账忘。我一直安慰自己,他們只是感情好蝙昙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布闪萄。 她就那樣靜靜地躺著,像睡著了一般奇颠。 火紅的嫁衣襯著肌膚如雪败去。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天烈拒,我揣著相機(jī)與錄音圆裕,去河邊找鬼广鳍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吓妆,可吹牛的內(nèi)容都是我干的赊时。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼行拢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祖秒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起舟奠,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竭缝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后沼瘫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抬纸,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年耿戚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了湿故。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膜蛔,死狀恐怖坛猪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情飞几,我是刑警寧澤砚哆,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布独撇,位于F島的核電站屑墨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纷铣。R本人自食惡果不足惜卵史,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搜立。 院中可真熱鬧以躯,春花似錦、人聲如沸啄踊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颠通。三九已至址晕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顿锰,已是汗流浹背谨垃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工启搂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刘陶。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓胳赌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親匙隔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疑苫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容