Python3中的f-Strings增强版字符串格式化方法
在Python3.6提供f-Strings新的字符串格式化语法。不仅更加可读、简洁,相比其他方式也不易造成错误,而且还更快。
看完本文你将学习到如何以及为什么使用f-strings。正式开始之前,我们先看看之前格式化字符串语法。
1.旧式字符串格式化
在Python3.6之前,主要有两种方式格式化字符串:%-格式化和str.format()。下面我们先了解它们的用法以及局限性。
1.1%-格式化
这时Python的官方字符串格式化方法,从语言开始时就存在。官方文档明确提出不建议使用,并其他使用其他方式代替避免不必要的错误。
String对象内置了%操作,用于格式化字符串,请看示例:
>>>name="Eric" >>>"Hello,%s."%name 'Hello,Eric.'
如果需要插入多个变量,则需要使用元祖:
>>>name="Eric" >>>age=74 >>>"Hello,%s.Youare%s."%(name,age) 'HelloEric.Youare74.'
上面两个实例还比较好理解,但当使用多个参数,字符串变得很长时,可读性会下降;因为冗长易导致错误,故不建议使用。
1.2.使用str.format()方法
这种较新的方式是Python2.6版本提供的。是%格式化的升级方式。使用正常的方法调用实现字符串转换。其内部通过类的__format__()方法实现。使用时被替换的地方使用花括号标记。
下面看个示例:
>>>"Hello,{}.Youare{}.".format(name,age) 'Hello,Eric.Youare74.'
也可以通过索引方式引用变量:
>>>"Hello,{1}.Youare{0}.".format(age,name) 'Hello,Eric.Youare74.'
但如果使用变量名作为参数,而对于值也是对象属性,则需要在实际参数中传入对象。
>>>person={'name':'Eric','age':74} >>>"Hello,{name}.Youare{age}.".format(name=person['name'],age=person['age']) 'Hello,Eric.Youare74.'
我们也可以使用**进行简化字典传输:
>>>person={'name':'Eric','age':74} >>>"Hello,{name}.Youare{age}.".format(**person) 'Hello,Eric.Youare74.'
str.format方式对%格式化进行了有限的升级,但仍不是最好的。当传入多个参数时,还是很冗余且易错。如果字典值传递给.format()变量,可以用.format(**some_dict)对其解包,并使用键索引对应值,但是有更好的办法进行处理。
2.增强版字符串格式化方式f-Strings
f-Strings可以解决上述问题,而且容易使用且十分有效。2015年8月在Python3.6版中提供。
也称为格式化字符串自变量,f开头的字符串中花括号括起来的变量会被替换。该表达式在运行时被评估并使用__format__方法进行格式化。下面看一些示例:
>>>name="Eric" >>>age=74 >>>f"Hello,{name}.Youare{age}." 'Hello,Eric.Youare74.'
与str.format()方法类似但更简洁。使用大写字符F也行:
>>>F"Hello,{name}.Youare{age}." 'Hello,Eric.Youare74.'
2.1.格式化任意表达式
因为f-string是在运行时评估,因此可以放入任何有效Python表达式,这可以实现漂亮的任务。
>>>f"{2*37}" '74'
直接调用函数:
>>>defto_lowercase(input): ...returninput.lower() >>>name="EricIdle" >>>f"{to_lowercase(name)}isfunny." 'ericidleisfunny.'
干脆直接调用方法:
>>>f"{name.lower()}isfunny." 'ericidleisfunny.'
当然也可以是自定义类。假设我们定义下面类:
classComedian: def__init__(self,first_name,last_name,age): self.first_name=first_name self.last_name=last_name self.age=age def__str__(self): returnf"{self.first_name}{self.last_name}is{self.age}." def__repr__(self): returnf"{self.first_name}{self.last_name}is{self.age}.Surprise!"
调用方法代码:
>>>new_comedian=Comedian("Eric","Idle","74") >>>f"{new_comedian}" 'EricIdleis74.'
str()和repr()方法用于实现以字符串形式表示对象。所以类定义时确保至少包括它们中的一个。如果需要挑选一个,则为repr(),因为在使用__str__()的地方都可以使用__repr__()。
由__str__()返回的字符串是对象的非正式字符串表示,应该是可读的。由__repr__()返回的字符串是官方表示,应该是明确的(外层多了引号,长度是原来长度+2)。直接调用str()和repr()比直接使用_str__()和_repr__()要好。
缺省情况下使用str函数,但可以使用!r标识明确调用repr:
>>>f"{new_comedian}" 'EricIdleis74.' >>>f"{new_comedian!r}" 'EricIdleis74.Surprise!'
2.2.多行f-strings
我们可以格式化多行字符串:
>>>name="Eric" >>>profession="comedian" >>>affiliation="MontyPython" >>>message=( ...f"Hi{name}." ...f"Youarea{profession}." ...f"Youwerein{affiliation}." ...) >>>message 'HiEric.Youareacomedian.YouwereinMontyPython.'
但需要在每行前面增加f。下面代码不工作:
>>>message=( ...f"Hi{name}." ..."Youarea{profession}." ..."Youwerein{affiliation}." ...) >>>message 'HiEric.Youarea{profession}.Youwerein{affiliation}.'
我们看到没有f的行没有被解析。
对于多行我们也可以使用反斜杠进行换行:
>>>message=f"Hi{name}."\ ...f"Youarea{profession}."\ ...f"Youwerein{affiliation}." ... >>>message 'HiEric.Youareacomedian.YouwereinMontyPython.'
但如何使用三个分号“““:
>>>message=f""" ...Hi{name}. ...Youarea{profession}. ...Youwerein{affiliation}. ...""" ... >>>message '\nHiEric.\nYouareacomedian.\nYouwereinMontyPython.\n'
3.总结
本文介绍了Python3.6提供的增强字符串格式化方法。通过与之前的两种方法对比,f-string缺省更加简洁、易读。
到此这篇关于Python3中的f-Strings增强版字符串格式化方法的文章就介绍到这了,更多相关Python格式化字符串f-string内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。