如何使用返回多个值作为格式字符串输入的函数,而不会出现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;
答案 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