浅谈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'"

总结

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

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

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

- 完 -
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python字符格式化可以使用三种方式: 1. 百分号(%)格式化字符串 这是Python早期版本使用的一种格式化字符串的方式,类似于C语言的printf函数。它的基本语法为: ```python string % value ``` 其,string是要格式化字符串,value是要替换的值。可以使用占位符来指定要替换的值的类型和格式,例如: - %s:字符串 - %d:整数 - %f:浮点数 例如,将一个字符的占位符替换为指定的值: ```python name = "Alice" age = 20 height = 1.65 info = "My name is %s, I'm %d years old, and my height is %.2f meters." % (name, age, height) print(info) ``` 输出结果为:My name is Alice, I'm 20 years old, and my height is 1.65 meters. 2. format()方法格式化字符串 这是Python推荐使用的一种格式化字符串的方式,它的基本语法为: ```python string.format(value1, value2, ...) ``` 其,string是要格式化字符串,value1、value2等是要替换的值。可以使用占位符{}来指定要替换的值的类型和格式,例如: - {}:自动编号 - {0}、{1}:手动编号 - {:s}:字符串 - {:d}:整数 - {:.2f}:浮点数 例如,将一个字符的占位符替换为指定的值: ```python name = "Alice" age = 20 height = 1.65 info = "My name is {}, I'm {} years old, and my height is {:.2f} meters.".format(name, age, height) print(info) ``` 输出结果为:My name is Alice, I'm 20 years old, and my height is 1.65 meters. 3. f-string格式化字符串 这是Python 3.6及以上版本新增的一种格式化字符串的方式,它的基本语法为: ```python f"string {value}" ``` 其,string是要格式化字符串,value是要替换的值。可以在占位符使用表达式来计算要替换的值,例如: - {expression}:表达式 - {name}:变量名 例如,将一个字符的占位符替换为指定的值: ```python name = "Alice" age = 20 height = 1.65 info = f"My name is {name}, I'm {age} years old, and my height is {height:.2f} meters." print(info) ``` 输出结果为:My name is Alice, I'm 20 years old, and my height is 1.65 meters.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但老师

要是看起来爽 求打赏一耳光

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值