数字类型实战——数字显示格式

未匹配的标注

如果你正在使用Python 2.6,3.0或更早的版本,前面例子的最后一个表达式的结果第一次看起来可能有点奇怪:

>>> b / (2.0 + a) # Pythons <= 2.6: 回显给出更多(或更少)数字
digits
0.80000000000000004
>>> print(b / (2.0 + a)) # 但 print 方法将数字四舍五入
0.8

在前一章中已经简单地碰到过这个现象,且它不存在于Python 2.7,3.1和之后的版本。这个奇怪结果背后的完整故事和浮点数硬件的限制和它不能在有限个位数上精确代表某些值有关。然而,因为电脑架构远远超出了本书的范围,为了巧妙的解决了这个问题,我们说电脑的浮点数硬件正在尽其所能且这不是它或者Python的错。

事实上,这真的只是一个显示问题——交互式提示符的自动回显结果显示了比print语句更多的数字,只是因为它使用了不同的算法。它们在内存中是同样的数字。如果不想看到所有的数字,使用print;如本章的侧边栏str 和 repr 显示格式 将解释:将得到一个用户友好的显示。从2.7和3.1开始,Python的浮点显示逻辑努力变得更智能,通常显示更少的十进制数字,但有时会更多。

然而,注意不是所有值都有那么多数字来显示:

>>> 1 / 2.0
0.5

而且除了使用print和自动回显外,还有更多方法在电脑中显示一个数字的位数(下面在Python 3.3中都可以运行,在老一点的版本中可能稍有不同):

>>> num = 1 / 3.0
>>> num # 自动回显
0.3333333333333333
>>> print(num) # 显式打印
0.3333333333333333
>>> '%e' % num # 字符串格式化表达式
'3.333333e-01'
>>> '%4.2f' % num # 可选的浮点格式
'0.33'
>>> '{0:4.2f}'.format(num) # 字符串格式化方法: Python 2.6, 3.0, 和之后的版本
'0.33'

这些表达式的最后三个使用了字符串格式化,这是一个提供格式化灵活性(将在接下来的关于字符串的章节中探索)的工具。它的结果是字符串,通常被打印到显示器或报告。


Str 和 repr 显示格式

技术上讲,默认的交互式回显和print的不同对应于内置的reprstr函数的不同:

>>> repr('spam') # 被回显使用: 像代码一样的形式
"'spam'"
>>> str('spam') # 被 print 使用: 用户友好形式
'spam'

这两个方法都将任意对象转换为它们的字符串表示:repr(和默认的交互式回显)产生看起来像是代码的结果;str(和print操作)如果可以的话,就转换为一个通常更用户友好的格式。一些对象有两个方法——str用于普通用途,repr带有额外细节。在类中学习字符串和操作符重载时,这个概念会再次出现,且在本书后面会发现更多这些通用内置函数的知识。

除了为任意对象提供打印字符串外,str内置函数还是字符串数据类型的名称,且在3系列中可以带一个编码名称来调用,将一个字节字符串解码为Unicode字符串(比如 str(b'xy', 'utf8')),且作为第4章中见到过的 bytes.decode的一个备用方法。后者的高级用法将在本书第37章中研究。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~