在 Python 中,输出格式化的使用可以使你的代码更易读,并使输出更加用户友好。无论你是显示简单的文本字符串、复杂的数据结构还是创建报告,Python 提供了几种格式化输出的方法。
这些方法包括使用以下几种方式:
-
-
-
-
模板字符串 此外,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-Strings
F-strings 或格式化字符串字面量是格式化 Python 中字符串的一种简单、快速且易于阅读的方式。创建一个 f-string 是通过在字符串的开头添加一个 f 实现的。
在字符串内部,可以包含变量的占位符,它们由花括号 {} 包围。这些变量的值将在那些位置插入到字符串中。
示例
在这个例子中,变量 "name" 和 "age" 被插入到字符串中它们的占位符 "{name}" 和 "{age}" 所在的位置。F-strings 使得在字符串中包含变量值变得容易,无需使用 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)
:该函数将单个段落中的 text(一个字符串)包装成最多为 width 字符长的行。返回一个输出行的列表,没有最终的换行符。可选的关键字参数对应于 TextWrapper 类的实例属性。width 默认为 70。
-
textwrap.fill(text, width=70)
:该函数将单个段落中的 text 包装,并返回一个包含包装后的段落的单一字符串。
这两个方法内部创建了一个 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)
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 对象定义了以下属性:
-
-
expand_tabs
(默认:True):如果为真,则文本中的所有制表符将通过 expandtabs() 方法扩展为空格。
-
tabsize
(默认:8):如果 expand_tabs 为真,则文本中的所有制表符将根据当前列和给定的制表符大小扩展为零或多个空格。
-
replace_whitespace
(默认:True):如果为真,则在制表符扩展后但在包装之前,wrap() 方法将每个空白字符替换为单个空格。
-
drop_whitespace
(默认:True):如果为真,则在包装后但在缩进前,删除每行开头和结尾的空白。然而,如果非空白字符紧随其后,则不会删除段落开头的空白。如果删除的空白占据整行,则整个行都会被删除。
-
initial_indent
(默认:''):将附加到包装输出的第一行的字符串。
-
subsequent_indent
(默认:''):将附加到所有包装输出行(除第一行外)的字符串。
-
fix_sentence_endings
(默认:False):如果为真,TextWrapper 将尝试检测句子结尾并确保句子之间总是恰好有两个空格。对于使用等宽字体的文本来说,这通常是期望的。
-
break_long_words
(默认:True):如果为真,则为了确保没有行超过 width,将会打断长度超过 width 的单词。如果为假,长单词不会被打断,有些行可能超过 width。
-
break_on_hyphens
(默认:True):如果为真,包装将优先发生在空白处以及复合词中的连字符之后,这是英语中的惯例。如果为假,仅考虑空白作为可能的换行位置。
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 的名字代表 pretty printer。任何能被 Python 解释器正确解析的数据结构都会被优雅地格式化。
格式化的表达式尽可能保持在一行内,但如果长度超过了格式化宽度参数,则会折行。pprint 输出的一个独特特性是,在显示表示之前,字典会自动排序。
PrettyPrinter 类
pprint 模块定义了 PrettyPrinter 类。其构造函数采用以下格式:
语法
pprint.PrettyPrinter(indent, width, depth, stream, compact)
参数
-
indent
— 定义每个递归级别的缩进。默认值是 1。
-
width
— 默认值是 80。期望的输出受此值限制。如果长度大于 width,则会在多行中断开。
-
-
stream
— 默认是标准输出设备 std.out。它可以接受任何流对象,如文件。
-
compact
— 默认设置为 False。如果为真,只显示能适应 width 的数据。
PrettyPrinter 类定义了以下方法:
-
pprint()
方法
-
该方法打印 PrettyPrinter 对象的格式化表示。
-
示例
下面的示例演示了 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() 函数。
示例使用 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 对象的官方字符串表示形式。当我们使用对象作为 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]}}