浅谈Python中的格式化字符%s format f

背景

Python环境中,有3种方法格式化字符串,分别是%s,formatf,这些格式化字符串方法各有其优劣势,现对比下,方便日后参考


环境

  • Python 3.8


对比

以入门案例再次为例吧,我们需要根据用户名,加上hello,组成一个招呼. 假设我的用户名是Dan,预期输出

hello Dan

1. 基础使用方法

%s方式会这样写

'hello %s' % 'Dan'

format方式会这样写

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

f方式必须得用到变量,所以留到下一轮对比

在不使用变量的情况下,这一轮的比较结果:

  • %s代码简洁,纯字符串都不像使用了代码
  • format代码简洁,加入了函数名显得专业
  • f无法使用

2. 部分使用变量

仅将传入的姓名使用变量, 格式化字符不使用,会是下面这样

name = 'Dan'    # 变量赋值

%s方式

'hello %s' % name

format方式有3种

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

f方式

f'hello {name}'

使用部分变量的情况下,这一轮的比较结果

  • %s代码依然简洁
  • format虽专业但略显拖沓,但是方式多样,优势不输
  • f代码超级简洁易懂!

私以为在这种情况下,f最能体现Python精神

3. 全部使用变量

将模板,传入姓名全部使用变量,会是下面这样

  • %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}'

使用全部变量的情况下,这一轮的比较结果

  • %sf略显累赘
  • format的多样和专业在此更显优势

4. 数字格式

在使用字符串格式的过程中,我们最长使用的是数字格式,尤其是对于浮点数的转换,一般是变成整数,或者保留例如2位的小数点
假设这里有一个数字如下,我们需要实现千分位+保留2位小数

num = 12345.6789

预期结果如下

本月营业额为: 12,345.68元

%s找不到实现方式🤣,主要是没有千分位,小数点后2位写做%.2f
format仍然是上述3种实现方式

'本月营业额为: {:,.2f}元'.format(num)          # 无参数名
'本月营业额为: {0:,.2f}元'.format(num)     # 位置参数,从0开始
'本月营业额为: {num:,.2f}元'.format(num=num)   # 指定参数名

f方式

f'本月营业额为: {num:,.2f}元'

相对复杂的数字格式这一轮,结果如下

  • format与仍然多样而专业
  • f在此更简洁,格式化方面与format一致
  • %s由于功能简单而无法直接实现

5. 实际使用

在实际使用过程中,每个人有不同的习惯,个人使用习惯是上面第2项,也就是

模板字符串固定,使用的时候直接写出
可能变化字符串使用变量赋值,方便更改变量

通常格式化的使用场景有

  • 日志输出
  • 话术播报
  • 邮件正文
  • SQL组装
  • 等等等等...

以SQL组装为例

一般情况下,需要传入的参数比较少,我会直接写%s,因为简单无脑,还是第一反应

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

也会写format,不带参数的那种

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

位置参数例如{0}这种,和%s是实际上一样的作用.正常能写%s就不会写{0}


insert数据经常比较变态的是,拼装SQL由于字段超长,需要些很多很多变量,上面那种位置传参极容易导致人工写错位置传入不对的bug. 例如这个表有10个字段,如果按照位置参数写会变成这样

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},{b},{c},{d},{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)

这种不需要位置对,只需要传入的参数对,谁前谁后完全不打紧
但是我还是更喜欢f这么简洁👇,不用考虑位置,也不用写3遍变量

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

有的时候,同一个参数会出现在SQL脚本多处,这个时候用format会省心太多

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都不能代替.因为format还有外在变量
假设上面的字符串,我们需要把变量从date替换为day,替换之前,formatf写法差不多,替换后,f就要麻烦很多
format只需要改动一下传入的参数名

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却需要改动全部变量

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


总结

每种场景都有不同的需求,在此总结一下三种格式化字符串的对比结果

适用场景 %s format f
重复出现同样的变量  
需要按位置传参
代码尽可能简洁易懂
数字格式化
无脑快速传参
变量很多
编写SQL
提前预备模板字符串  
变量名变化频繁  
代码阅读友好

format在其多样的写法基础上,几乎全能了
但我还是更偏爱f

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容