(附代码)正确使用 Python f-string 格式化字符串的 7 个层级

共 3994字,需浏览 8分钟

 ·

2021-09-16 08:13

点击左上方蓝字关注我们



一个专注于目标检测与深度学习知识分享的公众号

编者荐语
f-string是Python 3.6推出的一种简单而不同的字符串格式技术,可以优雅地表达Python字符串。除非您仍在使用旧的 Python 版本,否则在格式化字符串时,f 字符串绝对应该是您的首选。因为它可以通过一个迷你语法满足您的所有要求,甚至运行字符串的表达式。
转载自 | 咸鱼学Python


作者:杨周

译者:大江狗

原文:7 Levels of Using F-Strings in Python | by Yang Zhou


本文将深入探讨这项技术从初级到深度的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 是多么优雅。它非常强大,因为它不是一个普通的字符串,而是在运行时可以表达的字符串。对于一些特殊情况,它有特殊的规则,我们需要谨慎使用它。


END



双一流大学研究生团队创建,专注于目标检测与深度学习,希望可以将分享变成一种习惯!

整理不易,点赞支持一下吧↓

浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报