2011-07-23 93 views
9

我是新来的Python和需要帮助试图了解两个问题我收到有关连接字符串。我知道可以像使用+符号一样添加字符串来相互连接。Python的字符串连接 - 串联“ n”

>>> 'a' + 'b' 
'ab' 

然而,我刚刚发现你甚至都不需要使用+符号来连接字符串(由事故/摆弄周围),这导致了我的第一个问题理解 - 如何/为什么这是可能的!?

>>> print 'a' + 'b' 
ab 

另外,我也明白'\ n'字符串会产生'换行符'。但是当与我的第一个问题一起使用时。我得到以下。

>>> print '\n' 'a'*7 

a 
a 
a 
a 
a 
a 
a 

所以我的第二个问题是 - “为什么我得到的字母‘A’。换句话说,不应中继符号,*,重复的字母‘A’7倍的7条新线! ?具体如下

>>> print 'a'*7 
aaaaaaa 

请大家帮我澄清是怎么回事

+4

'打印 '\ n' 'A' * 7'农产品' '\ NA' * 7',而不是'一个一个A A A A了' –

+0

这只是在他的帖子中的格式错误。 – agf

回答

2

Python的连接字符串在一起的时候,你不要用逗号将它们分开:。

>>> print 'a' 'b' 
ab 

>>> print 'a', 'b' 
a b 

所以你实际上是打印'\na' 7倍。

+0

他知道字符串是这样连接的,阅读他的文章的其余部分。 – agf

17

"a" "b"变成"ab"时,这与串连+的串并不相同。当读取Python源代码时,为了方便起见,相邻的字符串会自动加入。

这不是一个正常的操作,这就是为什么它不遵循您期望的操作顺序为+*

print '\n' 'a'*7 

实际上是解释一样

print '\na'*7 

,而不是作为

print '\n' + 'a'*7 
1
  1. 我不知道你的意思是 “怎么可能” 。你写一条规则:将两个相邻的字符串连接起来。然后你在解析器中实现它。为什么?因为它可以让你方便地做这样的事情:

    re.findall('(<?=(foo))' # The first part of a complicated regexp 
          '>asdas s'  # The next part 
          '[^asd]'  # The last part 
         ) 
    

    这样,你可以描述你在做什么。

  2. 当你做A * B + C,计算机总是做次B首先,然后添加C,因为乘法来加入前。

    当您把字符串文字彼此相邻,和乘法做字符串连接,特殊字符串连接至上。这意味着'\n' 'a' * 7相同('\n' 'a') * 7,所以你重复的字符串是'\na'

1

您可能已经意识到,依赖于相邻字符串的隐式拼接有时会产生问题。此外,连接+运营商效率不高。如果只加入一些小字符串,这并不明显,但它的规模非常明显。

明确表示它;使用''.join()

print '\n'.join(['a'*7]) 
+0

在许多短字符串的循环中执行起来相当慢,因为它必须每次都得到'\ n'.join()方法,总是试着将它放在循环之外,或者使用map(str.join,sequence )代替。 – agf

+0

呃是的,有根据上下文可以做出的优化。尽管OP没有提到循环。 –