1

从文档中, raw_input() 从输入中读取一行,将其转换为字符串(去除尾随的换行符),然后返回。

有了那张纸条,

a = 'testing: '
sep = '-'
c = raw_input('give me some args: ')          <--- giving 'a b c d'

def wrap( a, sep, *c):
    print a + sep.join(c)

wrap(a, sep, c)

str = 'a b c d'
print sep.join(str)

他们都应该打印出同样的东西,但是......

print a + sep.join(c) 给出测试:abcd
print sep.join(str) 给出a- -b- -c- -d

为什么sep.join()在 wrap 函数中不起作用?

编辑从 *c 更改为 c 使输出相同,但这有点让我感到困惑,因为我认为 *c 解包 args 但是当我打印 c 时,它给出 ms ('abc d',) 与字符串 'abc d' 相比所以从某种意义上说,它是将它们组合成一个与解包相反的元组实体?

或者...它不解压缩字符串而只列出列表?

4

3 回答 3

3

由于 splat (*),在您的函数c中是一个元素的元组,因此从不使用分隔符。在主程序中,您在一个字符串上调用 join,该字符串被拆分为字符。然后你会得到与分隔符的数量一样多的字符(减去一个)。

于 2013-07-15T20:13:43.777 回答
2

join 需要一个数组而不是字符串,因此如果您尝试将参数用作单独的项目,则需要使用c = c.spilt(' ')并去掉def wrap.

令我惊讶sep.join(str)的是,将 str 视为一个字符数组,因此字母和空格之间的额外 -s 。

于 2013-07-15T20:15:01.737 回答
1

这个:

>>> wrap(a, sep, str)
testing: a b c d

不同于:

>>> wrap(a, sep, *str)
testing: a- -b- -c- -d

字符串字符的列表。您可以将函数签名从更改def wrap(a, sep, *c):def wrap(a, sep, c):,您应该没问题。

于 2013-07-15T20:13:40.357 回答