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] を指定すると、文字を飛ばして取り出せます。
スライスの位置は文字と文字の 間 にあります。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() のようにします。