2.4. 文字列

文字列(string)とは、引用符で囲んで記述する Unicode 文字の並びです。シングルクォートとダブルクォートは等価なので、テキスト中に現れる引用符をエスケープせずに済むスタイルを選ぶとよいでしょう。

name    = "OpenMV Cam"
company = 'OpenMV, LLC'
message = "She said \"hi\""        # both styles can be used
same    = 'She said "hi"'

三重引用符による文字列("""...""" または '''...''')は複数行にわたって記述でき、改行をそのまま保持します。

banner = """boot ok
firmware v1.28
"""
print(banner)

出力:

boot ok
firmware v1.28

2.4.1. エスケープシーケンス

通常の文字列の中では、\ が特殊文字を導入します。

  • \n -- 改行

  • \t -- タブ

  • \\ -- リテラルなバックスラッシュ

  • \' / \" -- リテラルな引用符(そのままだと文字列を終了させてしまう場合に使用)

  • \xHH -- 16進コード HH の文字

  • \uHHHH -- Unicode コードポイント HHHH

文字列に多数のバックスラッシュが含まれる場合は、リテラルの前に r を付けて raw(生の)文字列にします。すると、バックスラッシュはそのまま扱われ、\n は改行に置き換えられずに2文字のまま残ります。

win_path = r"C:\Users\OpenMV\camera.py"
literal  = r"\n is two characters, not a newline"

2.4.2. 連結と繰り返し

2つの文字列は + で結合され、文字列は * で繰り返されます。

greeting = "Hello, " + name + "!"
line     = "-" * 40              # 40-character separator

ループ内で + を繰り返すと、反復のたびに新しい文字列が確保されます。多数の断片から大きな文字列を組み立てる場合は、str.join() を使ってください。

2.4.3. 長さ、インデックス指定、スライス

len() は文字列内の文字数を返します。[] によるインデックス指定は、指定した位置にある1文字分の文字列を返します。負のインデックスは末尾から数えます。

>>> s = "OpenMV"
>>> len(s)
6
>>> s[0]
'O'
>>> s[-1]
'V'

スライス s[start:stop] は、位置 start から、それを含まない stop の手前までの部分文字列を返します。どちらの端も省略でき、その場合はそれぞれ「先頭」または「末尾」を意味します。さらに任意の3番目の値 s[start:stop:step] を指定すると、文字を飛ばして取り出せます。

各文字の間に位置マーカーが付いた文字列 "OpenMV"。スライスが2つの位置の間にある文字をどのように選択するかを示しています。

スライスの位置は文字と文字の にあります。s[2:5] は位置 2、3、4 にある文字を選択します。

>>> s = "OpenMV"
>>> s[2:5]
'enM'
>>> s[:3]
'Ope'
>>> s[3:]
'nMV'
>>> s[::-1]
'VMnepO'                     # whole string, reversed

範囲外のスライスは、存在する部分だけを黙って返します。s[100:200] はエラーではなく空文字列 "" になります。一方、範囲外のインデックス指定は IndexError を発生させます。

2.4.4. 不変性

文字列はその場で変更することはできません。文字列を変更するように見える操作も、実際には新しい文字列を返し、元の文字列はそのまま残します。

>>> name = "OpenMV"
>>> name.upper()
'OPENMV'
>>> name
'OpenMV'                     # unchanged

文字列を「変更」するには、新しい値に名前を再束縛します。name = name.upper() のようにします。