Python编号打印格式使用%。* g

时间:2016-02-12 17:52:53

标签: python string-formatting

我在网上找到了这个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 ...)?

有人可以打破这个并向我解释一下吗?

2 个答案:

答案 0 :(得分:5)

*是一个大小的占位符。它告诉格式化操作从右侧元组中获取 next 值,并将其用作精度。

在您的示例中,' next'第一个广告位的值为5,因此您可以将其视为%.5g,用于格式化2.23523523。第二个广告位使用3作为宽度,因此%.3g格式为12.353262

请参阅String Formatting Operations documenation

  

转换说明符包含两个或多个字符,并具有以下组件,这些组件必须按以下顺序出现:

     

(...)

     
      
  1. 最小字段宽度(可选)。如果指定为'*'(星号),则从值的元组的下一个元素读取实际宽度,并且要转换的对象在最小字段宽度和可选精度之后。

  2.   
  3. 精度(可选),以'.'(点)为单位,后跟精度。如果指定为'*'(星号),则从值的元组的下一个元素读取实际宽度,并且要转换的值在精度之后。

  4.   

因此,最小宽度和精度都可以随*变化,并且文档明确指出要转换的值来自宽度和精度

答案 1 :(得分:0)

在格式规范中,每个项目都有字段宽度。大部分时间都是常数:

 The value is %.16g

但是字段宽度/精度也可以是变量。 *表示将splat替换为格式列表中的下一个整数

 The value is %.*g
如果在格式化值之前有16

将执行相同的操作:

 "The value is %.*g" % (16, 14.372492384472)