【问题标题】:Why does .format(function()) not work, but % prints the value?为什么 .format(function()) 不起作用,但 % 打印值?
【发布时间】:2018-02-10 05:33:25
【问题描述】:

我写的代码:

def ball(f):  
    py_ball = f * 5
    u_ball = py_ball / 10  
    return py_ball, u_ball
print("py ball: {}, u ball: {}".format(ball(100)))

当我使用str.format 时,它会抛出异常:

回溯(最近一次通话最后): 文件“rear.py”,第 5 行,在 print("py 球: {}, u 球: {}".format(ball(100))) IndexError:元组索引超出范围

但如果我使用% 格式:

print("py ball: %d, u ball: %d" % ball(100))

它工作得很好并产生:

py ball: 500, u ball: 50

【问题讨论】:

  • 使用*ball(100)解压返回值

标签: python python-3.x string-formatting


【解决方案1】:

str.format() 为每个插槽采用 单独的参数,而 % 接受一个元组或单个值。 ball() 返回一个元组,就str.format() 而言,这是一个单独的参数。因为您的模板有 2 个插槽,所以第二个插槽缺少一个参数。

您有两个选择:要么接受 .format() 的单个参数并使用格式化指令提取嵌套元素,要么将元组作为单独的参数传递。

后者可以使用*expr 调用符号来完成:

print("py ball: {}, u ball: {}".format(*ball(100)))

但格式规范还允许您处理元组元素:

print("py ball: {0[0]}, u ball: {0[1]}".format(ball(100)))

我在这里使用了明确的编号来表示只需要一个参数,在位置00[0] 取元组的第一个元素,0[1] 取第二个元素。

【讨论】:

    【解决方案2】:

    ball() 的返回值是一个单一的值——一个元组。

    当您调用 "...".format(ball(100)) 时,您会将单个值传递给最终需要两个值的函数。

    当您调用 "..." % ball(100) 时,您正在向 % 运算符提供一个元组,它需要一个元组!

    毫不奇怪,它在第二种情况下有效,在第一种情况下失败。

    尝试使用 splat 运算符将元组扁平化为对.format 的调用的参数,或者尝试自己扩展元组,或者尝试在.format 调用中使用命名参数访问:

    ball100 = ball(100)
    
    "py ball: {}, u ball: {}".format(*ball100)   # splat! Flatten the tuple
    
    "py ball: {}, u ball: {}".format(ball100[0], ball100[1]) # DIY
    
    "py ball: {ball[0]}, u ball: {ball[1]}".format(ball=ball100) # named arg
    

    【讨论】:

      【解决方案3】:

      您的格式字符串需要.format两个 参数,但您只提供一个(这是一个二元素元组,但它仍然是一个 参数)。 另一方面,% 运算符 需要 一个元组作为其右手参数,所以没关系。您可以使用前缀星号运算符解压缩元组:

      b = ball(100)
      print("py ball: {}, u ball: {}".format(*b))
      

      【讨论】:

        猜你喜欢
        • 2013-09-07
        • 1970-01-01
        • 2023-03-04
        • 2011-02-28
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多