使用多个返回值函数的参数进行字符串格式化

时间:2015-02-10 00:58:19

标签: python string-formatting

如何使用返回多个值作为格式字符串输入的函数,而不会出现TypeError: not enough arguments for format string错误?

>>> def foo():
...     return 1, 2
... 
>>> foo()
(1, 2)
>>> print "%d,%d,%d" % foo(), 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string

预期产出:&#34; 1,2,3&#34;

3 个答案:

答案 0 :(得分:3)

元素索引

string.format()功能更强大,可让您access list elements or even attributes

>>> print "{0[0]},{0[1]},{1}".format(foo(), 3)
1,2,3

连接元组

foo(), 3的问题在于它是一个元组和一个整数,两种不同的类型。相反,您可以通过连接创建一个3元组。如果您使用string.format()它有点棘手,因为您需要先使用*运算符将其解压缩,以便将其用作参数:

>>> foo() + (3,)
(1, 2, 3)

>>> print "%d,%d,%d" % (foo() + (3,))
1,2,3

>>> print "{},{},{}".format(*foo() + (3,))
1,2,3

临时变量

当然,你总能这样做,这很明显但很冗长:

>>> foo1, foo2 = foo()
>>> print "%d,%d,%d" % (foo1, foo2, 3)
1,2,3

答案 1 :(得分:2)

print "%d,%d,%d" % foo(), 3无效的原因是因为Python认为您正在尝试在此处打印两个项目:"%d,%d,%d" % foo()然后3。因此,由于项目数量不足,第一个表达式明显失败:

>>> def func():
...     print "%d,%d,%d" % foo(), 3
...     
>>> import dis
>>> dis.dis(func)
  2           0 LOAD_CONST               1 ('%d,%d,%d')
              3 LOAD_GLOBAL              0 (foo)
              6 CALL_FUNCTION            0
              9 BINARY_MODULO       
             10 PRINT_ITEM          
             11 LOAD_CONST               2 (3)
             14 PRINT_ITEM          
             15 PRINT_NEWLINE       
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        

事实上甚至像"%d,%d,%d" % foo() + (3,)这样的东西也不起作用,因为我猜operator precedence在这里发挥作用:

>>> def func():
    print "%d,%d,%d" % foo() + (3,)
...     
>>> dis.dis(func)
  2           0 LOAD_CONST               1 ('%d,%d,%d')
              3 LOAD_GLOBAL              0 (foo)
              6 CALL_FUNCTION            0
              9 BINARY_MODULO       
             10 LOAD_CONST               3 ((3,))
             13 BINARY_ADD          
             14 PRINT_ITEM          
             15 PRINT_NEWLINE       
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE 

工作版本将是:

>>> print "%d,%d,%d" % (foo() + (3,))
1,2,3

答案 2 :(得分:0)

采用任意数量的参数并使用某些分隔符打印它们的一般解决方案是使用str.join

def foo():
    return 1, 2

>>> print(','.join(map(str,foo())))
1,2

另一个例子

def bar():
    return 4,5,6,7

>>> print(','.join(map(str,bar())))
4,5,6,7
相关问题