Python语法分析之字符串格式化
前序
Thereshouldbeone-andpreferablyonlyone-obviouswaytodoit.
————theZenofPython
意译:Python提倡用一种,而且最好是只有一种方法来完成一件事
虽然Python有以上的提倡,但却在字符串格式化方面,没有做到这一点。
字符串格式化
敲黑板,划重点:在Python中有至少三种常见方式实现字符串格式化:
- %-formatting格式(Python2.6以前,推荐输出时使用)
- str.format()格式(Python2.6,推荐字符串拼接使用)
- f-string格式(Python3.6,推荐使用)
1、printf风格的字符串格式化(%-formatting格式)
Python2.6之前只有这一种方式,使用与C中printf函数一样的语法。
基础语法:format%value(其中format为一个字符串),在format中的%转换标记符将被替换为零个或者多个value条目
基础用法
#codinginPython3.7 print('thisis%sblogwrittenin%d%%%02d%%%d%02d:%d:%06.2f' %('TinyDolphin',2019,5,31,9,30,22.3333)) #thisisTinyDolphinblogwrittenin2019%05%3109:30:022.33 print('title=%(title)s,author=%(name)s' %{'name':'TinyDolphin','title':'Python语法浅析:字符串格式化'}) #title=Python语法浅析:字符串格式化,author=TinyDolphin print('%0*.*f'%(6,2,2.345)) #002.35
printf语法
针对这种格式化操作,重要知识点如下:
1、针对这些转换标记字符,必须按照以下顺序:
%-->(name)-->'#'、'-'、'0'、'+'、''-->m.n|m-->d、s、r、f
2、常用转换类型:
- %s格式化字符串(str()函数)
- %r格式化字符串(repr()函数)
- %d格式化整数
- %f格式化浮点数字,可指定小数点后的精度
3、常用的转换标记字符:
- -用做左对齐
- +在正数前面显示加号(+)
- #在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
- 0显示的数字前面填充'0',而不是默认的空格
- %'%%'输出一个单一的'%'
- m.n表示m是显示的最小总宽度,n是小数点后的位数
- *定义宽度或者小数点精度(用在不能预先指定m.n的值)
- (var)映射变量(字典参数)
2、字符串的方式(str.format()格式)
Python2.6开始,新增了一种格式化字符串的函数str.format(),它增强了字符串格式化的功能,比如:支持位置映射、关键字映射、对象属性映射、下标映射等多种方式
基本语法是通过{}和:来代替以前的%,例如:'%03.2f'被改写成'{:03.2f}'。
两个格式化方法:
str.format(*args,**kwargs)
字符串的格式化操作。
str包含字符串字面值AND{}括起来的替换域。
每个替换域:位置参数的索引OR关键字参数的名称
str.format_map(mapping)
类似于str.foramt(**mapping)
不同之处:mapping会被直接使用而不是复制到一个dict。
PS:Python存在内置函数format(value,format_spec):会转换成type(value).format(value,format_spec)
基础用法
1、按位置访问参数
'{0}-{1}-{2}'.format('a','b','c')#'a-b-c' '{}-{}-{}'.format('a','b','c')#'a-b-c' '{2}-{1}-{0}'.format('a','b','c')#'c-b-a' '{2}-{1}-{0}'.format(*'abc')#'c-b-a' args=['a','b','c'] '{2}-{1}-{0}'.format(*args)#'c-b-a' '{0}-{1}-{0}'.format(*['abc','def'])#'abc-def-abc'
2、按名称访问参数
'{a}-{b}'.format(a='1',b='2')#'1-2' kwargs={'a':'1','b':'2'} '{a}-{b}'.format(**kwargs)#'1-2'
3、访问参数的属性
classPoint: def__init__(self,x,y): self.x,self.y=x,y def__str__(self): return'Point({self.x},{self.y})'.format(self=self) str(Point(3,4))#'Point(3,4)'
4、访问参数的项
point=(3,5) 'X:{0[0]}Y:{0[1]}'.format(point)#'X:3Y:5'
5、替代%s和%r(!s、!r)
'str()={!s};repr()={!r}'.format('a','a')#"str()=a;repr()='a'"
6、对齐文本以及制定宽度(:<、:^、:>)
'{:<20}'.format('leftaligned')#'leftaligned' '{:>20}'.format('rightaligned')#'rightaligned' '{:^20}'.format('centered')#'centered' #使用'*'作为填充字符 '{:*^20}'.format('centered')#'******centered******'
7、替代%+f、%-f和%f以及指定正负号(:+、:-、:)
'{:+f}{:+f}'.format(3.14,-3.14)#'+3.140000-3.140000' '{:f}{:f}'.format(3.14,-3.14)#'3.140000-3.140000'正号—>空格 '{:-f}{:-f}'.format(3.14,-3.14)#'3.140000-3.140000'=='{:f}{:f}'
8、替换%x和%o以及转换基于不同进位制的值(:x、:d、:o、:b)
'int:{0:d}hex:{0:x}oct:{0:o}bin:{0:b}'.format(42) #'int:42hex:2aoct:52bin:101010' 'int:{0:d}hex:{0:#x}oct:{0:#o}bin:{0:#b}'.format(42) #'int:42hex:0x2aoct:0o52bin:0b101010' #'#':加上前缀:0x、0o、0b
9、使用逗号作为千位分隔符(:,)
'{:,}'.format(123456789)#'123,456,789'
10、表示为百分数(:.2%)
'{:.2%}'.format(19/22)#'86.36%'
11、使用特定类型的专属格式化
importdatetime d=datetime.datetime(2019,6,10,22,5,13) '{:%Y-%m-%d%H:%M:%S}'.format(d) #'2019-06-1022:05:13'
12、嵌套参数以及更复杂的示例
略
3、格式化字符串字面值(f-string格式)
是带有'f'或'F'前缀的字符串字面值。
花括号以外的部分按其字面值处理,除了双重花括号'{{'或'}}'会被替换为相应的单个花括号。
语法如下:
单个花括号'{',标示一个替换字段(以Python表达式打头)
+可能有一个以叹号'!'标示的转换字符
+可能有一个以冒号':'标示的格式说明符
+以一个右花括号'}'作为结束
注意:格式化字符串字面值中的表达式:
- 当作正常的Python表达式处理(这一点很重要,也很强大)
- 不允许空表达式
- lambda表达式必须显式地加上圆括号
- 可以包含换行(例如三引号字符串中)
- 不能包含注释
- 从左到右被求值
如果指定了转换符,则表达式求值的结果会先转换再格式化。之后使用Python内置函数format()进行格式化。
基本用法
name='tinyDolphin' f'mynameis{name}'#'mynameistinyDolphin' f'mynameis{name!r}'#"mynameis'tinyDolphin'" width=10 precision=4 value=12.34567 f'{value:{width}.{precision}}'#'12.35' today=datetime.datetime(year=2019,month=6,day=10) f'{today:%B%d,%Y}'#'June10,2019' number=1024 f'{number:#0x}'#'0x400'
PS:与str.format()有一点不同:在str.format()中,非数字索引将自动转化为字符串,而f-strings则不会。
kwargs={'a':1,'b':2} #使用str.format() 'a={kwargs[a]}'.format(kwargs=kwargs)#'a=1' #使用f-string f"a={kwargs[a]}"#×发生异常 Traceback(mostrecentcalllast): File"",line1,in NameError:name'a'isnotdefined #正确使用f-string f"a={kwargs['a']}"#'a=1'
总结
从以下三个方面进行对比:
速度上:f-string>%-formatting>str.format()
功能上:f-string>str.format()>%-formatting
可读性:f-string>str.format()>%-formatting
对于速度验证,笔者就不在此进行验证了。
推荐使用场景:
%-formatting:Python2中,由于其性能优势,在涉及输出的一些操作时,优先推荐使用
str.format():Python2中,由于其功能优势,在涉及字符串拼接的一些操作时,优先推荐使用
f-string: Python3中,强烈推荐使用
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。