F字符串在Python中的使用
在本教程中,我们将学习字符串格式化机制。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()方法中访问字典元素,我们可以通过传递键值。
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()方法比%-format方法更高效,但当处理多个参数时仍然可能变得冗长。
F-string方法
这是由PEP 498引入的一种新的字符串格式化机制,也被称为字面字符串插值或更常用的F-strings。 (在字符串字面值之前加上f字符)。 这种机制的主要目的是使插值更加简便。
当我们以字母’F’为前缀时,字符串本身就变成了f-string。f-string可以像 str.format() 方法一样进行格式化。F-string提供了一种方便的方法,将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-string来格式化字符串。它在运行时求值;我们可以在其中放置所有有效的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-string也可以与类对象一起使用。让我们了解下面的示例。
示例
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-string将使用str()方法; 我们还可以通过包含转换标志!r使用repr()方法。
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-string在运行时而不是常量值进行评估。它将表达式嵌入到字符串文字中,使用最小的语法。它之所以快,是因为它在运行时进行评估,而不是常量值。
让我们看一下以下字符串比较。
示例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-string位于列表的顶部。
花括号
为了在代码中显示花括号,您应该使用双引号,如下所示。让我们了解以下示例。
示例
f"{{70 + 40}}"
输出:
{70 + 40}
如果我们使用三个大括号,它会在字符串中显示单个大括号。让我们看下面的示例。
示例
f"{{{90 + 4}}}"
输出:
{94}
我们可以使用三个以上的大括号来显示更多的大括号。
示例
f"{{{{70 + 4}}}}"
输出:
{{70 + 4}}
反斜杠
我们可以在f-string的字符串部分使用反斜杠转义。然而,在f-string的表达式部分不能使用反斜杠进行转义。让我们来看下面的示例。
示例
f"{\"Medric Pacalo\"}"
File "", 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-string方法提供了一种更简洁、可读性更强、更方便的方式。它更快且更不容易出错。我们已经解释了几乎每种可能的字符串情况,以及为什么在编程中应该考虑这种方法。