Python - 输出格式



Python 中的输出格式

Python 中的输出格式用于使您的代码更具可读性,并且您的输出更加用户友好。无论您是显示简单的文本字符串、复杂的数据结构还是创建报表,Python 都提供了多种格式化输出的方法。

这些方法包括使用 -

  • 字符串模运算符 (%)
  • format() 方法
  • f-strings (格式化字符串文字)
  • 模板字符串

此外,Python 的 “textwrap” 和 “pprint” 模块提供了用于包装文本和漂亮打印数据结构的高级功能。

使用字符串模运算符 (%)

我们可以使用字符串模运算符 % 来格式化输出。此运算符对于字符串是唯一的,并且构成了 C 的 printf() 系列中的函数包。格式规范符号(如 %d、%c、%f 和 %s)用作字符串中的占位符,类似于 C 中的占位符。

下面是一个简单的示例 -


print ("My name is %s and weight is %d kg!" % ('Zara', 21))

它将产生以下输出 -

My name is Zara and weight is 21 kg!

使用 format() 方法

我们可以使用 format() 方法格式化输出,该方法在 Python 3.0 中引入,并已向后移植到 Python 2.6 和 2.7。

format() 方法是内置字符串类的一部分,允许复杂的变量替换和值格式化。与字符串取模运算符相比,它被认为是一种更优雅、更灵活的字符串格式方法。

语法

format() 方法的一般语法如下 -


str.format(var1, var2,...)

返回值

该方法返回一个格式化的字符串。

字符串本身包含占位符 {},其中连续插入变量的值。


name="Rajesh"
age=23
print ("my name is {} and my age is {} years".format(name, age))

它将产生以下输出 -

my name is Rajesh and my age is 23 years

你可以使用变量作为 format() 方法的关键字参数,并使用变量名称作为字符串中的占位符。


print ("my name is {name} and my age is {age}
years".format(name="Rajesh", age=23))

使用 F 字符串

F 字符串或格式化字符串文字是一种在 Python 中格式化字符串的方法,它简单、快速且易于阅读。您可以通过在字符串的左引号前添加 f 来创建 f 字符串。

在字符串中,您可以包含变量的占位符,这些占位符括在大括号 {} 中。这些变量的值将插入到字符串的这些位置。

在此示例中,变量 “name” 和 “age”入到其占位符 “{name}” 和 “{age}” 所在的字符串中。F 字符串可以轻松地在字符串中包含变量值,而无需使用 format() 方法或字符串连接 -


name = 'Rajesh'
age = 23

fstring = f'My name is {name} and I am {age} years old'
print (fstring)

它将产生以下输出 -

My name is Rajesh and I am 23 years old

Python 中的格式转换规则

您还可以指定 C 样式格式符号。唯一的更改是使用 : 而不是 %。例如,使用 {:s} 代替 %s,使用 {:d} 代替 %d,如下所示 -


name = "Rajesh"
age = 23
print("my name is {:s} and my age is {:d} years".format(name, age))

您将获得如下所示的输出 -

my name is Rajesh and my age is 23 years

模板字符串

string 模块中的 Template 类提供了一种动态格式化字符串的替代方法。Template 类的好处之一是能够自定义格式规则。

有效的模板字符串或占位符由两部分组成:$ 符号后跟有效的 Python 标识符。

您需要创建一个 Template 类的对象,并使用模板字符串作为构造函数的参数。接下来,调用 Template 类的 substitute() 方法。它将作为参数提供的值代替模板字符串。


from string import Template

temp_str = "My name is $name and I am $age years old"
tempobj = Template(temp_str)
ret = tempobj.substitute(name='Rajesh', age=23)
print (ret)

它将产生以下输出 -

My name is Rajesh and I am 23 years old

textwrap 模块

Python 的 textwrap 模块中的 wrap 类包含通过调整输入段落中的换行符来格式化和换行纯文本的功能。它有助于使文本格式合理且美观。

textwrap 模块具有以下便捷功能 -

textwrap.wrap(text, width=70)

textwrap.wrap() 函数将单个段落包装在文本(字符串)中,因此每行最多是宽度字符长。返回输出行列表,不带最终换行符。可选关键字参数对应于 TextWrapper 的实例属性。width 默认为 70。

textwrap.fill(text, width=70)

textwrap.fill() 函数将单个段落包装在文本中,并返回一个包含包装段落的字符串。

这两种方法都在内部创建 TextWrapper 类的对象,并在其上调用单个方法。由于实例不会被重用,因此创建自己的 TextWrapper 对象会更有效。


import textwrap

text = '''
Python is a high-level, general-purpose programming language. Its design philosophy emphasizes code readability with the use of significant indentation via the off-side rule.

Python is dynamically typed and garbage-collected. It supports multiple programming paradigms, including structured (particularly procedural), object-oriented and functional programming. It is often described as a "batteries included" language due to its comprehensive standard library.
'''

wrapper = textwrap.TextWrapper(width=40)
wrapped = wrapper.wrap(text = text)

# Print output
for element in wrapped:
	 	print(element)

它将产生以下输出 -

Python is a high-level, general-purpose
programming language. Its design
philosophy emphasizes code readability
with the use of significant indentation
via the off-side rule. Python is
dynamically typed and garbage-collected.
It supports multiple programming
paradigms, including structured
(particularly procedural), objectoriented and functional programming. It
is often described as a "batteries
included" language due to its
comprehensive standard library.

为 TextWrapper 对象定义了以下属性 -

  • width − (默认值:70) 换行的最大长度。
  • expand_tabs − (默认: True) 如果为 true,则文本中的所有制表符都将使用文本的 expandtabs() 方法扩展为空格。
  • tabsize − (默认值:8) 如果 expand_tabs 为 true,则文本中的所有制表符都将扩展为零个或多个空格,具体取决于当前列和给定的制表符大小。
  • replace_whitespace − (默认值: True) 如果为 true,则在 Tab 键扩展之后但在换行之前,wrap() 方法会将每个空白字符替换为单个空格。
  • drop_whitespace − (默认值: True) 如果为 true,则删除每行开头和结尾(换行后但缩进前)的空格。但是,如果段落开头的空格后面跟着非空格,则不会删除该段落开头的空格。如果删除的空格占据了整行,则整行都会被删除。
  • initial_indent − (default: '') 将添加到包装输出的第一行的字符串。
  • subsequent_indent − (default: '') 将添加到除第一行之外的所有包装输出行的前面。
  • fix_sentence_endings − (默认值:False) 如果为 true,则 TextWrapper 将尝试检测句子结尾,并确保句子始终由两个空格分隔。这通常适用于等宽字体的文本。
  • break_long_words − (默认值: True) 如果为 true,则长于 width 的单词将被断开,以确保没有行长于 width。如果为 false,则不会断开长单词,并且某些行可能长于宽度。
  • break_on_hyphens − (默认: True) 如果为 true,则最好在复合词的空格和连字符之后换行,这是英语中的习惯。如果为 false,则只有空格将被视为潜在的好位置 换行符。

shorten() 函数

shorten() 函数折叠并截断给定的文本以适应给定的宽度。文本的空白处首先折叠。如果它随后适合 *width*,则按原样返回。否则,将连接尽可能多的单词,然后附加占位符 -


import textwrap

python_desc = """Python is a general-purpose interpreted, interactive, object-oriented, and high-level programming language. It was created by Guido van Rossum during 1985- 1990. Like Perl, Python source code is also available under the GNU General Public License (GPL). This tutorial gives enough understanding on Python programming language."""

my_wrap = textwrap.TextWrapper(width = 40)

short_text = textwrap.shorten(text = python_desc, width=150)
print('\n\n' + my_wrap.fill(text = short_text))

它将产生以下输出 -

Python is a general-purpose interpreted,
interactive, object-oriented,and high
level programming language. It was
created by Guido van Rossum [...]

pprint 模块

Python 标准库中的 pprint 模块使 Python 数据结构的外观美观。pprint 这个名字代表漂亮的打印机。任何可以被 Python 解释器正确解析的数据结构都经过了优雅的格式化。

格式化表达式尽可能保持在一行中,但如果长度超过格式化的 width 参数,则分成多行。pprint 输出的一个独特功能是,在格式化显示表示之前,词典会自动排序。

PrettyPrinter 类

pprint 模块包含 PrettyPrinter 类的定义。它的构造函数采用以下内容 格式 -

语法


pprint.PrettyPrinter(indent, width, depth, stream, compact)

参数

  • indent − 定义在每个递归级别上添加的缩进。默认值为 1。
  • width − 默认为 80。所需输出受此值限制。如果 length 大于 width,则将其分成多行。
  • depth − 控制要打印的级别数。
  • stream − 默认为 std.out − 默认输出设备。它可以接受任何 stream 对象,比如 file.
  • compact − id 默认设置为 False。如果为 true,则仅显示可在宽度内调整的数据。

PrettyPrinter 类定义以下方法 -

pprint() 方法

pprint() 方法打印 PrettyPrinter 对象的格式化表示形式。

pformat() 方法

pformat() 方法根据构造函数的参数返回对象的格式化表示形式。

以下示例演示了 PrettyPrinter 类的简单用法 -


import pprint
students={"Dilip":["English", "Maths", "Science"],"Raju":{"English":50,"Maths":60, "Science":70},"Kalpana":(50,60,70)}
pp=pprint.PrettyPrinter()
print ("normal print output")
print (students)
print ("----")
print ("pprint output")
pp.pprint(students)

输出显示正常和漂亮打印显示 -

normal print output
{'Dilip': ['English', 'Maths', 'Science'], 'Raju': {'English': 50, 'Maths': 60, 'Science': 70}, 'Kalpana': (50, 60, 70)}
----
pprint output
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}

pprint 模块还定义了与 PrettyPrinter 方法相对应的便捷函数 pprint() pformat() 。下面的示例使用 pprint() 函数。


from pprint import pprint
students={"Dilip":["English", "Maths", "Science"],
	 	"Raju":{"English":50,"Maths":60, "Science":70},
	 	 	 "Kalpana":(50,60,70)}
print ("normal print output")
print (students)
print ("----")
print ("pprint output")
pprint (students)

使用 pformat() 方法的示例

下一个示例使用 pformat() 方法和 pformat() 函数。要使用 pformat() 方法,首先要设置 PrettyPrinter 对象。在这两种情况下,格式化的表示都使用普通的 print() 函数显示。


import pprint
students={"Dilip":["English", "Maths", "Science"],
	 	"Raju":{"English":50,"Maths":60, "Science":70},
	 	 	 "Kalpana":(50,60,70)}
print ("using pformat method")
pp=pprint.PrettyPrinter()
string=pp.pformat(students)
print (string)
print ('------')
print ("using pformat function")
string=pprint.pformat(students)
print (string)

这是上述代码的输出 -

using pformat method
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}
------
using pformat function
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}

Pretty printer 也可以与自定义类一起使用。在类中,__repr__() 方法被覆盖。使用 repr() 函数时调用 __repr__() 方法。它是 Python 对象的官方字符串表示形式。当我们使用 object 作为 print() 函数的参数时,它会打印 repr() 函数的返回值。

在此示例中,__repr__() 方法返回玩家对象的字符串表示形式 -


import pprint
class player:
	 	def __init__(self, name, formats=[], runs=[]):
	 	 	 self.name=name
	 	 	 self.formats=formats
	 	 	 self.runs=runs
	 	def __repr__(self):
	 	 	 dct={}
	 	 	 dct[self.name]=dict(zip(self.formats,self.runs))
	 	 	 return (repr(dct))

l1=['Tests','ODI','T20']
l2=[[140, 45, 39],[15,122,36,67, 100, 49],[78,44, 12, 0, 23, 75]]
p1=player("virat",l1,l2)
pp=pprint.PrettyPrinter()
pp.pprint(p1)

上述代码的输出为 −

{'virat': {'Tests': [140, 45, 39], 'ODI': [15, 122, 36, 67, 100, 49],
'T20': [78, 44, 12, 0, 23, 75]}}