资讯专栏INFORMATION COLUMN

你所不知道的Python | 字符串格式化的演进之路

Blackjun / 608人阅读

摘要:然而为了让我们更方便的使用这个常用功能,语言本身也在对字符串格式化方法进行迭代。不少使用过的小伙伴会知道其中的模板字符串,采用直接在字符串中内嵌变量的方式进行字符串格式化操作,在版本中也为我们带来了类似的功能字面量格式化字符串,简称。

字符串格式化对于每个语言来说都是一个非常基础和常用的功能,学习Python的同学大概都知道可以用%语法来格式化字符串。然而为了让我们更方便的使用这个常用功能,语言本身也在对字符串格式化方法进行迭代。

Python 2.6以前:%操作符

在Python 2.6出现之前,字符串迭代只有一种方法,就是%(也是取模)操作符,%操作符支持unicode和str类型的Python字符串,效果和C语言中的sprintf()方法相似,下面是一个使用%格式化字符串的例子:

print("I"m %s. I"m %d year old" % ("Tom", 27))

%符号前面使用一个字符串作为模板,模板中有标记格式的占位符号,%后面是一个tuple或者dict,用来传递需要格式化的值。占位符控制着显示的格式,下面列表展示了占位符的种类:

占位符 内容
%d 十进制整数
%i 十进制整数
%o 八进制整数
%u 无符号整数
%x 无符号十六进制(小写)
%X 无符号十六进制(大写)
%e 浮点型(科学记数法,小写)
%E 浮点型(科学记数法,大写)
%f 浮点数
%F 浮点数
%g 浮点型,如果小数位数超过4位,使用科学记数法表示(小写)
%G 浮点型,如果小数位数超过4位,使用科学记数法表示(大写)
%c 单个字符
%r 字符串(调用repr()方法生成)
%s 字符串(调用str()方法生成)

除了对数据类型的指定,%操作符还支持更复杂的格式控制:

%[数据名称][对齐标志][宽度].[精度]类型
名称 内容
数据名称 数据名称用于字典赋值,如果%符号后面传递的数组就不需要填写了
对齐标志 有+、-、0、‘ ’四种,+表示显示正负数符号,-表示左对齐,空格表示在左侧填充一个空格,0表示用0填充
宽度 表示格式化后的字符串长度,位数不足用0或空格补齐
精度 小数点后的位数
类型 数据类型(参考占位符种类)

例如print("%053f" % "12.34")会输出0012.340

Python 2.6:format函数

到Python2.6时,出现了一种新的字符串格式化方式,str.format()函数,相比于%操作符,format函数使用{}和:代替了%,威力更加强大,在映射关系方面,format函数支持位置映射、关键字映射、对象属性映射、下标映射等多种方式,不仅参数可以不按顺序,也可以不用参数或者一个参数使用多次,下面通过几个例子来说明。

"{1} {0}".format("abc", 123)  # 可以不按顺序进行位置映射,输出"123 abc"

"{} {}".format("abc", 123)  # 可以不指定参数名称,输出"abc 123"

"{1} {0} {1}".format("abc", 123)  # 参数可以使用多次,输出"123 abc 123"

"{name} {age}".format(name="tom", age=27)  # 可以按关键字映射,输出"tom 27"

"{person.name} {person.age}".format(person=person)  # 可以按对象属性映射,输出"tom 27"

"{0[1]} {0[0]}".format(lst)  # 通过下标映射

可以看到,format函数比%操作符使用起来更加方便,不需要记住太多各种占位符代表的意义,代码可读性也更高。在复杂格式控制方面,format函数也提供了更加强大的控制方式:

[[填充字符]对齐方式][符号标志][#][宽度][,][.精度][类型]

例如:

"{:S^+#016,.2f}".format(1234)  # 输出"SSS+1,234.00SSSS"

我们以上面的代码为例,通过表格说明一下format格式控制参数:

类型 说明 示例说明
填充字符 不填时默认用空格填充 S表示用S填充
对齐方式 ^表示居中对齐、<表示左对齐、>表示右对齐 ^表示居中对齐,左右位数不足部分会用填充字符填充
符号标志 +表示有符号(正数前显示+,负数前显示-),空格表示整数前加一个空格以和负数对齐 +表示正数前显示空格
# 表示是否在二进制、八进制、十六进制前显示0b、0o、0x等符号 #表示显示进制符号,由于是十进制,所以不显示
宽度 表示输出字符串的宽度 16表示字符串宽度为16,不足部分会补齐
, 表示使用,作为千位分隔符 ,表示使用千位分隔符
精度 表示小数点后数字位数 .2表示精度为2为
类型 s表示字符串类型,c表示字符类型,bod分别表示二八十进制,xX表示小写和大写十六进制,eE表示小写和大写的科学记数法,f表示浮点型 f表示浮点型数字

可以看到format函数在%基础上丰富了格式控制种类,并且使输出更容易。

Python 3.6:f-string

不少使用过ES6的小伙伴会知道其中的模板字符串,采用直接在字符串中内嵌变量的方式进行字符串格式化操作,Python在3.6版本中也为我们带来了类似的功能:Formatted String Literals(字面量格式化字符串),简称f-string。

f-string就是以f""开头的字符串,类似u""和b"",字符串内容和format方法中的格式一样,但是可以直接将变量带入到字符串中,可读性进一步增加,例如:

amount = 1234
f"请转账给我{amount:,.2f}元"  # "请转账给我1,234.00元"

同时,f-string的性能是比%和format都有提升的,我们做一个简单的测试,分别使用%操作符、format和f-string将下面语句执行10000次:

"My name is %s and i"m %s years old." % (name, age)
"My name is {} and i"m {} years old.".format(name, age)
f"My name is {name} and i"m {age} years old."

用时结果如下:

总结

如果你的项目使用的Python版本已经提升到3.6,f-string格式化是首选方式,不仅在保持功能强大的同时语义上更容易理解,而且性能也有较大的提升。如果项目还没有提升到3.6或者使用的2.7,更建议使用format,虽然性能上没有优势,但是语义上还是比%操作符更加便于理解的,功能也更加强大。

欢迎关注我的公众号【Python私房菜】

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41856.html

相关文章

  • 所不知道Python | 函数参数演进之路

    摘要:有一点需要注意的是,默认参数需要设置在必选参数后面,并且默认参数既可以通过位置调用,也可以通过关键字调用。通过位置指定参数通过位置指定参数报错,默认参数必须在必选参数后面参数默认值既支持关键字参数,也支持仅限关键字参数。 showImg(https://segmentfault.com/img/bVbdxcE?w=1224&h=618); 函数参数处理机制是Python中一个非常重要的...

    FingerLiu 评论0 收藏0
  • 所不知道Python | 字符连接秘密

    摘要:私房菜输出私房菜方法使用方法方法是中出现的一种代替操作符的字符串格式化方法,同样可以用来连接字符串。私房菜方法使用方法字符串有一个内置方法,其参数是一个序列类型,例如数组或者元组等。 showImg(https://segmentfault.com/img/bVbcR8e?w=578&h=375); 字符串连接,就是将2个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题...

    alin 评论0 收藏0
  • 20170917 前端开发周报:JavaScript函数式编程、作用域和闭包

    摘要:用函数式编程对进行断舍离当从业的老司机学会函数式编程时,他扔掉了的特性,也不用面向对象了,最后发现了真爱啊作用域和闭包作用域和闭包在里非常重要。旨在帮助非函数式编程的同学,能快速切入到函数式编程的理念。 1、用函数式编程对JavaScript进行断舍离 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! https:/...

    tomener 评论0 收藏0
  • 20170917 前端开发周报:JavaScript函数式编程、作用域和闭包

    摘要:用函数式编程对进行断舍离当从业的老司机学会函数式编程时,他扔掉了的特性,也不用面向对象了,最后发现了真爱啊作用域和闭包作用域和闭包在里非常重要。旨在帮助非函数式编程的同学,能快速切入到函数式编程的理念。 1、用函数式编程对JavaScript进行断舍离 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! https:/...

    cyixlq 评论0 收藏0
  • 20170917 前端开发周报:JavaScript函数式编程、作用域和闭包

    摘要:用函数式编程对进行断舍离当从业的老司机学会函数式编程时,他扔掉了的特性,也不用面向对象了,最后发现了真爱啊作用域和闭包作用域和闭包在里非常重要。旨在帮助非函数式编程的同学,能快速切入到函数式编程的理念。 1、用函数式编程对JavaScript进行断舍离 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! https:/...

    lentoo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<