はじめに
今回は色々な文字列に関する型として、バイト列型、バイトアレイ型、文字列型の 3 つを解説します。
YouTube動画
可変と不変
クラスは、可変(ミュータブル)と不変(イミュータブル)の 2 種類のタイプがあります。
可変とは、クラスのインスタンスが持っているデータが変更可能な事です。
不変とは、変更不可能な事です。
バイトアレイ型は可変で、バイト列型は不変です。文字列型は不変です。
バイト列型
バイト列型は、アスキー文字を表現するための 0 から 255 までの整数値の配列を持つデータ型です。
不変なので、一度インスタンスを作成してしまうと、データは変更出来ません。
バイト列型のインスタンスを作成するには、リテラルかコンストラクタで整数の配列を指定します。
参考:
アスキー: Wikipedia
>>> b"abc" # リテラル
b'abc'
>>> b"\x61\x62\x63" # リテラル (16進数文字列で指定)
b'abc'
>>> bytes([97, 98, 99]) # 整数のリストで指定 (10進数)
b'abc'
>>> bytes([0x61, 0x62, 0x63]) # 16進数の整数のリストで指定
b'abc'
>>> b = _ # 直前の結果をアンダースコアで指定
>>> b
b'abc'
>>> b[0] = 100 # エラー (データの変更不可)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'bytes' object does not support item assignment
バイトアレイ型
バイトアレイ型も整数値の配列を持つデータ型ですが、データを変更可能です。
作成方法はコンストラクタを使用します。
また、インスタンスが同一かを確認するには、id() 関数を使用します。
id() 関数はオブジェクトのユニークな ID を取得します。
>>> bytearray(b"abc") # バイト列のリテラルで指定
bytearray(b'abc')
>>> bytearray(b"\x61\x62\x63") # 16進数文字列で指定
bytearray(b'abc')
>>> bytearray([97, 98, 99]) # 整数のリストで指定 (10進数)
bytearray(b'abc')
>>> bytearray([0x61, 0x62, 0x63]) # 16進数の整数のリストで指定
bytearray(b'abc')
>>> b = _ # 直前の結果を b に保持
>>> b
bytearray(b'abc')
>>> id(b) # ID を確認
1389539340464
>>> b[0] = 100 # データを変更
>>> b
bytearray(b'dbc') # データが変更されている
>>> id(b) # ID が変わっていない
1389539340464
文字列型
文字列型は、ユニコード文字の配列です。
インスタンスは、不変です。
リテラルはダブルクォーテーションで括るか、シングルクォーテーションで括ります。
基本的に同じ意味ですが、シングルクォーテーションやダブルクォーテーションを文字に含む場合に、エスケープしなくても使えるかどうかです。
また、strクラスのコンストラクタで文字列のインスタンスを作成出来ます。
>>> "neko" # リテラル (ダブルクォーテーション)
'neko'
>>> 'inu' # リテラル (シングルクォーテーション)
'inu'
>>> "My name is 'PythonNan'" # エスケープせずに'が使える
"My name is 'PythonNan'"
>>> 'My name is "PythonMan"' # エスケープせずに"が使える
'My name is "PythonMan"'
>>> "My name is \"PythonNan\"" # エスケープが必要
'My name is "PythonNan"'
>>> 'My name is \'PythonMan\'' # エスケープが必要
"My name is 'PythonMan'"
>>> str(True) # 文字列に変換
'True'
>>> str(1) # 文字列に変換
'1'
>>> str(1.0) # 文字列に変換
'1.0'
3つのダブルクォーテーションやシングルクォーテーションは、複数の行の文字列を生成できます。
>>> """
... This is a pen.
... This is an apple.
... """
'\nThis is a pen.\nThis is an apple.\n'
>>> '''
... Apple and pen.
... '''
'\nApple and pen.\n'
>>>
書式指定
以下の3通りの書式指定があります。
- % を使用 (古い方法: 非推奨)
- format() メソッドを使用
- f文字列 (Python 3.6以降)
※ string.Template というのもありますが、何も import せずに使用可能なのは、上記 3 通りの方法です。
% を指定すると、書式を指定出来ます。
但し、この方法は古い方法で今は推奨されません。
>>> a = "inu"
>>> b = 10
>>> "%s %d" % (a, b)
'inu 10'
strクラスの format() メソッドで書式指定出来ます。
>>> a = "inu"
>>> b = 10
>>> "{} neko {}".format(a, b)
'inu neko 10'
>>> "{1} neko {0}".format(a, b) # 順序を指定
'10 neko inu'
>>> "{b} neko {a}".format(a="inu", b=10) # キーワード引数を使用
'10 neko inu'
>>> "{:05}".format(b) # 書式指定も可能 (書式指定は他も色々ありますが他は省略)
'00010'
接頭辞として、「f」や、「r」を付けると特殊な意味になります。
(「f」や「r」は大文字「F」や「R」でも良い)
f文字列を使用すると、{} 内に変数や式を指定して書式指定が出来ます。
raw文字列は、エスケープシーケンスがエスケープシーケンスとして解釈されないようになります
>>> "abc\ndef" # \nは改行を意味するエスケープシーケンス
'abc\ndef'
>>> r"abc\ndef" # raw文字列なので、エスケープシーケンスが適用されない
'abc\\ndef'
>>> a = "neko"
>>> b = 10
>>> f"inu {a} kuma {b} saru" # f文字列
'inu neko kuma 10 saru'
>>> f"inu {a.upper()} kuma {b + 20} saru" # {}内に変数だけでなく式も使用可能
'inu NEKO kuma 30 saru'
>>> f"{b:05}" # 書式指定も可能 (書式指定は他も色々ありますが他は省略)
'00010'
シーケンスとイテラブルに関して
バイト列型とバイトアレイ型と文字列型は、以下の特徴を持ちます。
- シーケンス: 整数のインデックスを指定して、要素にアクセスできる
- イテラブル: 要素を1つずつ返すことができる
シーケンスは、[] でインデクシングやスライスが出来ます。
またシーケンスは、組み込み関数 len() で長さ (要素の個数) を取得できます。
後で for 文を解説しますが、イテラブルは for 文で要素を1つずつ取り出して反復する事が可能です。
[] を使用すると、部分文字列を抽出出来ます。
[start : end : step]で、それぞれ開始、終了、オフセットを指定します。
>>> "abcdef"[0] # 一番初めの文字
'a'
>>> "abcdef"[-1] # 一番最後の文字
'f'
>>> "abcdef"[1:] # 最初から2番目以上の文字列
'bcdef'
>>> "abcdef"[:-2] # 最後から2番目までの文字列
'abcd'
>>> "abcdef"[1:-2] # 最初から2番目から最後から2番目までの文字列
'bcd'
>>> "abcdef"[::2] # 最初から最後までの2個置きの文字列
'ace'
組み込み関数 len() で文字列の長さを取得出来ます。
また、「+」や「*」で文字列の演算が出来ます。
また、「<」や「>」や「==」などで比較も出来ます。
>>> s = "abcdef"
>>> len(s)
6
>>> a = "inu"
>>> b = "neko"
>>> a + " " + b
'inu neko'
>>> a * 3
'inuinuinu'
>>> "inu" < "neko" # i よりも n の方がアルファバット順で後なので、True
True
>>> "inu" == "neko" # 同じ値ではないので、False
False
メソッド
str クラスのメソッドは沢山ありますが、分割(split)と結合(join)だけ紹介します。
>>> a = "inu neko"
>>> a.split() # スペース区切りで分割
['inu', 'neko']
>>> b = _
>>> b
['inu', 'neko']
>>> ", ".join(b) # 文字列のリストを結合
'inu, neko'
おわりに
以上、文字列に関する型のまとめでした。
次回は、タプル型とリスト型に関して解説します。