我在网上找到了这个python示例,我想准确理解数字格式的工作原理:
print "%.*g\t%.*g" % (xprecision, a, yprecision, b)
我可以通过实验看到它打印出一个(使用精确的xprecision),一个标签然后是b(精确的yprecision)。所以,作为一个简单的例子,如果我运行
print "%.*g\t%.*g" % (5, 2.23523523, 3, 12.353262)
然后我得到
2.2352 12.4
我理解%g
通常如何运作。我也理解%
一般如何运作。在这个例子中令我困惑的是构造%.*g
。 *
如何在这里工作?我可以看到它以某种方式获取所需的精度值并将其替换为print表达式,但为什么会发生这种情况呢?为什么精确数字出现在格式化的数字之前(xprecision,a ...)?
有人可以打破这个并向我解释一下吗?
答案 0 :(得分:5)
*
是一个大小的占位符。它告诉格式化操作从右侧元组中获取 next 值,并将其用作精度。
在您的示例中,' next'第一个广告位的值为5
,因此您可以将其视为%.5g
,用于格式化2.23523523
。第二个广告位使用3
作为宽度,因此%.3g
格式为12.353262
。
请参阅String Formatting Operations documenation:
转换说明符包含两个或多个字符,并具有以下组件,这些组件必须按以下顺序出现:
(...)
最小字段宽度(可选)。如果指定为
'*'
(星号),则从值的元组的下一个元素读取实际宽度,并且要转换的对象在最小字段宽度和可选精度之后。- 醇>
精度(可选),以
'.'
(点)为单位,后跟精度。如果指定为'*'
(星号),则从值的元组的下一个元素读取实际宽度,并且要转换的值在精度之后。
因此,最小宽度和精度都可以随*
变化,并且文档明确指出要转换的值来自宽度和精度。
答案 1 :(得分:0)
在格式规范中,每个项目都有字段宽度。大部分时间都是常数:
The value is %.16g
但是字段宽度/精度也可以是变量。 *
表示将splat替换为格式列表中的下一个整数。
The value is %.*g
如果在格式化值之前有16
,将执行相同的操作:
"The value is %.*g" % (16, 14.372492384472)