背景
在Python
环境中,有3种方法格式化字符串,分别是%s
,format
和f
,这些格式化字符串方法各有其优劣势,现对比下,方便日后参考
环境
-
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}'
使用全部变量的情况下,这一轮的比较结果
-
%s
和f
略显累赘 -
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
,替换之前,format
和f
写法差不多,替换后,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
网友评论