f-string:改进的现代字符串格式化方式

举报
Q神 发表于 2023/06/24 16:24:11 2023/06/24
【摘要】 在 Python 中可以使用多种方式执行字符串插值。Python 提供了多种方法可以帮助我们插入字符串。其中一些被称为老式或传统的字符串格式化方式,而另一些则是最近添加的并获得了广泛的欢迎。在 Python 中插入字符串的现代方法之一称为 f-string。首先,什么是字符串插值?字符串插值可以定义为评估包含一个或多个占位符的字符串文字,并用相应的值替换占位符。f-string 是在 Pyt...

在 Python 中可以使用多种方式执行字符串插值。Python 提供了多种方法可以帮助我们插入字符串。其中一些被称为老式或传统的字符串格式化方式,而另一些则是最近添加的并获得了广泛的欢迎。

在 Python 中插入字符串的现代方法之一称为 f-string。首先,什么是字符串插值?字符串插值可以定义为评估包含一个或多个占位符的字符串文字,并用相应的值替换占位符。

f-string 是在 Python 3.6 版本中引入的,并在 PEP 498 中提出,以使字符串格式化更容易且易于阅读。这改进了字符串的格式化方式。

Python 中字符串格式化的 4 种方法 - 指南

有 4 种方法可以执行字符串格式化: % 运算符(“旧式”) format() 字符串方法 字符串文字(f 字符串) 字符串模板类

极客Python

f 字符串

f-string 也称为格式化字符串文字,是将变量插入字符串的便捷方法。与使用 % 运算符和 .format() 方法的其他格式化方法不同,f 字符串以字母 f 为前缀,并带有大括号,其中包含将被相应值替换的表达式。

f 字符串中的 f 也可以代表快速,因为它比其他格式化方法具有更好的性能,并且具有多个优点。

优点

使用 f 字符串的主要优点如下:

可读性:与其他字符串格式化方法(例如 % 运算符和 .format() 方法)相比,F 字符串更易于读写。它们允许我们直接在字符串文字中包含变量和表达式,这使得代码更加简洁和富有表现力。

灵活性: F 字符串提供了更大的灵活性和对插值格式的控制。我们可以在大括号中的变量或表达式后面指定格式说明符来控制值的格式。

性能: F 字符串比 .format() 方法和 % 运算符更快。

句法

f 字符串的语法非常简单。

var1 = "Geeks"
var2 = "GeekPython"

f"Hey, there {var1}, Welcome to {var2}."

----
Hey, there Geeks, Welcome to GeekPython.

上面的示例显示了f 字符串的用法,其中字符串文字以字母f开头,并带有包含表达式的占位符。

使用表达式

这些值在运行时以 f 字符串的形式求值,因此我们可以在其中放入有效的任意表达式。

import math
exp = f'{math.pow(2, 3)}'
print(exp)

>>> 8.0

上面的代码执行时没有任何错误,并打印了 2 的 3 次方的值。

像这样,我们可以在 f 字符串中使用用户定义的函数。这是例子

def add(exp):
    return exp + 'python'

val = 'geek'
str = f'{add(val)}'
print(str)

>>> geekpython

指定的函数add()在 f 字符串内部调用,添加exp参数'python'并打印它。

使用方法

我们可以直接在 f 字符串内调用 Python 方法。以下示例将向您展示直接在 f 字符串内调用方法。

val = 'geekpython'
str = f'{val.upper()}'
print(str)

>>> GEEKPYTHON

在上面的代码中,upper()直接在 f 字符串内部调用该方法。

在 Python 类中使用 f 字符串

Python 中的类用于 OOP(面向对象编程),我们可以使用从带有 f 字符串的类创建的对象。下面的示例演示了在 Python 类中使用 f 字符串。

class Detail:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    def __str__(self):
        return f'Hello from {self.firstname} {self.lastname}'

现在我们可以使用Detail参数调用该类。我们可以这样做。

detail = Detail('Geek', 'Python')
print(f'{detail}')

>>> Hello from Geek Python

在类中Detail,该__str__方法用于将对象表示为字符串,并且__str__是字符串的非正式表示。我们甚至可以使用__repr__打印对象作为字符串的正式表示。

    def __repr__(self):
        return f'Good bye from {self.firstname} {self.lastname}'

print(f'{detail!r}')

>>> Good bye from Geek Python

好吧,您可能已经注意到!rf 字符串内部使用了 来打印__repr__对象。这是因为 !r 选择repr格式化对象的方法。

使用多行 f 字符串

我们可以在单个语句中使用多个 f 字符串。看看下面的例子。

real_name = 'Robert Downey Jr'
reel_name = 'Tony Stark'
hero_name = 'Iron Man'

details = (
    f'The real name is {real_name}, '
    f'The reel name is {reel_name}, '
    f'The hero name is {hero_name}.'
)
print(details)

>>> The real name is Robert Downey Jr, The reel name is Tony Stark, The hero name is Iron Man.

f但是使用多行f字符串有一个缺陷,我们在编写多行f字符串时必须将其放在每个字符串的开头。如果我们尝试这样做,那么我们会得到如下所示的结果。

real_name = 'Robert Downey Jr'
reel_name = 'Tony Stark'
hero_name = 'Iron Man'

details = (
    f'The real name is {real_name}, '
    'The reel name is {reel_name}, '
    'The hero name is {hero_name}.'
)
print(details)

>>> The real name is Robert Downey Jr, The reel name is {reel_name}, The hero name is {hero_name}.

转义序列

我们不能在 f 字符串内使用反斜杠来转义引号,如果我们尝试这样做,我们会收到错误。

val = f'{\'hello\'}'
print(val)

>>> SyntaxError: f-string expression part cannot include a backslash

有一种方法可以通过在表达式中使用不同类型的引号来转义引号。

val = f"{'hello'}"
print(val)

>>> hello

牙套

如果我们想在代码中包含大括号,那么我们应该在字符串文字中使用额外的大括号,以便出现在输出中。

val = f'{{{4**2}}}'
print(val)

>>> {16}

val1 = f'{{2 ** 2 * 4}}'
print(val1)

>>> {2**2*4}

在第一个代码块中,我们使用了两对大括号,并得到了带有大括号的输出,而在第二个代码块中,我们使用了一对大括号,但我们没有得到预期的输出,而是得到了f 字符串中的整个表达式。

使用格式说明符

我们可以使用格式说明符来计算 f 字符串内的表达式。以下示例演示了f 字符串内浮点精度的用法。

import math

value = math.pi
width = 5
precision = 10

val = f'result: {value:{width}.{precision}}'
print(val)

>>> result: 3.141592654

词典

我们已经了解了在 f 字符串内使用引号的方向,但是在 f 字符串内使用字典时需要更加小心。

greet = {'expression': 'Hello', 'from': 'GeekPython'}

my_dict = f'{greet["from"]} is saying {greet["expression"]}.'
print(my_dict)

>>> GeekPython is saying Hello.

上面的代码之所以有效,是因为我们使用了不同类型的引号,但如果我们使用相同类型的引号,则会出现错误。

greet = {'expression': 'Hello', 'from': 'GeekPython'}

my_dict = f'{greet['from']} is saying {greet['expression']}.'
print(my_dict)

>>> SyntaxError: f-string: unmatched '['

使用内联注释

f 字符串内的表达式不能包含使用符号的注释#,我们会收到错误。

name = 'geeks'
print(f'Hey there, {name #this is a comment}')

>>> SyntaxError: f-string expression part cannot include '#'

比较速度

如前所述,f 字符串比其他格式化方法快得多。我们可以说 f 字符串中的字母f代表“fast”

这是速度f-string%格式和.format方法之间的比较。

%(模)运算符格式

import timeit

duration_mod = timeit.timeit("""name = 'RDJ'
hero = 'Iron Man'
'%s plays the role of %s.' % (name, hero)""", number=10000)
print(duration_mod)

>>> 0.00748830009251833

str.format()方法

import timeit

duration_format = timeit.timeit("""name = 'RDJ'
hero = 'Iron Man'
'{} plays the role of {}.' .format(name, hero)""", number=10000)
print(duration_format)

>>> 0.009640300180763006

f-string

import timeit

duration_fstring = timeit.timeit("""name = 'RDJ' 
hero = 'Iron Man'
f'{name} plays the role of {hero}.'""", number=10000)
print(duration_fstring)

>>> 0.0016423999331891537

我们可以清楚地看到不同格式化方法的代码执行时间的差异。因此,我们可以得出结论,f-string与其他格式化方法相比,执行代码所需的时间更少。

结论

在本文中,我们了解了 f 字符串及其在代码中的用法。f-string 是一种改进的现代插入字符串的方法。

F-string 减少了代码中的混乱并提高了代码的可读性,并提供了对格式化字符串文字的灵活性和控制。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。