无法准确理解一行Python代码

时间:2009-06-25 16:30:46

标签: python syntax

Alex's answer在翻译为英语时有以下行

print "%2d. %8.2f %8.2f %8.2f" % (    
            i, payment, interest, monthPayment)

我不确定该行

"%2d. %8.2f %8.2f %8.2f" %         #Why do we need the last % here?

这似乎意味着以下

  1. 申请%2d。我
  2. 将%8.2f应用于付款
  3. 将%8.2f应用于利息
  4. 将%8.2f应用于monthPayment
  5. %-words似乎意味着以下

    1. %2d:两位小数的十进制表示

      2-4。 %8.2f:两位小数的浮点表示

    2. 我不确定为什么我们使用8 in%8.2f。

      您如何理解具有挑战性的路线?

6 个答案:

答案 0 :(得分:7)

8.2中的8是宽度
“要打印的最小字符数。如果要打印的值小于此数字,则结果将填充空格。即使结果较大,该值也不会被截断”
2是小数位数

最终的%只是将格式字符串(引号)与参数列表(括号中)相关联。 他们选择%来做这件事有点令人困惑 - 可能有一些深刻的蟒蛇理由。

编辑:显然'%'的使用仅仅是因为'%'在格式中使用 - 这是恕我直言,并且保证会引起混淆。这就像在浮点数的末尾需要一个额外的点来表明它是浮点数!

答案 1 :(得分:4)

最后一个%是一个运算符,它接收前面的字符串和后面的元组,并在您注意时应用格式。有关详细信息,请参阅Python tutorial

答案 2 :(得分:1)

%是一个生成格式字符串的运算符。一个简单的例子是:

"%s is %s" % ( "Alice", "Happy" )

哪个会评估为字符串"Alice is Happy"。提供的格式字符串定义了传递的值如何放入字符串中;语法可用here。简而言之,d是“视为十进制数”,8.2是“填充到8个字符并舍入到2个小数位”。从本质上讲,它看起来特别是使用了这种格式,以便在使用等宽字体查看时,答案排成一行。 :)

在我的代码示例中,s表示“视为字符串”。

答案 3 :(得分:1)

字符串后面的%告诉Python尝试填写左侧的变量 '%'运算符,带有'%'运算符右侧列表中的项目。

'%'运算符知道通过查找以%开头的字符串中的字符来查找字符串中的变量。

您的困惑在于您认为%运算符和字符串中的%字符是相同的。

尝试以这种方式查看它,在字符串%之外是一个运算符,在字符串内部它可能是替换模板。

答案 4 :(得分:1)

像往常一样,需要提供文档引用 - string-formatting

  

字符串和Unicode对象有一个独特的内置操作:%运算符(模数)。这也称为字符串格式插值运算符。给定格式%值(其中format是字符串或Unicode对象),格式的%转换规范将替换为零个或多个值元素。效果类似于在C语言中使用sprintf。

转换说明符的说明,用于解释%8.2f

  

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

  1. '%'字符,用于标记说明符的开头。
  2. 映射键(可选),由带括号的字符序列组成(例如,(somename))。
  3. 转换标志(可选),它会影响某些转换类型的结果。
  4. 最小字段宽度(可选)。如果指定为'*'(星号),则从值的元组的下一个元素读取实际宽度,并且要转换的对象在最小字段宽度和可选精度之后。
  5. 精确(可选),以'。'形式给出(点)后跟精度。如果指定为'*'(星号),则从值的元组的下一个元素读取实际宽度,并且要转换的值在精度之后。
  6. 长度修饰符(可选)。
  7. 转换类型。
  8. 当右参数是字典(或其他映射类型)时,格式字符串包括映射键(2)。将示例分解为2个步骤,我们有一个字典和一个包含字典中的键的格式(#是一个键):

    >>> mydict = {'language':'python', '#':2}
    >>> '%(language)s has %(#)03d quote types.' % mydict
    'python has 002 quote types.'
    >>> 
    

答案 5 :(得分:0)

%8.2f表示允许8个字符空格保存由持有浮点数的相应变量给出的数字,然后小数精度为2。