《Python程序设计》——2.3 输出-阿里云开发者社区

开发者社区> 华章出版社> 正文

《Python程序设计》——2.3 输出

简介:

本节书摘来自华章计算机《Python程序设计》一书中的第2章,第2.3节,作者:[美]戴维 I.施奈德(David I. Schneider)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.3 输出

通过带有两个可选参数print函数和format方法的使用,能够产生更丰富的输出格式。
2.3.1 print的可选参数sep
下列形式的语句:
screenshot

将依次显示每个value的值并用空格分隔,其中,每个值可以是字符串或者数字。因此,可以说print函数在使用一个将空格字符作为分隔符的字符串。我们可以通过sep参数将分隔符改变为我们想要的任何字符串。如果sepString是一个字符串,那么下列形式的语句:
screenshot

将依次显示每个value的值并用sepString分隔。一些例子如下:
screenshot

2.3.2 print的可选参数end
在上面提到的任一语句执行后,输出的显示在当前行也就结束了。后面语句的输出将显示在下一行中。因此,可以说print语句是以执行了一个换行操作结束的(也可以说,print语句将光标移动到了下一行的开始位置或者print语句执行了一个“回车和换行”)。我们可以通过end参数将结束操作进行改变。如果endString是一个字符串,那么下列形式的语句:
screenshot

将显示从value0到valueN,然后在同一行的末尾显示endString,而代替了换行操作。这里给出了一些使用end参数的代码。

2.3.3 转义序列
转义序列是位于字符串中的短序列,用于指示光标或者允许一些特殊字符的输出。第一个转义字符是反斜杠()。最为常见的两个光标指示转义序列是t(产生一个水平制表符)和n(产生一个换行操作)。默认情况下,制表符的大小是8个空格,但是可以使用expandtabs方法增加或者减少制表符的大小。
例1 转义序列
下面的程序展示了转义序列t和n的用法。
screenshot

当计算一个字符串的长度时,每个转义序列可当作一个字符。例如,len("atbtc")的结果为5。反斜杠不被认为是一个字符,而是一个指示器告诉Python对跟随其后的字符进行特殊处理。转义序列n经常被看作为一个换行符。
反斜杠也可用于将引号变为普通字符。例如,语句print('Say it ain't so.')所显示的第三个单词是ain抰。反斜杠字符告诉Python将引号视为普通的单引号,而不是一个两旁的引号。另外两个有用的转义序列是"和\,可让print函数分别显示一个双引号字符和一个反斜杠字符。
在后面的章节中,我们会经常碰到以换行符结尾的字符串。例如,文本文件的每一行都是一个以换行符结尾的字符串。字符串方法rstrip可以用来从字符串末端移除换行符。例如,如果str1的值是"xyzn",那么str1.rstrip()的值为"xyz"。此外,当int、float和eval函数作用于以换行符结尾的字符串时,它们会忽略换行符。例如,int('7n')具有和int('7')一样的值。
2.3.4 域内输出对齐
程序经常需要以固定的宽度一列一列地显示输出。ljust(n)、rjust(n)和center(n)方法可用于以宽度为n的域,分别按照居左、居右和居中对齐字符串输出。如果一个字符串没有达到域指定的宽度,该字符串的右边、左边或者两边将用空格填充。如果该字符串长度大于指定的宽度,对齐方法可以忽略。
例2 输出对齐
下面的程序使用三种对齐方法创建一个职业棒球联赛中全垒打前三的击球员的表格。第一行用于标记表格中的每个列。前5列(第0~4列)列出了前三位击球员的排名。数字1、2和3居中显示在宽度为5的域中。后面的20列(第5~24列)记录了前三位击球员的姓名,每个名字居左显示在宽度为20的域中。每个名字的右侧使用空格填充。最后3列(第25~27列)记录了每位击球员击出的全垒打数目。考虑到每个数字长度都是三位,它们正好可以放到宽度为3的域中。尽管不使用rjust方法,该列的输出也是一样的。
screenshot

2.3.5 使用format方法对齐输出
format方法是最近才加入Python中的,有着与文本对齐方法一样甚至更为强大的功能。例如,它可以在数字中加入千位分隔符、四舍五入和将数字转换为百分数。我们将为大家展示这个方法文本对齐的能力,并给出一些其他的特性。
如果str1是一个字符串,并且w是域宽,那么下列形式的语句:
screenshot

产生与下列语句相同的输出:
screenshot

如果num是一个数字,并且w是域宽,那么下列形式的语句:
screenshot

产生与下列语句相同的输出:
screenshot

注意format方法能够直接接受数字。它们不需要转换为字符串。位于每个域宽度前的符号<、 ^和>要求print函数输出分别左对齐、居中对齐和右对齐。
在上面包含format方法的语句中,format方法中有个单独的参数(num)。经常有多个参数,分别要对应从0开始计数的多个位置。实际上,大括号中冒号前的0意味着num位于第0个位置上。当有多个参数的时候,相应地会有多对大括号,每对大括号对应一个参数。每对大括号里面冒号前的数字给出了每个所格式化参数的位置。
例3 输出对齐
下面的程序将产生与例2一样的输出,但使用的是format方法。请注意第四行。格式串{0:^5n}、{1:<20s}和{2:>3n} 分别决定了数字1、字符串“Barry Bond”和数字762的格式。
screenshot

当需要格式化数字时,我们使用字母d表示整型,字母f表示浮点型,符号%表示数字以百分数显示,而不是使用大括号中的可以表示任何类型数字的字母n。当使用f和%时,它们前面应该有一个小数点和一个整数。整数决定了小数部分显示的位数。在上面的三种情况下,如果我们想要千位分隔符,也可以通过在指定域宽的数字后面加入逗号来完成。
当format方法用于格式化数字时,居右对齐是默认的对齐方式。因此,当没有出现符号<、^或者>时,数字在域内将居右对齐显示。表2-4显示了一些语句及其对应的输出。
screenshot

跟随在冒号之后的域宽数字可以被忽略。在这种情况下,数字的显示方式将由冒号后的其他说明符来决定。
到目前为止,跟随着“.format”的字符串总是包含一对或多对大括号。然而,这个字符串可以是包含大括号的任意字符串。在这种情况下,大括号是占位符,告诉Python在什么位置插入format方法使用的参数。

例4 州数据
下面的程序使用花括号中的字符串来说明。
screenshot

注释

  1. 当大括号中冒号右边仅仅是字母s时,冒号和字母s可以被忽略。例如,{0:s}可以简写为{0}。占位符,如{0},不仅仅可以用于字符串,也可以用于数字和表达式。
  2. 当format方法用于格式化字符串时,居左对齐是默认的对齐方式。因此,当没有出现符号<、^和>时,字符串在其域内将居左对齐显示。
  3. rstrip方法不仅可以从字符串末尾移除换行符,也可以移除所有位于末尾的空格和转义序列。当int、float和eval函数应用于字符串时,他们将忽略所有位于末尾的空格和转义序列。
  4. 一个比较常见的错误是书写转义序列时用正斜杠(/)代替了正确的反斜杠()。
    实践问题 2.3

给出以下代码行的显示输出。
screenshot

习题2.3
在习题1~50中,给出下列代码行相应的输出。
screenshot
screenshot
screenshot
screenshot
screenshot
screenshot

  1. print("Hello")和print("Hello", end="n")产生相同的输出吗?
  2. print("HellotWorld!")和print("HellotWorld!".expandtabs(8))产生相同的输出吗?
    在习题53~58中,编写程序,执行所描述的任务。
  3. 服务员的小费 将给定的账单总额和小费比例作为输入,计算服务员的小费。如图2-23所示。
  4. 收益 将公司的年收入和支出作为输入,给出公司的净收益(收入减去支出)。如图2-24所示。
  5. 薪酬变动 一个常见的错觉是如果你的薪酬增加了10%再减少10%,你的薪水将保持不变。将薪水作为输入,然后显示薪酬增加了10%再减少10%后的薪水。程序也要显示出薪酬的变动百分比。如图2-25所示。
    screenshot
  6. 薪酬变动 一个常见的错觉是如果你的薪酬连续三次增长5%,那么你原先的薪水将增加15%。将薪水作为输入,然后显示薪酬连续三次增长5%后的薪水。程序也要显示出薪酬的变动百分比。如图2-26所示。
    screenshot
  7. 未来值 如果P美元(称为本金)以复合年利率r%进行投资,那么n年后投资的未来值可以通过以下公式给出:
    screenshot

在用户输入本金、利率和年数之后,计算投资的未来值。图2-27显示了1 000美元的投资在3年后会增长到1 157.63美元。

  1. 现值 f美元以复合年利率r%投资n年后的现值,是指根据现有投资金额以每年r%的利率投资n年后要达到f美元(称为未来值)。现值的计算公式是:
    screenshot

在用户输入未来值、利率和年数之后,计算投资的现值。图2-28显示了以每年4%的利率,要在6年后达到10 000美元,现在必须要投资7 903.15美元。
screenshot

实践问题2.3的解答

  1. spam and eggs。大括号中的s是默认的指示符。因此,print语句也可以写成:
    screenshot

我们在程序中使用指示符s能够提高可读性。它提醒程序员参数集合中有一个参数必须是字符串。

  1. Ask not what your country can do for you, ask what you can do for your country。
    前两对大括号显然对应的是字符串。第三对大括号以1开头,因此要求有在第1个位置上的参数,也就是"can do for"。同理,第四对大括号要求有在第0个位置上的参数。多次使用参数的能力是format方法十分优秀的一个特点。
  2. print('He said "How ya doin?" to me.')

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接