LoginSignup
0
0

More than 1 year has passed since last update.

WindowsによるPython入門 #05: 文字列

Last updated at Posted at 2023-02-24

はじめに

今回は色々な文字列に関する型として、バイト列型、バイトアレイ型、文字列型の 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'

おわりに

以上、文字列に関する型のまとめでした。
次回は、タプル型とリスト型に関して解説します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0