格式化字符串文字(也称为f字符串)自Python3.6以来就已经存在,因此我们都知道它们是什么以及如何使用它们。但是,您可能不知道f字符串的一些比较有用和方便的功能。因此,让本文带您了解f字符串的一些功能,希望您在日常??编码中使用这些很棒的f字符串功能。日期和时间格式化使用f字符串应用数字格式化很常见,但您知道您还可以格式化日期和时间戳字符串吗?importdatetimetoday=datetime.datetime.today()print(f"{today:%Y-%m-%d}")#2023-02-03print(f"{today:%Y}")#2023f-strings可以像使用datetime.strftime方法一样格式化日期和时间。当您意识到有比文档中提到的几种格式更多的格式时,这很棒。Pythonstrftime还支持底层C实现支持的所有格式,这些格式可能因平台而异,这也是文档中未提及的原因。话虽如此,您仍然可以利用这些格式并使用例如%F相当于%Y-%m-%d或%T相当于%H:%M:%S,同样值得一提的是%x和%X分别是语言环境的首选日期和时间格式。这些格式的使用显然不限于f字符串。有关时间格式的完整列表,请参阅:https://manpages.debian.org/bullseye/manpages-dev/strftime.3.en.html变量名称和调试f-string功能(从Python3.8开始)最近添加的功能一个是打印变量名称和值的能力:x=10y=25print(f"x={x},y={y}")#x=10,y=25print(f"{x=},{y=}“)#更好的!(3.8+)#x=10,y=25print(f"{x=:.3f}")#x=10.000此功能称为“调试”,可以与其他修饰符结合使用。它还保留了空格,因此f"{x=}"和f"{x=}"将产生不同的字符串。当字符串表示打印类实例时,__str__默认使用类的方法来表示字符串。但是,如果我们想强制使用__repr__,我们可以使用!r转换标志:returnf"{self.first_name}{self.last_name}"def__repr__(self):returnf"用户的名字是:{self.first_name}{self.last_name}"user=User("John","Doe")print(f"{user}")#JohnDoeprint(f"{user!r}")#User'snameis:JohnDoe我们也可以只在f字符串中调用repr(some_var),但是使用转换标志是一个好的习惯和整洁的解决方案。f-strings的出色性能强大的功能和语法糖通常会带来性能损失,但f-strings并非如此:#python-mtimeit-s'x,y="Hello","World"''f"{x}{y}"'fromstringimportTemplatex,y="Hello","World"print(f"{x}{y}")#每个循环39.6纳秒-Fast!print(x+""+y)#43.5纳秒/循环打印("".join((x,y)))#58.1纳秒/循环打印("%s%s"%(x,y))#103纳秒/循环打印("{}{}".format(x,y))#141nsecperloopprint(Template("$x$y").substitute(x=x,y=y))#1.24usecperloop-慢!上面的示例使用以下timeit模块进行测试:python-mtimeit-s'x,y="Hello","World"''f"{x}{y}"'如您所见,f字符串实际上是Python提供的所有格式化选项中最快的。因此,即使您更喜欢使用一些较旧的格式化选项,您也可以考虑切换到f-strings以提高性能。格式规范的全部功能F-strings支持Python的格式规范迷你语言,因此您可以在其修饰符中嵌入许多格式操作:text="helloworld"#centertext:print(f"{text:^15}")#'helloworld'number=1234567890#Setseparatorprint(f"{number:,}")#1,234,567,890number=123#Addleadingzerosprint(f"{number:08}")#00000123Python格式规范迷你语言包含多个选项用于格式化数字和日期。它允许我们对齐或居中文本、添加前导零/空格、设置千位分隔符等。所有这些显然不仅适用于f字符串,还适用于所有其他格式设置选项。嵌套f字符串如果基本的f字符串不足以满足您的格式化需求,您甚至可以将它们相互嵌套:number=254.3463print(f"{f'${number:.3f}':>10s}")#'$254.346'您可以将f-strings嵌入f-strings中以解决棘手的格式问题,例如向右对齐的浮点数添加美元符号,如上所示。如果需要在格式说明符部分使用变量,也可以使用嵌套的f字符串。这也可以使f字符串更具可读性:importdecimalwidth=8precision=3value=decimal.Decimal("42.12345")print(f"output:{value:{width}.{precision}}")#'output:42.1'条件格式在上面带有嵌套f字符串的示例的基础上,我们可以更进一步,在内部f字符串中使用三元条件运算符:importdecimalvalue=decimal.Decimal("42.12345")print(f'Result:{value:{"4.3"ifvalue<100else"8.3"}}')#Result:42.1value=decimal.Decimal("142.12345")print(f'Result:{value:{"4.2"ifvalue<100else"8.3"}}')#Result:142lambdaexpressions如果你想突破f-strings的限制,让读你代码的人觉得你牛逼,那么你可以使用lambdasprint(f"{(lambdax:x**2)(3)}")#9在这种情况下,lambda表达式周围的括号是强制性的,因为:否则由f字符串解释。结论正如我们在这里看到的那样,f弦确实非常强大,并且具有比大多数人想象的更多的功能。然而,大多数这些“未知”特性在Python文档中都有提及,因此我建议您不仅阅读f-strings,还阅读您可能使用的任何其他Python模块/特性的文档页面。深入研究文档通常会帮助您发现一些非常有用的功能。
