Ad

Pythonの文字列の連結は、簡単なものなら+演算子で行います。

>>> a = "1 " + "2"
>>> a
'1 2'

しかし、+は演算のたびに新しい文字列オブジェクトを生成するので、たくさんの文字列を連結すると遅くなります。

そのような場合は、たとえばリストやタプルを連結するならjoinを使います。

>>> b = ("This", "is", "a", "pen.")
>>> " ".join(b)
'This is a pen.'

joinは指定された文字を挟んで文字列を連結します。

>>> "|".join(b)
'This|is|a|pen.'

空文字列も使えます。

>>> "".join(b)
'Thisisapen.'

%を使うと文字列を文字列の中に埋め込めます。

>>> "%s pen %s %s ballpoint %s" % b
'This pen is a ballpoint pen.'

これらを使った方が、多くの文字列を連結するときには処理が速くなり、また可読性も高くなります。

文字列定義を連続して書くときの注意 anchor.png Edit

文字列の定義は連続して書くとひとつの文字列に連結されます。

>>> a = 'abc' 'defg'
>>> a
'abcdefg'

「\」を使って改行したいときには便利です。

>>> a = 'abc' \
... 'def'
>>> a
'abcdef'

一方で、文字列の配列を定義しようとして、「,」を忘れるとつながったりします。

>>> a = ['a', 'b' 'c']
>>> a[1]
'bc'

わかりにくいバグの原因になるので要注意です。

Page Top

Unicodeに関する注意 anchor.png Edit

Unicodeを使う時にはStr型との混在に気をつける必要があります。 例えば

s = u"これは%sです" % "Python"
print type(s)

結果

<type 'unicode'>

となり、Str型にStr型で扱える文字のみが含まれる場合は、問題なくUnicodeに変換してくれます。

一方、

s = u"これは%sです" % "パイソン"

結果:

  File "unicode_test.py", line 12, in <module>
    s = u"これは%sです" % "パイソン"
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

となり、エラーとなります。

joinでも同じことが言えます。

a = [u"あ",u"い",u"う",u"え",u"お"]

print "ん".join(a)

これは「ん」がUnicodeでないため、エラーになります。

このため、テストの時はたまたま英数しかなくうまくいったのに、実際のデータで動かしてみると、中にマルチバイト文字が存在していたため、エラーになるといったことが起こります。

Python2.7での文字列の連結では、かならずStrとUnicodeが混在していないことをチェックしてください。 またテスト時に可能性があるならマルチバイト文字もテストしておきましょう。

またはPythonのバージョン3以降を使うと自動で変換してくれるので安心です。


Front page   Edit Freeze Diff Backup Upload Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 1065, today: 1, yesterday: 2
Princeps date: 2016-07-22 (Fri) 03:50:24
Last-modified: 2017-03-28 (Tue) 13:35:14 (JST) (840d) by njf
広告

ログイン

ユーザー名:


パスワード:





パスワード紛失


NJF