在本教程中,我们将学习字符串格式化机制。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字符串场景,以及为什么在编程中应该考虑这种方法。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程