【问题标题】:Unable to understand a line of Python code exactly无法准确理解一行 Python 代码
【发布时间】:2009-06-25 16:30:45
【问题描述】:

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

%-words 似乎意味着以下内容

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

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

我不确定为什么我们在 %8.2f 中使用 8。

你如何理解挑战线?

【问题讨论】:

    标签: python syntax


    【解决方案1】:

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

    最后的 % 只是将格式字符串(在引号中)与参数列表(在括号中)链接起来。 他们选择 % 来执行此操作有点令人困惑 - 可能有一些深层次的 python 原因。

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

    【讨论】:

    • @all:我们必须使用 % 进行格式化的原因是什么?
    • @masi:请阅读:docs.python.org/library/…
    • 你不必使用 %... 这只是最常见的方式。 % 指的是 %s 样式的 printf 语法。字符串上的 % 运算符只是一个方便的 sprintf。您也可以使用模板模块:python.org/doc/2.5.2/lib/node40.html
    • 很大程度上是因为 print 是内置函数而不是函数调用——这在 python 3.0 中已修复。不幸的是,必须使用“%”,这会使新用户感到困惑,并且如果您错过它也不会给出非常有用的错误。
    • @mgb:这与 print 是语句还是函数完全无关,它不是“必要的”。如果语言中不存在任何类型的打印(使用 sys.stdout.write() 代替),则 % 的问题仍然存在。
    【解决方案2】:

    最后一个 % 是一个运算符,它接受前面的字符串和后面的元组,并按照您的说明应用格式。有关详细信息,请参阅Python tutorial

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        试着这样看,在字符串 % 外面是一个操作符,在字符串里面它可能是一个替换模板。

        【讨论】:

          【解决方案5】:

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

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

          以及转换说明符的说明%8.2f

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

          1. “%”字符,标记说明符的开始。
          2. 映射键(可选),由带括号的字符序列组成(例如,(somename))。
          3. 转换标志(可选),影响某些转换类型的结果。
          4. 最小字段宽度(可选)。如果指定为“*”(星号),则从值中元组的下一个元素读取实际宽度,并且要转换的对象位于最小字段宽度和可选精度之后。
          5. 精度(可选),以“.”形式给出(点)后跟精度。如果指定为 '*'(星号),则从 values 中元组的下一个元素读取实际宽度,要转换的值位于精度之后。
          6. 长度修饰符(可选)。
          7. 转化类型。

          当右参数是字典(或其他映射类型)时,格式字符串包括映射键 (2)。将示例分解为 2 个步骤,我们有一个字典和一个包含字典中键的格式(# 是键):

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

          【讨论】:

          • @gimel:你能举个映射键的例子吗?文档有以下行: %(language)s 有 %(#)03d 引用类型。 --- 下面的“%(language)s has”是什么意思?
          • 添加了示例的两步版本。
          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2012-08-05
            • 2018-06-15
            • 1970-01-01
            • 1970-01-01
            • 2016-01-16
            • 2015-08-22
            • 2020-10-23
            • 1970-01-01
            • 2018-12-30
            相关资源
            最近更新 更多