文字列のフォーマット
Pythonのようなスクリプト言語では、定型の文章の中に一部だけ任意の文字列を差し込む処理を多く実行します。
年賀状を印刷する時にメッセージの中の名前だけ変えて印刷するようなことがありますが、差し込み処理とはそのような処理を
指します。Pythonでは、差し込み処理を手軽に行うためにformat()メソッドが用意されています。
format()メソッドでは、波括弧( { } )で囲んだ文字列を使って、テンプレートのなかに文字列を差し込む位置を指定します。
{0}や{1.attr_a}のようなフォーマット文字列にオブジェクトを渡すと、波括弧で囲まれた部分に文字列を差し込んだ状態の文字列を返します。
format()メソッドを使うと、Webアプリケーションフレームワークなどで利用するテンプレートエンジンに近い
高度な文字列フォーマット機能を利用できます。
なお、Python2で使っていた%演算子を使う文字列フォーマット機能は、いずれ廃止されると予告されている機能です。
Python3.5までのバージョンではまだ利用できますが、先々のことを考えると、特別な理由がない限りformat()メソッドを使うようにしたほうが良いです。
*フォーマットに要素を埋め込む*
Jupyter Notebookを使って、format()メソッドを使った例が下記です。
format()メソッドなので、文字列のリテラルや変数から呼び出します。
【フォーマットに文字列を差し込む】
“{}” loves Python !”.format(‘Hatamoto’)
↓
Hatamoto loves Prthon !
ダブルクォーテーションで囲まれた部分が、テンプレート文字列になります。
波括弧で囲まれた部分に、format()メソッドに引数として与えた文字列を挿入して結果を返します。
波括弧の置き換え部分は、複数記述できます。
format()メソッドとリスト、for文を組み合わせて、Python関連サイトのリンクを作成する例が下記です。
【複数同時に差し込む】
linkstr = ‘{}’
for i in [ ‘http://python.org’,
‘http://pypy.org’,
‘http://cython.org’,]:
print(linkstr.format(i i.replace(‘http://’, ‘’)))
↓
python.org
pypy.org’
cython.org
最初の要素にはURLを、次の要素には「http://」を取り除いた文字列を指定しています。
このように、定型の文字列を簡単に作ることができるのがformat()メソッドの魅力です。
*引数の順番を指定した置換*
{0}のように波括弧の中に数値を入れると、format()メソッドに与えた引数を数値に応じた位置に埋め込むことができます。
番号は引数の順番で、0から始めます。フォーマット文字列に、同じ番号を複数記述すると、それぞれの場所に埋め込みが行われます。
同じ要素を複数埋め込むこともできます。波括弧内の数値の最大値が、format()メソッドに与えた引数より多い場合はエラーになります。
【数値で差し込み位置を指定する】
“{0} {1} {0}”.format(’Spam’, ‘Ham’)
↓
Spam Ham Spam
*キーワード引数を指定した置換*
{foo}のように波括弧の中に英数を書き込むと、format()メソッドに渡したキーワード引数をベースに置換を行います。
【キーで差し込み位置を指定する】
“{food1} {food2} {food1}”.format(food1 = ’Spam’, food2 = ‘Ham’)
↓
Spam Ham Spam
*ディクショナリを指定した置換*
{0[foo]}のようにすると、引数として渡したディクショナリのキーを指定した置換を行えます。
角括弧([ ])の中に指定するディクショナリのキーには、クォーテーションは必要ありません。
角括弧の中身が文字列として解釈され、ディクショナリのキーに割り当てられた値を取り出して置換を行います。
【ディクショナリで差し込み位置を指定する】
d = {‘name’ : ‘Hatamoto’, ‘birthyear’ :1995}
“{0[birthyear]} is {0[name]}’s birthyear.”,format(d)
↓
1995 is Hatamoto’s birthyear.