3.3.4 字符串的格式化方法
字符串可以通过format()方法进行格式化处理。
比如,小明同学想用一个程序输出他每一天的运动量——2019-12-12:跑步1小时,行程9.85千米。下划线中的内容每天都会发生改变,我们可以用特定的函数通过运算得到结果,填充到指定的位置,最终形成格式化的字符串。
Python提供了两种字符串格式化方法,一种是类C语言中printf()函数的格式化方法,另一种是专门的format()格式化方法。
1.使用%进行格式化
使用%对字符串进行格式化的形式:
基本思想是:第一个%为格式开始标志,单引号外面的%后面跟待格式化的变量。
·[对齐]:-表示左对齐,+表示右对齐。
·[正号]:+,对正数加上正号,仅对数值有效。
·[0]:当指定宽度超出数值的宽度时,用0对多余位置进行填充,对数值有效,对字符无效。
·[宽度]:指出当前字符串输出的宽度,如果对应字符串长度超过<宽度>值,则使用字符串的实际长度。
·[.精度]:浮点数小数部分的精度或字符串的最大输出长度,即保留几位小数,字符串输出长度。
·指定类型:如表3-12所示。
表3-12 字符格式化
续表
采用这种方式进行字符串格式化时,要求被格式化的内容和格式字符之间必须一一对应。
输出结果:
2.使用format()方法进行格式化
format()方法的基本使用:
模板字符串由一系列槽组成,用来控制修改字符串中嵌入值出现的位置,其基本思想是将format()方法中逗号分隔的参数按照逗号关系替换到模板字符串的槽中。槽用大括号({})表示,如果大括号中没有序号,则按照出现的顺序替换。
参数的序号是从0开始编号的,调用format()方法后会得到一个新的字符串。上面的输出可以由以下语句实现:
用变量来存储具体数值,上述代码可变成:
format()方法中的槽除了包括参数序号外,还可以包含格式控制的信息,具体格式信息如下:
{<序号>:<格式控制标记>}
格式控制标记如表3-13所示。
表3-13 格式控制标记
<填充>、<对齐>、<宽度>是3个相关字段。
·<宽度>指出当前槽输出字符的宽度,如果槽中对应参数长度超过<宽度>值,则使用参数的实际长度。
·如果参数长度小于<宽度>值,则用<填充>中的字符进行填充。<填充>参数省略,则默认用空格字符填充。
·<对齐>是指参数在指定<宽度>中输出时的对齐方式,分别用<、>、^对应左对齐、右对齐、居中对齐。
千分位分隔符<、>用于显示数字类型的千分位分隔符。
整数类型b、c、d、o、x、X这些后缀的含义分别如下。
·b:输出整数的二进制值。
·c:输出整数的Unicode编码。
·d:输出整数的十进制值。
·o:输出整数的八进制值。
·x:输出整数的小写十六进制值。
·X:输出整数的大写十六进制值。
输出结果:
浮点型e、E、f、%这些后缀的含义分别如下。
·e:输出浮点数对应的小写字母e的指数形式。
·E:输出浮点数对应的大写字母E的指数形式。
·f:输出浮点数的标准浮点形式。
·%:输出浮点数的百分形式。
浮点数输出时尽量使用<精度>表示小数部分的宽度,即保留几位小数。这样有助于更好地控制输出格式。
输出结果:
【案例3-10】 小明的记账单。
小明学会了用Python做各种计算编程,决定对自己的购物做个记账单。记账单的功能如下。
①记录每天的消费内容,包括地点、日期、物品名、数量、单价。
②统计总数量、总金额,以及每天的平均消费金额。
③记账格式整齐、美观。
④打印记账单。
运行结果:
在上文的代码中出现了新的符号:\n、\t。使用之后发现\n的输出结果换行了。这是一种特殊的格式化控制字符,用来控制输出效果,以反斜杠(\)开头,常用转义字符如表3-14所示。
表3-14 常用转义字符
【案例3-11】 文本进度条。
进度条是计算机在处理任务或执行软件时常用的增强用户体验的重要手段,能实时显示任务或软件的执行进度。我们用print()函数结合字符串的格式化来实现非刷新文本进度条和单行刷新文本进度条。
先按任务执行百分比将整个任务分成100个单位,每执行n%就输出一次进度条,每一次输出都包含进度百分比,完成的部分用“**”表示,未完成的部分用“..”表示,中间用一个小箭头“->”分隔,如:
由于程序执行速度非常快,远超人眼的视觉感知,直接输出,我们看不出来效果,因而每一次输出时让计算机等待t秒,以增强显示效果。而等待需要使用时间库time中的sleep()方法。
非刷新文本进度条程序代码如下:
输出结果:逐行实现0%~100%的变化输出。
单行刷新文本进度条:想要实现在单行中动态刷新,需要将所有的输出都固定在同一行,不断用后面新生成的字符串覆盖之前的输出,形成动态效果。可以利用特殊的格式化控制字符(\r)来实现,它的功能是将光标移到本行首字符位,再控制输出不换行,即在print()函数中设置end属性,这样可以将所有的输出固定在一行。
输出效果:单行动态实现从0%~100%的变化。