理解Python中的这个类,运算符%与浮点数格式化

1 投票
3 回答
1329 浏览
提问于 2025-04-15 14:37
class FormatFloat(FormatFormatStr):
    def __init__(self, precision=4, scale=1.):
        FormatFormatStr.__init__(self, '%%1.%df'%precision)
        self.precision = precision
        self.scale = scale

    def toval(self, x):
        if x is not None:
            x = x * self.scale
        return x

    def fromstr(self, s):
        return float(s)/self.scale

让我困惑的是这一部分

FormatFormatStr.__init__(self, '%%1.%df'%precision)

这是不是意味着精度在1之前输入了两次,在df之前输入了一次?你知道df代表什么吗?我在其他地方没有看到它,甚至在它的祖先中也没有,如这里所示:

class FormatFormatStr(FormatObj):
    def __init__(self, fmt):
        self.fmt = fmt

    def tostr(self, x):
        if x is None: return 'None'
        return self.fmt%self.toval(x)

class FormatObj:
    def tostr(self, x):
        return self.toval(x)

    def toval(self, x):
        return str(x)

    def fromstr(self, s):
        return s

另外,我把这个放进我的Ipython里,得到了这个:

In [53]: x = FormatFloat(.234324234325435)
In [54]: x
Out[54]: <matplotlib.mlab.FormatFloat instance at 0x939d4ec>

我以为这会把精度减少到4,缩放到1。但实际上它被存储在我的内存中。我能取出来看看它对数字做了什么吗?

谢谢大家,你们真有帮助!

3 个回答

0

('%%1.%df' % precision) 这个表达式中,第一个 %% 会变成一个字面上的 %,而 %d 会被 precision 的值替换,最后的 f 也是直接放进去的。举个例子,结果可能是这样的:

>>> '%%1.%df' % 4
'%1.4f'

关于Python中字符串格式化的更多信息

要使用 FormatFloat 这个类,你可以试试这样做:

formatter = FormatFloat(precision = 4)
print formatter.tostr(0.2345678)
0

在Python的格式字符串中,"%%"的意思是“插入一个字面上的百分号”——第一个%是用来“转义”第二个%的,简单来说就是告诉程序后面的%不是用来格式化的。这里提到的字符串"%%1.%df" % precision实际上是在用一个格式字符串来生成另一个格式字符串,唯一会被替换的就是"%d"。你可以在交互式提示符下试一下:

>>> print "%%1.%df" % 5
'%1.5f'

FormatFloat没有定义__repr____str____unicode__(这些是用来类型转换的“魔法”方法),所以当你在交互式控制台中直接打印这个值时,你得到的只是实例的标准表示。要获取字符串值,你需要调用tostr()方法(这个方法是在父类中定义的):

>>> ff = FormatFloat(.234324234325435)
>>> ff.tostr()
0.234
2
>>> precision=4
>>> '%%1.%df'%precision
'%1.4f'

%% 会被转换成 %

1 会原样打印出来

%d 会以十进制数字的形式打印精度

f 会被字面意思打印出来

撰写回答