2011-07-23 45 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沒有提到循環。 –