Python 数字打印格式使用 %.*g

Python number print formatting using %.*g

我在网上找到了这个 python 示例,我想确切地了解数字格式的工作原理:

print "%.*g\t%.*g" % (xprecision, a, yprecision, b)

我可以通过实验看到,这会打印 a(精度为 xprecision),一个制表符,然后是 b(精度为 yprecision)。所以,作为一个简单的例子,如果我 运行

print "%.*g\t%.*g" % (5, 2.23523523, 3, 12.353262)

然后我得到

2.2352  12.4

我了解 %g 通常的工作方式。我也了解 % 通常是如何工作的。在这个例子中让我感到困惑的是构造 %.*g* 在这里如何工作?我可以看到它以某种方式获取所需的精度值并将其代入打印表达式,但为什么会这样?为什么精度数字出现在 (xprecision, a...) 格式的数字之前?

有人可以分解并向我解释一下吗?

* 尺寸占位符 。它告诉格式化操作从右侧元组中获取 next 值并将其用作精度。

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

参见String Formatting Operations documenation

A conversion specifier contains two or more characters and has the following components, which must occur in this order:

(...)

  1. Minimum field width (optional). If specified as an '*' (asterisk), the actual width is read from the next element of the tuple in values, and the object to convert comes after the minimum field width and optional precision.

  2. Precision (optional), given as a '.' (dot) followed by the precision. If specified as '*' (an asterisk), the actual width is read from the next element of the tuple in values, and the value to convert comes after the precision.

因此可以使用 * 使最小宽度和精度都可变,并且文档明确指出 要转换的值在宽度和精度之后 .

在格式规范中,每个项目都有字段宽度。大多数时候它是一个常数:

 The value is %.16g

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

 The value is %.*g

如果在要格式化的值之前有一个 16,将做同样的事情:

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