使用多个返回值函数的参数设置字符串格式



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

预期输出:"1,2,3"

元素索引

string.format()更强大,可以访问列表元素甚至属性:

>>> 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

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,)这样的东西也不起作用,因为我想操作符优先级在这里起作用:

>>> 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

获取任意数量的参数并用一些分隔符打印它们的通用解决方案是使用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

相关内容

  • 没有找到相关文章

最新更新