Python pprint模块
在打印程序中的数据时,我们面临着以标准格式打印数据集的问题。输出中打印的数据没有定义的格式,使得数据看起来不整齐。同时,这也使得我们在打印的数据集中查找特定信息变得困难。如果我们必须以某种固定的格式打印这些数据,我们必须使用多个格式函数来处理数据集的每一行和每一列。当给定的数据集具有多行和不同大小的列时,这将变得耗时且繁琐。因此,如果我们需要从程序中按某种排序方式打印数据集,则必须寻找其他选择来以一种固定格式打印数据集。当我们从数据集中查找某些特定信息时,这种以固定格式打印的数据集也会有所帮助。这就是为什么在开发和编程任务期间,这种漂亮打印包的重要性会增加。许多编程语言都提供了可以用来以固定格式在输出中打印数据集的包。具体来说,Python提供了pprint模块,该模块带有多个函数,可用于以某种特定格式打印数据集。因此,在本教程中,我们将学习Python的pprint模块,并了解如何使用该模块的函数以特定格式在输出中打印数据集。
Python中pprint模块简介
pprint模块是Python标准库的一部分,它带有多个函数,用于以特定格式在输出中打印给定的数据集。pprint模块本身的名称即为pretty-printer模块,也被称为数据漂亮打印模块。pprint模块的功能使得数据结构和数据集具有美观的外观。pprint模块使我们能够以定义的格式打印任何给定的数据结构,并使其在输出中具有美观的外观。通过pprint模块的功能,正确解析和执行的Python程序中的任何数据结构或数据集都将以优雅的格式显示在输出中。
尽可能地,pprint模块将数据结构的格式化表达式保持在一行中,但有时当格式化表达式的长度超过定义的长度时,它会被拆分成多行。有时,在pprint模块的格式化函数的默认宽度参数超过时,格式化表达式会分成多行。在程序的pprint输出中,字典数据在表示或显示结果之前会自动进行格式化,这是pprint模块的一个独特特性。因此,我们可以说使用pprint模块打印的数据是结构良好且易读的形式。
Python中的pprint模块:安装
pprint模块是Python的标准库之一,即pprint是Python标准发行版安装时预先安装的模块。因此,在使用pprint模块之前,我们不需要执行任何安装过程。我们可以直接在Python程序中导入此模块,以便使用它并理解其实施和功能。 我们可以使用以下代码行在程序中导入Python的pprint模块:
# Importing the pprint module
import pprint
因此,我们可以在本教程的示例程序中使用此模块来使用它并理解其实现。
pprint模块中的类
Python的pprint模块在其标准库中包含了PrettyPrinter类的定义,用于以排序的格式设置给定的数据结构。
要使用此模块的PrettyPrinter类,我们必须在程序中定义该类的构造函数,然后才能使用该类的pprint模块的函数。
定义PrettyPrinter类构造函数的语法:
如果我们要在程序中使用pprint类,我们可以通过在程序中定义该类的构造函数来使用它,然后在打印特定格式的数据结构或数据集时,使用pprint模块的函数及该构造函数。
我们必须使用以下语法或代码行来定义pprint类的构造函数:
# Constructor for pprint class
pcr = ppr.PrettyPrinter(indentGiven, widthOfLine, depthInData, stream, compact)
参数: 如上述语法所示,pprint 类的构造函数可以使用 pprint 模块的 PrettyPrinter() 函数进行定义。当我们使用它来定义 PrettyPrinter 类的构造函数时,PrettyPrinter() 函数需要传递以下五个参数:
(i) indentGiven: 函数的 indent 参数用于定义在每个递归级别(每行和每列的数据值)之后应添加的缩进。如果我们在函数中不通过传递参数来定义这个参数,函数将使用默认参数,该参数对于 indent 参数是 1。
(ii) widthOfLine: 该函数的此参数定义了数据结构中每行的宽度,并且数据结构的期望输出格式受此格式限制。width 参数的默认值为 80,在函数中不提供任何 width 参数时使用。如果数据结构的行的长度大于函数中定义的 width 参数,它将在输出中分解为多行结构。
(iii) depthInData: 该函数的 depth 参数用于控制输出中打印的级别数量。它是函数的可选参数,该参数没有默认值。
(iv) stream: stream 参数的默认值是 std.out(默认输出机器)。此参数在函数中用于在输出时接收任何流对象,例如文件。
(v) compact :compact 参数是 PrettyPrinter() 函数中使用的最后一个参数,默认情况下 compact 参数设置为 False。只有当要显示的数据可以适应宽度时,我们才需要将此参数设置为 True。
在定义 PrettyPrinter 类的构造函数时,应提供这五个参数给 PrettyPrinter() 函数。我们可以使用这些参数来指定我们希望以什么格式打印给定的数据结构。
PrettyPrinter 类中的方法:
pprint 模块有多个方法,其中一些方法是使用 PrettyPrinter 类的构造函数来定义的。程序中使用 PrettyPrinter 类的构造函数定义的这些方法或函数用于以指定的格式打印数据结构。以下是在 PrettyPrinter 类的构造函数下定义的两个方法:
a) pprint() 函数: PrettyPrinter 类中的第一个方法是 pprint() 函数,它打印 PrettyPrinter 对象(其中数据从数据结构存储在特定格式中)的格式化表示形式。我们可以将此函数作为 print 语句使用来打印程序中的任何数据。
b) pformat() 函数: 根据我们在 PrettyPrinter 类的构造函数中提供的参数,此函数返回 PrettyPrinter 对象的格式化表示形式。
这两个函数是在 PrettyPrinter 类的构造函数下定义的,我们可以使用这些方法与构造函数一起在输出中打印数据结构。
Python 中的 pprint 模块:实现
到目前为止,在本教程中,我们了解了函数、类和pprint模块的方法。现在,在本教程的这一部分,我们将了解pprint模块及其类和函数的工作原理。我们将在示例程序中使用pprint模块的函数和类构造函数,以了解它们在程序中的功能和工作方式。我们将使用pprint()和pformat()函数在示例程序中,以了解它们的实现和工作方式,即如何按照指定的格式打印数据结构。
请查看以下示例程序,以了解pprint模块的函数实现打印数据结构的方式:
实现1:使用pprint()函数进行格式化输出
在这个实现部分中,我们将使用pprint模块的pprint()函数来按照指定的格式打印程序中给定的数据结构,使其看起来更加吸引人和格式化。我们将使用一些示例程序来了解使用pprint()函数的工作原理,不同参数在函数中的使用。首先,看一下以下示例程序,以了解使用pprint()函数打印的输出:
示例1: 看一下以下Python程序,我们在程序中将简单的打印语句输出与pprint()函数的输出进行了比较:
# Importing the pprint module as ppr
import pprint as ppr
# Defining a data structure that has students data
studentDS = {"Dwayne Johnson": ["English", "Chemistry", "Physics", "Mathematics", "Biology"],
"Randy Orton" :{"English": 50,"Physics": 60,
"Chemistry": 70, "Mathematics": 80, "Biology": 90},
"Karl Marx" :(50, 60, 70, 80, 90)}
# Defining Constructor for the PrettyPrinter class
ppConst = ppr.PrettyPrinter()
# Printing normal output of the student data structure
print ("Normal output of student data structure with print statement:")
print (studentDS)
print ("----")
# Printing formatted output of the pprint() function
print ("The pprint function's formatted output of the student data structure:")
# Using pprint() function
ppConst.pprint(studentDS)
输出:
Normal output of student data structure with print statement:
{'Dwayne Johnson': ['English', 'Chemistry', 'Physics', 'Mathematics', 'Biology'], 'Randy Orton': {'English': 50, 'Physics': 60, 'Chemistry': 70, 'Mathematics': 80, 'Biology': 90}, 'Karl Marx': (50, 60, 70, 80, 90)}
----
The pprint function's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
'Chemistry',
'Physics',
'Mathematics',
'Biology'],
'Karl Marx': (50, 60, 70, 80, 90),
'Randy Orton': {'Biology': 90,
'Chemistry': 70,
'English': 50,
'Mathematics': 80,
'Physics': 60}}
正如我们所看到的,学生数据结构的普通打印输出和pprint函数的格式化输出都被打印出来了。我们可以观察普通输出和pprint()函数的格式化输出之间的差异,并得出结论:pprint()函数的格式化输出更简单易观察。这就是我们可以在pprint()函数内部不带任何参数使用pprint()函数来打印给定数据结构的格式化输出的方法。
解释: 首先我们在程序中导入了pprint模块并将其命名为ppr,然后定义了PrettyPrinter类的构造函数。我们还定义了一个包含一些学生数据的示例数据结构,并将此数据结构命名为studentDS。我们将PrettyPrinter类的构造函数变量命名为ppConst,并在稍后使用pprint()函数时使用它。然后我们使用ppConst构造函数变量来调用pprint()函数。在使用pprint()函数时,我们将学生数据结构变量作为参数传递以格式化学生数据结构的输出。然后,首先我们使用studentDS变量打印了数据结构的普通输出。最后,我们使用pprint()函数打印了pprint()函数的格式化输出,以便与普通输出进行比较。
使用pprint()函数进行递归数据结构打印
我们还可以使用pprint()函数递归地打印数据结构。在这里,我们还将尝试打印给定数据结构中的递归对象,并且在输出中只打印引用。请看下面的示例程序,以了解pprint()函数的递归对象打印实现:
示例2: 请看下面的程序,我们在输出中打印了一个递归对象:
# Importing the pprint module as ppr
import pprint as ppr
# Define a list of numbers
numList = list(range(24, 31))
# Appending the list
numList.append(numList)
# Printing appended number list
print("Appended list of numbers: ")
print(numList)
print("----------------")
#Printing recursive object with pprint() function
print("Appended list with recursive object from pprint function: ")
ppr.pprint(numList)
输出:
Appended list of numbers:
[24, 25, 26, 27, 28, 29, 30, [...]]
----------------
Appended list with recursive object from pprint function:
[24, 25, 26, 27, 28, 29, 30, ]
如我们所见,当我们使用pprint()函数打印输出时,附加的列表中的最后一个项被打印为递归对象。输出显示递归开始于具有最后一项对象引用id的列表。
提供宽度参数
现在,我们将在定义PrettyPrinter类的构造函数时提供宽度参数(我们在前一节中讨论过)。我们在PrettyPrinter()函数内提供的宽度根据给定的宽度格式化输出,并以相同的格式呈现。请查看下面的示例程序,了解PrettyPrinter类的宽度参数实现:
示例3: 请查看下面的程序,我们在PrettyPrinter类的构造函数中使用了宽度参数:
# Importing the pprint module as ppr
import pprint as ppr
# Defining a data structure which having student's data
studentDS = {"Dwayne Johnson": ["English", "Chemistry", "Physics", "Mathematics", "Biology"],
"Randy Orton" :{"English": 50,"Physics": 60,
"Chemistry": 70, "Mathematics": 80, "Biology": 90},
"Karl Marx" :(50, 60, 70, 80, 90)}
# Defining Constructor for the PrettyPrinter class with width argument
ppConst = ppr.PrettyPrinter(width = 24)
# Printing formatted output of the pprint() function
print ("The pprint function's formatted output of the student data structure with defined width:")
ppConst.pprint(studentDS)
输出:
The pprint function's formatted output of the student data structure with defined width:
{'Dwayne Johnson': ['English',
'Chemistry',
'Physics',
'Mathematics',
'Biology'],
'Karl Marx': (50,
60,
70,
80,
90),
'Randy Orton': {'Biology': 90,
'Chemistry': 70,
'English': 50,
'Mathematics': 80,
'Physics': 60}}
如我们所见,学生数据结构的格式化输出是根据我们在PrettyPrinter类中使用的width参数提供的宽度打印的,即width = 24。
实现2:使用pformat()函数进行格式化输出:
在这个实现部分,我们将学习如何使用pformat()函数来打印给定数据结构的格式化输出。我们可以通过以下两种方式从PrettyPrinter构造函数中实现pformat函数:
(i) 将pformat作为方法
(ii) 将pformat作为函数
我们将在每种情况下使用一个示例程序来理解pformat的实现。
(i) 使用pformat作为方法:
在这里,我们将像使用方法一样使用pformat来打印带有该函数的格式化输出。我们可以查看以下示例程序以了解pformat方法的实现:
# Importing the pprint module as ppr
import pprint as ppr
# Defining a data structure which having student's data
studentDS = {"Dwayne Johnson": ["English", "Chemistry", "Physics", "Mathematics", "Biology"],
"Randy Orton" :{"English": 50,"Physics": 60,
"Chemistry": 70, "Mathematics": 80, "Biology": 90},
"Karl Marx" :(50, 60, 70, 80, 90)}
# Defining Constructor for the PrettyPrinter class
ppConst = ppr.PrettyPrinter()
# Using pformat() function
pfOutput = ppConst.pformat(studentDS)
# Printing formatted output of the pprint() function
print ("The pformat method's formatted output of the student data structure:")
print(pfOutput)
输出:
The pformat method's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
'Chemistry',
'Physics',
'Mathematics',
'Biology'],
'Karl Marx': (50, 60, 70, 80, 90),
'Randy Orton': {'Biology': 90,
'Chemistry': 70,
'English': 50,
'Mathematics': 80,
'Physics': 60}}
(ii) 使用 pformat 作为一个函数:
我们可以看下面的示例程序来了解 pformat 的函数实现方式:
# Importing the pprint module as ppr
import pprint as ppr
# Defining a data structure which having student's data
studentDS = {"Dwayne Johnson": ["English", "Chemistry", "Physics", "Mathematics", "Biology"],
"Randy Orton" :{"English": 50,"Physics": 60,
"Chemistry": 70, "Mathematics": 80, "Biology": 90},
"Karl Marx" :(50, 60, 70, 80, 90)}
# Using pformat() function
pfOutput = ppr.pformat(studentDS)
# Printing formatted output of the pprint() function
print ("The pformat function's formatted output of the student data structure:")
print(pfOutput)
输出:
The pformat function's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
'Chemistry',
'Physics',
'Mathematics',
'Biology'],
'Karl Marx': (50, 60, 70, 80, 90),
'Randy Orton': {'Biology': 90,
'Chemistry': 70,
'English': 50,
'Mathematics': 80,
'Physics': 60}}