Python 开发人员使用%运算符在 Python 中执行字符串格式化的日子已经一去不复返了。

后来一段时间,当 Python 3.0 被引入时,%运算符的常用用法逐渐被在 String 对象上调用.format()方法取代。

快进到 Python 3.6 及更高版本,引入了f-string作为将 Python 表达式嵌入字符串常量的新方法。今天,许多人已经采用了这种变化。

图片

Python 中字符串格式化的简要概述。 (使用:carbon.now.sh)

对于不熟悉的人来说,在 Python 中使用 f-string 非常简单。只需在字符串前面加上fF,然后加上单引号、双引号甚至三引号即可创建字符串,例如f"Hello, Python!"

虽然你们中的大多数人可能已经熟悉 Python 中的 f-string 格式化,但今天我将展示一些在 Python 3.8+ 中使用 f-string 的鲜为人知的技巧。

涵盖的主题

  • 使用 f-string 进行更好的调试

  • 格式化float小数位、货币、datetime对象,并用 f-string 填充

  • 使用 f-string 进行转换(ASCII 和repr())

让我们潜入,好吗?


1.用于调试的 F 字符串

作为开发人员,我们经常发现自己使用 print 语句来调试我们的代码,仅仅是因为它们易于添加。

很有可能,我们会做这样的事情:

viewer = "🐊"
owner = "🐼"
editor = "🐓"

print(viewer)
print(owner)
print(editor)

忘记哪个值属于哪个变量的好方法。

这是我们终端上打印的输出:

🐊
🐼
🐓

老实说,使用上面的代码打印没有任何问题。

然而,当盯着一个装满其他调试器日志的终端时,人们可能很容易忘记打印出来的变量的顺序。在这样的用例中,使用 print 语句进行调试很快就会变成大海捞针。在我们的例子中:

🐊
🐼 -- Sorry, which variable does this belong to again?
🐓

在调试期间打印变量的更好方法

为了解决这个问题,我们可以做print(f’{variable_name=}’)代替。

print(f"{viewer=}")
print(f"{owner=}")
print(f"{editor=}")

# Stdout:

# viewer = "🐊"
# owner = "🐼"
# editor = "🐓"

使用 f-string 调试打印的更清晰方法!

即使我们必须用 f-string 语法包装我们的变量,一切都变得更加清晰。现在,我们在调试过程中永远不会忘记打印变量的顺序。

此外,以这种方式使用 f-string 可以保留空格,当我们在查看令人困惑的终端日志时,这在我们的调试过程中会很有帮助。

print(f"{viewer=     }")
print(f"{owner     =}")
print(f"{editor     =      }")

# Stdout:

# viewer=     '🐊'
# owner     ='🐼'
# editor     =      '🐓'

f-string 保留空格。

祖兹 100033 * *

2.字符串格式

除了使用 f-string 进行调试之外,我最喜欢 f-string 的最大特点是它的灵活性,它允许我们轻松地格式化我们的字符串。

与普通的旧字符串连接相比,使用 f-string 更容易读取、写入和维护字符串的输出,并且具有极大的灵活性。

当我们处理float类型变量时,可以演示最简单的示例。

如何将浮点数格式化为N个小数位

例如,假设我们需要在小数点后两位打印float类型变量,例如,将3.1425123转换为3.14。不完全是一个不常见的用例,对吧?

通常,人们可能会考虑使用 Python 内置的round方法来执行此操作。或者,您可能正在考虑使用“较旧”的str.format方法,例如:

# The "old" ways of updating float to 2 decimal places
float_variable = 3.141592653589793

print("%.2f" % float_variable)
print("{:.2f}".format(float_variable))

# Stdout:

# 3.14
# 3.14

将浮点数限制为小数点后两位的方法。

如果我们可以使用 f-string 来代替呢?让我们再试一次!

float_variable = 3.141592653589793

print(f"{float_variable:.2f}")

# Stdout:
# 3.14

在这种情况下使用 f-string 比 str.format() 容易得多

把float变成漂亮的币值

当您处理货币时,您需要准备好字符串以尽可能方便用户使用。例如,将我们的货币值3142671.76格式化为$3,142,671.76可能是一个更好的主意。

在这种情况下,使用 f-string 将我们的float值格式化为货币非常方便。我们可以通过使用,:2f轻松做到这一点。

money = 3_142_671.76 # 💡 This is the same as 3142671.76

print(f"${money:,.2f}")

# Stdout:
# $3,142,671.76

将浮点类型变量格式化为漂亮的货币。简单的!

漂亮的格式datetime没有strftime

除了使用它来格式化float类型变量之外,我们甚至可以将 f-string 与datetime类型变量一起使用。

虽然将datetime对象格式化为更人性化的方式,例如05-July-2021,但最常见的做法是使用datetime对象的标准内置strftime方法,例如datetime_var.strftime(‘%d-%b-%y’)

或者,我们可以使用 f-string 轻松格式化我们的datetime变量。这是我的意思的一个例子:

from datetime import datetime


now = datetime.now()

# The usual way
formatted_datetime_now = now.strftime('%d-%B-%Y')
print(formatted_datetime_now)

# F-string way
formatted_datetime_now = f"{now:%d-%B-%Y}"
print(formatted_datetime_now)

# Stdout
# 05-July-2021

使用 f 字符串而不是strftime格式化datetime变量。

用前导零或空格填充 int 变量

根据您的工作,有时您可能需要在前面填充整数,同时将其显示或用作字符串。

不必编写自定义函数来对我们的整数进行零填充,f-string 允许您对整数进行零填充而不会出汗。要填充零,只需执行以下操作:

# Output length of 20, and pad the rest with zeroes

int_variable = 1_234_567
print(f'{int_variable:020}')

# Stdout
# 00000000000001234567


# Output length of 24, and pad the rest with zeroes
int_variable = 30
print(f'{int_variable:024}')

# Stdout
# 000000000000000000000030

用前导零填充整数类型变量!

用前导空格填充整数:

# Output length of 10, and pad the rest with leading whitesplace
int_variable = 20_21
print(f'{int_variable:10d}')

# Stdout
# '      2021'


# Output length of 5, and pad the rest with leading whitesplace
print(f"{int_variable:5d}")

# Stdout
# ' 2021'

用前导空格填充整数类型变量!


转换

在本文的最后一节中,我将为您介绍一些使用 f-string 进行转换的简短示例。当您使用感叹号语法!,后跟 f 字符串中的变量时,它将对该变量执行额外的转换。

将您的字符串转换为 ASCII 表示

例如,您可以使用f’{your_variable!a}’轻松打印出字符串的ASCII表示,就像这样:

owl = '🦉'
print(f'{owl!a}')

# Stdout
# '\U0001f989'

显示表情符号的 ASCII 表示。

f-string 的 repr() 替代方案

最后,另一个很好的用法! f-string 中的语法是显示包含我们对象的可打印表示的字符串,就像在 Python 中使用repr()方法一样。

这是一个例子:

from datetime import datetime


now = datetime.now()

# Using repr()
print(repr(now))


# F-string way
print(f'{now!r}')

# Stdout
# datetime.datetime(2021, 7, 5, 13, 2, 34, 672383)

repr(now) == f'{now!r}'
# True

使用!r代替repr()


结束思考

自 Python 3.6 时代以来,f-string 一直是 Python 中格式化字符串的绝佳方式。在 Python 中使用 f 字符串非常容易,自从它们被引入以来我就一直在使用它们。

再加上让我们在字符串对象中包含表达式、条件甚至格式的灵活性,f-string 无疑是简单而强大的。

我个人最喜欢的是使用 f-string 来格式化datetime对象以及格式化任何货币值。

老实说,我很高兴看到这些年来 Python 是如何发展的,逐渐使我们的开发人员体验越来越好。我希望你从这篇文章中学到了很多,并将这些技巧实际应用到你的业余项目或工作中的代码库中。


本文原发于jerrynsh.com

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐