4

我很困惑为什么我可以将返回值分配/解包给split()适当数量的变量,但是在使用格式化指令的打印字符串中使用同样失败。

例如,给定:

In [202]: s
Out[202]: 'here are 4 values'

In [203]: s.split()
Out[203]: ['here', 'are', '4', 'values']

这按预期工作:

In [204]: a, b, c, d = s.split()

In [205]: print '%s %s %s %s' % (a, b, c, d)
here are 4 values

但这失败了..

 In [206]: print '%s %s %s %s' % (s.split())

我不确定为什么?不应该将返回的split()结果解包并分布在格式化字符串的预期参数上吗?

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\bla\Desktop\<ipython-input-206-600f130ff0b2> in <module>()
----> 1 print '%s %s %s %s' % (s.split())

TypeError: not enough arguments for format string

“注意足够多的论据” .. 我在列表中确实有正确数量的项目。在这种情况下,列表是否由于某种原因没有解包,但对变量赋值?

我在尝试回答这个问题时遇到了这个 问题

4

4 回答 4

4

你必须s.split()像这样转换成一个元组

>>> s = 'here are 4 values'
>>> '%s %s %s %s' % tuple(s.split())
'here are 4 values'

用于格式化或.format()改为使用,解包参数。

'{0} {1} {2} {3}'.format(*s.split())
于 2012-05-01T07:41:56.273 回答
4

根本问题是%-formatting 和 unpacking 根本不相关。% 要求值在一个元组中;其他类型的序列将不起作用。(虽然它会接受一个非元组值。)

不幸的是,所有元组都被解释为值的元组,无论这是否可取。因此,要将元组视为一个值,您必须将其封装在另一个元组中:

>>> '%s' % ('a', 'b')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
>>> '%s' % (('a', 'b'),)
"('a', 'b')"

format无论如何最好使用。

于 2012-05-01T07:48:25.423 回答
3

我认为问题在于 % 不允许参数解包。这是一个有效的方法:

>>> s = 'Here are some values'
>>> '{} {} {} {}'.format(*s.split())
'Here are some values'

@senderle 指出此语法仅适用于 python 2.7 及更高版本,以下是适用于以前版本的代码:

>>> s = 'Here are some values'
>>> '{0} {1} {2} {3}'.format(*s.split())
'Here are some values'
于 2012-05-01T07:48:39.647 回答
1
>>> s = 'here are 4 values'
>>> print '%s %s %s %s' % tuple(s.split())
here are 4 values
>>> print '%s' % s.split()
['here', 'are', '4', 'values']

Python 正在尝试将列表转换为字符串,因此它只需要 1 个参数

于 2012-05-01T07:45:23.843 回答