ここまで、シングルクオート「'」またはダブルクオート「"」を使った文字列の記述について話をしてきた。が、Pythonでは「トリプルクオート」(三重引用符)と呼ばれる形式の文字列記述方法もある。
といっても、「'」や「"」のようなトリプルクオート記号があるわけではない。これはシングルクオートまたはダブルクオートを3つ連続させたもの(「'''」または「"""」)で文字列本体を囲んで記すものだ。トリプルクオート文字列を開始する三重引用符と対になる三重引用符との間に含まれるもの全てがその文字列の内容となる。ここには改行を含めることも可能だ。その一方で、上で述べたエスケープシーケンスも利用できる。以下に簡単な例を示す。
s = '''
これはトリプルクオート文字列です。改行も自由に記述できます。
シングルクオートの三重引用符の間なら、
ダブルクオートの三重引用符"""も入れられます(逆も可)。
エスケープシーケンス\n\tも含められます。
'''
print(s)
s
実行結果を以下に示す。
最初の出力はprint関数によるもので、三重引用符で囲んだ内容がそのまま表示されていることに注目しよう。その下は文字列自体がどのようになっているかを調べたもので、上で述べたエスケープシーケンスなどが含まれていることが分かる。
トリプルクオート文字列は、空行を含んだ長いテキストを表現したり、「docstring」(ドックストリング)と呼ばれる関数などの仕様をインラインで記述したりするために使用される。docstringの例を以下に示す(関数については第12回「関数の基本」から第15回「ローカル関数とラムダ式」で取り上げているので興味のある方はそちらを参照されたい)。
def add(a, b):
'''
add(a, b)
aとbを加算した結果を返す。
Parameters
----------
a : int
加算対象その1
b : int
加算対象その2
Returns
----------
int
aとbの加算結果
'''
return a + b
上に示した関数「add」は「def」で始まる行の下に「'''」行があり、そこから一番下の「return a + b」行の直前に「'''」行がある。この間に書かれているのがdocstringだ。ここには関数の説明や、関数に与える引数と戻り値などについて記述する。
この説明はトリプルクオート文字列(文字列リテラル)であり、それを変数に代入などせずにそのまま書いているので、プログラムを実行しても特に意味を持つものではない(第4回の「Pythonの式と文」で簡単に説明したように、文字列リテラルは「式」であり、その評価結果は文字列リテラルの値そのものとなる。ただし、その評価結果は変数に保存されないので、単に捨てられるだけ)。
だが、文字列リテラルの形で関数などに情報を組み込むことで、後からこの情報を利用できる。例えば、help関数にこの関数の名前を渡すと、上で記述したdocstringが表示される。
このように、その関数が何をするもので、どんな引数を受け取り、どんな値を返すかをプログラムコード内に埋め込めるので、Pythonに慣れてきて、関数(やクラス)をたくさん作るようになったら積極的にdocstringを使うようにしよう。なお、docstringについては第52回「docstringの書き方」を参照してほしい。
エスケープシーケンスに使うバックスラッシュ「\」を多数含む文字列を使う場合もある。例えば、Windowsで「C:\Users\deepinsider\Documents\work」ディレクトリにある「data.txt」ファイルを開こうを思ったら、「C:\Users\deepinsider\Documents\work\data.txt」を文字列として使う必要があるだろう。今までに見た文字列では'C:\\Users\\deepinsider\\Documents\\work\\data.txt'のように全ての「\」をエスケープして「\\」にする必要がある。だが、これは面倒くさいし、どこかで間違える可能性もある。このようなときには、「raw文字列」を使うとよい。
「raw文字列」の「raw」とは「生の」「加工されていない」といった意味があり、raw文字列では、そこに書かれた文字は「特殊な意味を付加されず、生の文字」として扱われる。簡単にいえば、エスケープシーケンスを開始する「\」は「そのまま」の「\」として扱われるということだ。raw文字列は、文字列を開始するシングルクオート/ダブルクオートの前に「r」または「R」を置くだけで作成できる。
例えば、上で見たパスをraw文字列として記述してみよう。
raw_str = r'C:\Users\deepinsider\Documents\work\data.txt'
print(raw_str)
raw_str
変数raw_strにraw文字列を代入して、それをprint関数で出力した後に、評価している。実行結果を以下に示す。
print関数の出力は「\」がきちんと表示されている。また、セルの最後で「raw_str」とだけ書いて、その値を評価すると、シングルクオートで囲まれた文字列が表示されている。これを見ると、「\」が「\\」にエスケープシーケンスを使って表記されていることも分かる。今も述べたように、Windowsでファイルパスを含んだ文字列を記述するときなどには便利に使えるだろう。
Python 3.6以降では「フォーマット済み文字列リテラル」(f文字列)と呼ばれる文字列も利用できるようになっている。これは文字列が持つformatメソッドで使用できる書式指定を利用して、文字列の中に変数の値や計算式の値を埋め込むものだ。f文字列は「f」または「F」を先頭に置き、シングルクオート/ダブルクオート/トリプルクオートで囲んだ文字列を記述していく。その中で波かっこ「{}」に変数や計算式を記述すると、それらの値が文字列の中に埋め込まれる。この「{}」で囲まれた部分のことを「置換フィールド」と呼ぶ。
以下に例を示す。
x = 1
y = 100
result = f'{x} + {y} = {x + y}'
print(result)
上の例では、3か所に変数xとy、その加算結果を埋め込んだ文字列を作成している。文字列resultの先頭にある「{x}」には変数xの値が、次の「{y}」には変数yの値が、最後の「{x + y}」には変数xとyの加算結果が埋め込まれる。よって、実行結果は次のようになる。
置換フィールドの中には、数値を右揃えにする、小数点以下の桁数を指定する、16進数表記にするなど、さまざまな書式を指定できる。これらについては第7回「文字列の書式指定」で解説する。ただ、書式指定をせずとも、画面に何らかの計算結果を表示したいだけといったときでも、f文字列を使うと、説明と計算結果を組み合わせた文字列を簡単に組み立てられるので、覚えておくとよいだろう。
さらにPython 3.8からは波かっこ「{}」内に式を記述する際に末尾に等号「=」を記述できるようになった。「=」を記述すると、埋め込まれる文字列が「式=計算結果」となる。例えば、波かっこ内で「=」を使わずに変数xの値を「x = 1」のような形で文字列に埋め込むには次のようなコードを書くことになる(プログラムの動作を確認するときには、簡易的にこのようなコードを追加して変数の値を確認したくなるときがある)。
x = 1
s = f'x = {x}'
print(s)
変数xの値を知るのに「x = {x}」と書くのが煩雑に感じる人もいるだろう。Python 3.8以降ではこれを次のように書けるようになった。
x = 1
s = f'{x = }'
print(s)
ほんのわずかな手間の削減ではあるが、便利なので紹介することにした。以下に実行結果を示す。
input関数でユーザーから何かの数値を入力してもらい、その値を2倍して、表示するプログラムを作ってみよう。なお、第2回「Hello Python」の「もう少し難しいHello Worldプログラム」で触れているように、「Try Jupyter」ページの「Jupyter Notebook」リンクから起動するPython環境では以下のコードがうまく動作しない。対処策としては上記ページにあるように、Binderを使う方法がある。以下では、Binderを使って起動した環境で話を続けることにしよう。
user_input = input('input some number: ')
result = user_input * 2
print(result)
これをセルに入力して、実行する。すると、入力ボックスがセルの下に表示されるので、何か数値を入力して[Enter]キーを押す。以下は「100」を入力して[Enter]キーを押したところだ。
「100」を2倍したつもりなのに、答えは「100100」になってしまった。実は、input関数の戻り値は「常に文字列」となる。そして、文字列に対して乗算をすると、「掛けた数だけ、その文字列が繰り返されたもの」が演算の結果となるのだ(詳しくは次回に説明する)。そのため、このような結果になってしまった。入力してもらった数値(実は文字列)を2倍するには、文字列を数値に変換する必要があるということだ。
第3回の算術演算の例でも述べたが、Pythonにはある型の値を別の型の値へと「型変換」するための仕組みが用意されている。第3回では整数値と浮動小数点数値を相互に変換するものとして、int関数やfloat関数を紹介したが、これらの関数は文字列から数値への変換でも使える。使い方は簡単で、これらの関数に文字列として表現された数値を渡すだけだ。よって、上のコードは次のように修正できる。
user_input = input('input some number: ')
int_value = int(user_input)
result = int_value * 2
print(result)
このコードを実行すると、次のようになる。今度も「100」を入力してみよう。
今度は文字列が数値に変換され、2倍した結果が表示されるようになった。ただし、数字以外の文字をユーザーが入力した場合には、エラーとなる(興味のある人は試してみよう)。エラーを避けるには文字列が「数字のみで構成されているか」を調べる必要がある。それを行う手段もあるが、これについては次回に取り上げることにする。
今度は、計算結果を「X * 2 = ……」のようなメッセージと共に表示してみる。まずはダメな例からだ。
user_input = input('input some number: ')
int_value = int(user_input)
result = int_value + ' * 2 = ' + int_value * 2
print(result)
これを実行した例を以下に示す。
このプログラムの3行目では、文字列と整数値を「+」演算子を使って結合しようとしているが、乗算のときとは異なり、今度は「整数値と文字列を被演算子とする+演算子はない」というエラーが発生している。基本的には、文字列と数値を1つの式に含めることはできないということだ(乗算がOKだったのは、そういう操作をPythonが用意してくれていたからだ)。というわけで、今度は数値を文字列に変換する必要がある。これにはstr関数を使える。使い方はint関数と同様で、「文字列にしたいもの」をstr関数に渡すだけだ。
user_input = input('input some number: ')
int_value = int(user_input)
result = str(int_value) + ' * 2 = ' + str(int_value * 2)
print(result)
実行例を以下に示す。
ちなみに、先ほど見た「f文字列」を使ってもよい。これはコードだけをご覧いただこう。
user_input = input('input some number: ')
int_value = int(user_input)
result = f'{int_value} * 2 = {int_value * 2}'
print(result)
最終的な出力を作成するのにはf文字列を使えば簡単だが、そうではなくプログラムのさまざまな部分で文字列を数値、数値を文字列に変換しないとならない場面はよくあるので、両方の方法を覚えておくのがよいだろう。
今回はPythonの文字列の基本を説明した。以下に今回の内容をまとめておこう。次回は、文字列から一部を取り出したり、文字列の内容を変更し(て新たな文字列を作成し)たりする方法を紹介する。なお、文字列とよく似た「バイト列」もあるが、これに関しては回をあらめて紹介することにしよう。
「Python入門」
Copyright© Digital Advantage Corp. All Rights Reserved.