2011-07-23 15 views
9

私はPythonには新しく、文字列の連結に関連する2つの問題を理解するのに役立つ必要があります。文字列を追加して+記号を使用して互いに連結することができます。これが可能でどのように/理由です - しかし、私はちょうど最近あなたも理解することが私の最初の問題につながる、(事故によって/周りいじる)文字列を連結するために+記号を使用する必要はありませんがわかったPython String Concatenation - ' n'を連結する

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

!?

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

また、 '\ n'文字列が '改行'を生成することも理解しています。しかし、私の最初の問題と一緒に使用されたとき。私は次のようになる。

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

a 
a 
a 
a 
a 
a 
a 

だから私の第二の問題が発生 - 「なぜ私は手紙の7新しい行 『』つまり、リピータシンボルいけない、*、 『』 7回手紙を繰り返しを得るのですか。! ?次のとおり

>>> print 'a'*7 
aaaaaaa 

を私は何が起こっているかを明確に助けてください

+4

'印刷 '\ n' は '' * 7'農産物を' '使用\ NA' * 7'、ない 'A A 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. として、私はあなたが "それが可能であるか" によって何を意味するかわからないと同じように解釈されます。あなたはルールを書いています:隣り合う2つの文字列は連結されます。次にそれをパーサに実装します。どうして?

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

    こうすれば、あなたは何をしているのか簡単に説明できます。

  2. A * B + Cを実行すると、コンピュータは常にA回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はループを言及しなかった。 –