具有来自多个 return 值函数的参数的字符串格式
String formatting with argument from multiple return value function
如何使用 return 多个值的函数作为格式字符串的输入,而不出现 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()
更强大,让你 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
采用任意数量的参数并使用一些定界符打印它们的一般解决方案是使用 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
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
如何使用 return 多个值的函数作为格式字符串的输入,而不出现 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()
更强大,让你 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
采用任意数量的参数并使用一些定界符打印它们的一般解决方案是使用 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
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