格式化字符串文字也称为f字符串自Python3。6以来就已经存在,所以我们都知道它们是什么以及如何使用它们。然而,你可能不知道fstrings的一些比较实用跟方便的功能。因此让这篇文章一下带你了解一下fstrings的一些功能,希望你在日常编码中使用的这些很棒的fstrings功能。日期和时间格式 使用f字符串应用数字格式非常常见,但你知道你还可以格式化日期和时间戳字符串吗?importdatetimetodaydatetime。datetime。today()print(f{today:Ymd})20230203print(f{today:Y})2023 fstrings可以像使用datetime。strftime方法一样格式化日期和时间。当你意识到除了文档中提到的几种格式之外还有更多格式时,这非常好。Pythonstrftime还支持底层C实现支持的所有格式,这可能因平台而异,这就是文档中未提及的原因。话虽如此,你仍然可以利用这些格式并使用例如F,它等效于Ymd或T等效于H:M:S,还值得一提的是x和X分别是语言环境首选的日期和时间格式。这些格式的使用显然不限于f字符串。有关时间格式的完整列表请参阅:https:manpages。debian。orgbullseyemanpagesdevstrftime。3。en。html变量名和调试 fstring功能(从Python3。8开始)最近新增的功能之一是能够打印变量名称和值:x10y25print(fx{x},y{y})x10,y25print(f{x},{y})Better!(3。8)x10,y25print(f{x:。3f})x10。000 此功能称为调试,可以与其他修饰符结合使用。它还保留空格,因此f{x}和f{x}将产生不同的字符串。字符串表示 打印类实例时,str默认使用类的方法来表示字符串。但是,如果我们想强制使用repr,我们可以使用!r转换标志:classUser:definit(self,firstname,lastname):self。firstnamefirstnameself。lastnamelastnamedefstr(self):returnf{self。firstname}{self。lastname}defrepr(self):returnfUsersnameis:{self。firstname}{self。lastname}userUser(John,Doe)print(f{user})JohnDoeprint(f{user!r})Usersnameis:JohnDoe 我们也可以只repr(somevar)在f字符串内部调用,但使用转换标志是一个很好的习惯和简洁的解决方案。fstrings杰出的性能表现 强大的功能和语法糖通常会带来性能损失,但对于f字符串而言情况并非如此:pythonmtimeitsx,yHello,Worldf{x}{y}fromstringimportTemplatex,yHello,Worldprint(f{x}{y})39。6nsecperloopFast!print(xy)43。5nsecperloopprint(。join((x,y)))58。1nsecperloopprint(ss(x,y))103nsecperloopprint({}{}。format(x,y))141nsecperloopprint(Template(xy)。substitute(xx,yy))1。24usecperloopSlow! 上面的示例使用timeit如下模块进行了测试:pythonmtimeitsx,yHello,Worldf{x}{y}正如你所看到的,f字符串实际上是Python提供的所有格式化选项中最快的。因此,即使你更喜欢使用一些较旧的格式化选项,你也可以考虑切换到fstrings只是为了提高性能。格式化规范的全部功能 Fstrings支持Python的FormatSpecificationMiniLanguage,所以你可以在它们的修饰符中嵌入很多格式化操作:texthelloworldCentertext:print(f{text:15})helloworldnumber1234567890Setseparatorprint(f{number:,})1,234,567,890number123Addleadingzerosprint(f{number:08})00000123 Python的FormatSpecificationMiniLanguage不仅仅包括格式化数字和日期的选项。它允许我们对齐或居中文本、添加前导零空格、设置千位分隔符等等。所有这些显然不仅适用于f字符串,而且适用于所有其他格式设置选项。嵌套fstrings 如果基本的fstrings不足以满足你的格式化需求,你甚至可以将它们相互嵌套:number254。3463print(f{f{number:。3f}:10s})254。346 你可以将fstrings嵌入fstrings中以解决棘手的格式化问题,例如将美元符号添加到右对齐的浮点数,如上所示。 如果你需要在格式说明符部分使用变量,也可以使用嵌套的f字符串。这也可以使f字符串更具可读性:importdecimalwidth8precision3valuedecimal。Decimal(42。12345)print(foutput:{value:{width}。{precision}})output:42。1条件格式 在上面带有嵌套f字符串的示例之上,我们可以更进一步,在内部f字符串中使用三元条件运算符:importdecimalvaluedecimal。Decimal(42。12345)print(fResult:{value:{4。3ifvalue100else8。3}})Result:42。1valuedecimal。Decimal(142。12345)print(fResult:{value:{4。2ifvalue100else8。3}})Result:142lambda表达式 如果你想突破fstrings的限制,同时让阅读你代码的人觉得你很牛逼,那么你可以使用lambdasprint(f{(lambdax:x2)(3)})9 在这种情况下,lambda表达式周围的括号是强制性的,因为:否则将由f字符串解释。结束语 正如我们在这里看到的,fstrings确实非常强大,并且具有比大多数人想象的更多的功能。然而,大多数这些未知特性在Python文档中都有提及,因此我建议你不仅阅读fstrings,还阅读你可能使用的任何其他Python模块特性的文档页面。深入研究文档通常会帮助你发现一些非常有用的功能。