正确使用Python f-string格式化字符串的7个层级

f-string是Python 3.6推出的一种简单而不同的字符串格式技术,可以优雅地表达Python字符串。除非您仍在使用旧的 Python 版本,否则在格式化字符串时,f 字符串绝对应该是您的首选。因为它可以通过一个迷你语法满足您的所有要求,甚至运行字符串的表达式。本文将深入探讨这项技术从初级到深度的7个层次。在了解它们之后,您可能会成为字符串格式化大师。

 

 

1. 轻松从变量显示值

使用 f 字符串只需要做两件事:

  • 在字符串前添加一个小写的f;

  • 使用f字符串中以{variable_name}插值变量.

name = 'Yang'title = 'full stack hacker'print(f'{name} is a {title}.')# Yang is a full stack hacker.

如上所示,在 f 字符串机制的帮助下,我们可以编写简单且更少的代码,以便在字符串中显示更多代码。它完美地呼应了 Python 的禅宗。

"简单总比复杂好。

2. 数字格式化

有时仅仅显示原始值可能无法满足我们的需求,但是直接修改原始变量通常不是个好主意,因为变量可能在其他地方使用。不用担心,Python f字符串还支持"格式规范迷你语言",它使我们能够根据自己喜欢的方式在 f 字符串中格式化值,尤其是数字。

pi = 3.1415926print(f'Pi is approximately equal to {pi:.2f}')# Pi is approximately equal to 3.14
id = 1 # need to print a 3-digit numberprint(f"The id is {id:03d}")# The id is 001
N = 1000000000 # need to add separatorprint(f'His networth is ${N:,d}')# His networth is $1,000,000,000

以上示例仅显示了冰山一角。对于格式规格语法的完整列表,相应的官方文档是您最好的朋友。

 

3. 正确打印特殊字符

我们可以通过 f 字符串打印这些字符或其他特殊字符吗?比如''和{}。是的,当然。但语法有点棘手。让我们来看看。

 

3.1 打印引号

正如我们所知,反斜线\是常用的转义字符,用于调用对其以下字符的替代解释。对于 f 字符串,我们需要注意一条规则:\在 f 字符串表达式的括号{}中不起作用。

name = 'Yang'# Correct Way:print(f'\'{name}\' is a full stack hacker.')# 'Yang' is a full stack hacker.
# 错误方式:print(f'{\'name\'} is a full stack hacker.')# SyntaxError: f-string expression part cannot include a backslash

 

3.2 打印双括号{}

用 f字符串打印{}的方法是不同的, 非常容易出bug。这次我们不能使用反斜线。

name = 'Yang'
# 1print(f'{name} is a full stack hacker.')# 'Yang' is a full stack hacker.
# 2print(f'{{name}} is a full stack hacker.')# {name} is a full stack hacker.
# 3print(f'{{{name}}} is a full stack hacker.')# {Yang} is a full stack hacker.
# 4print(f'{{{{name}}}} is a full stack hacker.')# {{name}} is a full stack hacker.
# 5print(f'{{{{{name}}}}} is a full stack hacker.')# {{Yang}} is a full stack hacker.

如上例所示,该变量是作为f-字符串的括号还是变量处理取决于其周围的括号数。如果您不知道这种奇怪的机制,则容易出现错误。

 

3.3 打印反斜线\

打印反斜线\很简单:只需使用双反斜线打印。但是不要将它们添加到 f 字符串表达式括号当中。

name = 'Yang'
print(f'\\{name}\\ is a full \\stack hacker.')# \Yang\ is a full \stack hacker.
#错误的print(f'{\\name\\} is a full \\stack hacker.')# SyntaxError: f-string expression part cannot include a backslash

 

4. 小心打印字典值

将字典的值应用到 f 字符串中也容易出现错误。我们必须使用不同的引号来描述字典键和 f 字符串,如下所示。如果f字符串用双引号表示,那么变量里的字典键必须用单引号。

Hacker = {'name': 'Yang'}
print(f"{Hacker['name']} is a hacker")# Yang is a hackerprint(f'{Hacker["name"]} is a hacker')# Yang is a hackerprint(f'{Hacker['name']} is a hacker')# 语法错误 SyntaxError: invalid syntaxprint(f"{Hacker["name"]} is a hacker")# 语法错误 SyntaxError: invalid syntax

如上所示,如果我们对键名和 f 字符串都使用相同的单引号或双引号, Python 会对我们的代码感到困惑, 从而报错。

 

5. 正确处理多行 F 字符串

为了使我们的代码更易读,有必要使用多行书写一长串字符。但如果是 f 字符串,不要忘记在每行之前添加f。

ame = 'Yang'
# 错误方式print(f"{name} is a hacker." "{name} is also a top writer." "{name} writes on Medium." )# Yang is a hacker.{name} is also a top writer.{name} writes on Medium.
# 正确方式print(f"{name} is a hacker." f"{name} is also a top writer." f"{name} writes on Medium." )# Yang is a hacker.Yang is also a top writer.Yang writes on Medium.

 

6. 像大师一样显示日期和时间

如果我们需要打印日期或时间,f 字符串将再次告诉我们它是多么方便:

from datetime import datetimetoday = datetime.today()print(f"Today is {today}")# Today is 2021-07-31 18:20:48.956829print(f"Today is {today:%B %d, %Y}")# Today is July 31, 2021print(f"Today is {today:%m-%d-%Y}")# Today is 07-31-2021

如上例所示,在 f 字符串的帮助下,我们可以使用我们任何喜欢的格式打印日期或时间。

 

7. 评估 F 字符串内的表达式

当我第一次知道 f 字符串时, 我简直不敢相信:我们可以在 f 字符串内运行 Python 表达式。如果是真的,还算是字符串吗?

 

我仔细阅读了 PEP 498,终于明白了:

F 字符串提供了一种将表达式嵌入字符串字面的方法。需要注意的是,f 字符串实际上是在运行时间评估的表达方式,而不是恒定的值。

因此,f 字符串与普通字符串不同,此功能赋予它更大的能力。例如,我们可以在它里面运行一个显示时间的功能。

from datetime import datetime
print(f"Today is {datetime.today()}")# Today is 2021-07-31 18:20:48.956829

 

 

结论

Python 中的 f-string是一个伟大的字符串格式化技术, 显示了 Python 是多么优雅。它非常强大,因为它不是一个普通的字符串,而是在运行时可以表达的字符串。对于一些特殊情况,它有特殊的规则,我们需要谨慎使用它。

posted @ 2021-08-18 11:15  侃豺小哥  阅读(768)  评论(0编辑  收藏  举报