Python教程-Python中的f字符串
在本教程中,我们将学习字符串格式化机制。f字符串是格式化字符串的最佳方式。字符串的格式化风格使字符串更易读、更简洁,并且更不容易出错。它也比其他方式更快。
在深入研究这个主题之前,我们首先将讨论在f字符串之前使用的技术。
Python中的旧字符串格式化
有两种主要的字符串格式化方式:% - 格式化和str.format()。但这两种方法都有一些限制。让我们简要介绍一下这些方法。
1. % - 格式化
这是一种传统的字符串格式化方式,但文档建议使用这种方法,其中包含以下陈述。
“这里描述的格式化操作展示了各种导致多种常见错误的怪癖(比如无法正确显示元组和字典等)。
使用较新的格式化字符串文字或str.format()接口有助于避免这些错误。” - 官方文档。
如何使用% - 格式化
我们可以使用%-运算符执行内置操作。让我们理解以下示例。
student = "Michel"
"Hello, %s." % student
输出:
Hello Michel
我们还可以使用元组来存储多个变量。让我们看看以下示例。
name = "Sharma"
age = 24
"Hello, %s. You are %s." % (name, age)
输出:
Hello Sharma You are 24.
为什么不推荐使用%-格式化
因为随着变量的增加和字符串的变得更长,我们的代码变得难以阅读。代码看起来凌乱。让我们看看以下示例。
示例 -
first_name = "Steve"
last_name = "Rogers"
age = 70
profession = "Superhero"
group = "Marvel?
print(""Hello, %s %s. Your age is %s. You are a %s. You were a member of %s." %(first_name, last_name, age, profession)")
输出:
Hello, Steve Rogers. Your age is 70. You are a Superhero. You were a member of Marvel.
正如我们在上面的代码中所看到的,代码变得难以阅读,更容易出错。这就是为什么这种字符串格式化方式不好的原因。
2. str.format()方法
这是Python 2.6引入的另一种常用字符串格式化方式。让我们看看如何使用它。
如何使用str.format()
这是%-格式化的改进版。它类似于在对象上调用的普通内置函数,该对象被转换为字符串。
让我们看看以下示例。
示例 -
first_name = "Mathew"
last_name = "Zukerburg"
age = 45
print("Hello, {}. You are {}.".format(name, age)")
要在format()方法内部访问字典元素,我们可以在format()方法中传递键。
person = {'name': 'Peter', 'age': 17}
"Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
输出:
Hello Peter, You are 17
为什么不推荐使用str.format()方法
str.format()方法比%-格式化方法高效得多,但在处理多个参数时仍然可能相当冗长。
F字符串方法
这是由PEP 498引入的新的字符串格式化机制。它也被称为字面字符串插值,或更常见的是F-字符串(在字符串文字之前加上f字符)。这个机制的主要重点是使插值更容易。
当我们在字符串前面加上字母 'F' 时,字符串本身就成为了f字符串。f字符串可以像str.format()方法一样进行格式化。F字符串提供了一种在字符串文字中嵌入Python表达式以进行格式化的便捷方式。
示例 -
# Python3 program introducing f-string
val = 'Geeks'
print(f"{val}for{val} is a portal for {val}.")
name = 'Tushar'
age = 23
print(f"Hello, My name is {name} and I'm {age} years old.")
输出:
Hello, My name is Tushar and I'm 28 years old.
在上面的代码中,我们使用了f字符串来格式化字符串。它在运行时计算;我们可以在其中放入所有有效的Python表达式。
我们可以在单个语句中使用它。
print(f"{2 * 30})"
输出:
60
然而,我们也可以在函数中使用它。
def upercase(input):
return input.uper()
name = "Sachin Tendulkar"
f"{upercase(name)} is great."
输出:
Sachin Tendulkar is great
f字符串还可以与类对象一起使用。让我们了解以下示例。
示例 -
class Actor:
def __init__(self, first_name, last_name, movie):
self.first_name = first_name
self.last_name = last_name
self.movie = movie
def __str__(self):
return f"{self.first_name} {self.last_name}'s superhit movie is {self.movie}."
def __repr__(self):
return f"{self.first_name} {self.last_name} {self.movie}. Superhi!"
ac = Actor('Keenu', 'Reevs', 'Matrix')
print(f"{ac}")
输出:
Keenu Reevs's superhit movie is Matrix.
解释 -
在上面的代码中,我们使用了__str__()和__repr__(),将对象表示为字符串。因此,我们需要在类定义中至少包含其中一个方法。f字符串将使用__str__()方法;我们还可以使用__repr__(),通过包含转换标志! r来使用它。
print(f"{ac}")
print(f"{ac}"!r)
输出:
Keenu Reevs's superhit movie is Matrix.
Keenu Reevs Matrix Superhit
字典中的F字符串
在使用f字符串时,我们必须小心处理字典键。在使用字典键和f字符串时需要使用不同的引号。让我们了解以下示例。
示例 -
detail = {"name": "John", "age": 19}
print(f"{detail['name']} is {detail['age']} years old.")
输出:
John is 19 years old.
在字典中不允许使用以下方法。
示例 -
detail = {"name": "John", "age": 19}
print(f'{detail['name']} is {detail['age']} years old.')
输出:
File "", line 2
print(f'{detail['name']} is {detail['age']} years old.')
^
SyntaxError: invalid syntax
如上所示,在上面的代码中,我们将双引号更改为单引号,它引发了一个错误。
速度
采用这种格式化风格的原因是它的速度。f字符串在运行时计算而不是常量值。它将表达式嵌入字符串文字中,使用最小的语法。它之所以快,是因为它在运行时计算,而不是常量值。
让我们看看以下字符串比较。
示例 - 1:
import timeit
print(timeit.timeit("""name = "Sachin"
age = 74
'%s is %s.' % (name, age)""", number = 10000))
输出:
0.0022497819736599922
示例 - 2:
import timeit
print(timeit.timeit("""name = "Mathew"
age = 40
'{} is {}.'.format(name, age)""", number = 10000))
输出:
0.0025783719611354172
示例 - 3:
import timeit
print(timeit.timeit("""name = "Rockey"
age = 74
f'{name} is {age}.'""", number = 10000))
输出:
0.0019360429723747075
正如我们所观察到的,f字符串位于列表的顶部。
大括号
要在代码中显示大括号,您应该使用双引号,如下所示。让我们了解以下示例。
示例 -
f"{{70 + 40}}"
输出:
{70 + 40}
如果我们使用三重大括号,它将在我们的字符串中显示单个大括号。让我们了解以下示例。
示例 -
f"{{{90 + 4}}}"
输出:
{94}
如果我们使用多于三个大括号,我们可以显示更多的大括号。
示例 -
f"{{{{70 + 4}}}}"
输出:
{{70 + 4}}
反斜杠
我们可以在f字符串的字符串部分中使用反斜杠转义。但是,在f字符串的表达式部分中不能使用反斜杠转义。让我们了解以下示例。
示例 -
f"{\"Medric Pacalo\"}"
File "<stdin>", line 1
f"{\"Medric Pacalo\"}"
输出:
SyntaxError: f-string expression part cannot include a backslash
内联注释
我们不能在表达式中包含#符号。它将引发语法错误。让我们了解以下示例。
示例 -
f"Tony is {10 * 73 #Hate this!}."
f"Tonyr is {2 * 37 #Hate this!}."
输出:
SyntaxError: f-string expression part cannot include '#'
结论
我们可以在三种方法中选择任何一种,但f字符串方法提供了一种更简洁、更易读和更方便的方式。它更快,更不容易出错。我们已经解释了几乎每种可能的f字符串场景,以及为什么在编程中应该考虑这种方法。