ここで取り上げるクラスstrはPythonのオリジナルのマニュアルではテキストシーケンス型と呼んでいます。ですが、テキストシーケンスというのは馴染みにくいので、ここでは文字列と呼びます。文字列という呼び方からstringという名前のクラスだと思ってしまいますが、Pythonでstringというとstringモジュールを指し、似たような名前のf-stringはフォーマット文字列のクラスを指します。ですが、ここではあえて文字列とします。
文字列はシングルクオート、タブルクオート、三重ダブルクオートで囲みます。尚、本章のサンプルプログラムではデフォルトUTF-8であることを暗黙の前提とします。
シングルクオート 'abcd'
ダブルクオート "abcd"
三重ダブルクオート """abcd"""
文字列は、いずれも「abcd」としてクラスstrのインスタンスになります。文字列(文字リテラル)が並んでいると、それは1つの文字列(文字リテラル)として扱います。
# File: strsample.py
#文字列(連続した文字並び) Built-in type str
print('abc')
# 連結
print('abc' 'def')
s='abcdef'
print(s)Pythonの文字列のクラスであるstrは、文字列中の文字は内容を入れ替えることができません。
ミュータブル (mutable 可変) 内容を書き換えることが可能であるオブジェクト
イミュータブル (immutable 非可変) 内容を書き換えることが出来ないオブジェクト
クラスstrはイミュータブルなクラスです。下の例はコメントアウトされていますが、それはエラーを発生させてしまうからです。コードをみると文字列sの先頭に’X’を入れらるように思いますが、実行するとエラーになります。一度、下のコードを試して意図的にエラーを出し、そのメッセージを観察してみてください。
# immutable and error statement
# s[0]='X'クラスstrの文字の連結の例です。インスタンスsに文字列を連結させ、新しいインスタンスを作成して、それを変数にいれるということで文字を連結させることが出来ます。
# 新しいstrオブジェクトを作り連結
s='abcdef'
s=s+'ghij'
print(s)文字列の長さを調べるには組み込み関数len()を使います。クラスstrのメソッドでs.length()とか、あるいはs.lengthといったようにインスタンス内部の変数にアクセスできるような気がしますが、Pythonでは、組み込み関数len()を使って長さを調べます。
#組み込み関数len() / メソッドはない
print(len(s))文字列sの文字のポジションはs[]で示します。s[数字:数字]で文字列中のポジションを示します。s[-1]は文字列の最後の文字です。s[2:]は先頭から文字2をスキップするという意味です。s[:2]は先頭から2文字までしか使わないという意味になります。s[2:5]は先頭2文字スキップ、先頭から5文字までを使うということになります。
問題はs[5:2]ですが、5文字スキップして、先頭2文字までを使うというのは矛盾していて、正しくアクセスできていません。アクセス不可でエラーになるように思えますが、Pythonはエラーにはならず空文字列を返しますので注意が必要です。
# 文字列内の文字にアクセス
print(s[0])
print(s[-1])
print(s[2:])
print(s[:2])
print(s[2:5])
print(s[5:2])
t=2
k=5
print(s[k:t]) # エラーとはならず空文字列を返すクラスstrにもたくさんのメソッドがあります。下記の例はスプリッティングです。どのようなメソッドがあるかは「クラスstrのメソッド」を参考にしてください。
# メソッド
# Space Splited String
sss='abc def ghi'
print(sss.split())
# Comma Separated Value
str_csv='abc,def,ghi'
print(str_csv.split())
print(str_csv.split(','))バイト列は文字列によくにたデータ構造で、でも文字列ではないデータ構造です。C言語などでは「1文字は1バイトデータと同等」しているので比較可能ですが、Pythonではバイト列と文字列はクラスが別なので比較すると別なものとされてしまいます。
下の例ではaはクラスstrのインスタンスで内容が’abc’です。abはクラスbytes (Byte-like Object)で、内容はb’abc’です。a[0]とab[0]との == による比較Falseとなります。C言語の感覚で先入観をもっていると、strとbytesの中身を比較し、文字が同じだと思っていてTrueが返るはずだと思っているのに、何故か実際にはFalseになってしまうという、見つけづらいバグとなる可能性があります。文字列とバイト列はクラスが違うということに気をつけてください。
#文字列
a=str('abc')
print(a,type(a))
#バイト列 (Byte-like Object)
ab=b'abc'
print(ab,type(ab))
## Asciiコードの値が出力
print(ab[0])
if ab[0] == a[0]:
print("OK")
else:
print("NG")条件判断 if 文に関してはこちらで説明します。
クラスstrはシーケンス型の一種なのでなので、シーケンスに共通して使える機能が適用できます。