Pythonの文字列では、format()メソッドという便利なメソッドを使うことができます。これと同じ操作は、以前はprintf形式といって、%を使う記法が使われていました。
しかし、現在では、主に、
- 表記がシンプルで覚えるのが楽
- 処理速度が早い
- 間違いを防ぐことができる
という強力なメリットがあるので、format()メソッドを使うのが主流です。そのため、これからプログラミングを学ぶ方は、printf形式は無理に覚える必要はありません。
ここで解説するformat()メソッドをしっかりと抑えておきましょう。
1. format()メソッドとは
format()メソッドは文字列型オブジェクトに対して使うことができる文字列メソッドです(参考『Pythonの型とは 』『Pythonのオブジェクトとは』)。
基本の書式は次の通りです。
#format()メソッドの基本書式
文字列.format(*args **kwargs)
返り値は文字列型です。
念のため、「*args」と「**kwargs」について解説しておきます。これは初心者の時は無理に理解しようとする必要はありませんし、厳密に理解していなくてもコードは書けてしまいます。最初は「こういう理屈があるんだな」程度の理解で十分です。
さて、*argsは「可変長の引数」といって、メソッドに渡す引数の個数が決められていないものです。つまり、format()メソッドは引数を何個でも渡すことができるメソッドだということです。*args と書くのは慣例です。多くのプログラマは *args と書くので、それに倣った方が良いでしょう。
**kwargも同じく「可変長の引数」です。違いは、*argsは引数をタプル型として受け取るのに対して、**kwargは引数を辞書型として受け取るという点です。これらについては、3章のformat()メソッドの引数にリストやタプル、辞書を渡す時に軽く出てきます。
それでは実際の使い方を見ていきましょう。
2. format()メソッドを使った文字列操作
2.1. format()メソッドである文字列に任意の文字列を埋め込む
それでは、実際の使い方を見ていきましょう。まずは、もっとも基本的な使い方である「文字列変数へ別の文字列を埋め込む」方法です。
以下をご覧ください。
#format()メソッドの基本的な使い方
text_a = "チューリップには{}と{}と{}があります。"
print(text_a.format("赤", "青", "黄"))
まず、変数 “text_a” には、「チューリップには{}と{}と{}があります。」という文字列を代入しています。 {} を「置換フィールド」といいます。format() メソッドは、この置換フィールドに任意の文字列を埋め込むことができます。
この例では、「text_a.format(“赤”, “青”, “黄”)」と書いていますね。これは文字列オブジェクトの”text_a”の置換フィールドの中に埋め込む文字をformat()メソッドで指定していることを示します。formart()メソッドにカンマ区切りで渡した引数が、順番に埋め込まれていますね。
なお、メソッドに渡す引数は文字列ではなく文字列変数でも同様です。
#format()メソッドに入れる引数は変数でも構いません。
text_a = "チューリップには{}と{}と{}があります。"
word_a = "赤"
word_b = "青"
word_c = "黄"
print(text_a.format(word_a, word_b, word_c))
メソッドの実行結果を、次のように別の変数に代入することもできます。
#format()メソッドに入れる引数は変数でも構いません。
text_a = "チューリップには{}と{}と{}があります。"
word_a = "赤"
word_b = "青"
word_c = "黄"
text_b = text_a.format(word_a, word_b, word_c)
print(text_b)
2.2. format()メソッドである文字列に任意の数値を埋め込む
「Pythonの数値を文字列に変換する方法」で解説しているように、通常、文字列と数値を連結するとタイプエラーというエラーが起きます。
text = "文字列"
num = 1
text + num
タイプエラーとは、オブジェクトの型が原因で発生するエラーのことです(参考『Pythonの型とは 』)。
これを、format()メソッドを使うことで解決することができます。次のコードをご覧ください。
#format()メソッドを使うと文字列の中に数値を埋め込むことができます。
name = "山田"
age = 30
point = 100.25
text = "{}選手、年齢{}才の得点は{}点でした。"
result = text.format(name, age, point)
print(result)
文字列の任意の箇所に、別の任意の文字列や数値を埋め込むことができていますね。これは便利な使い方なので、ぜひ覚えておきましょう。
2.3. 置換フィールドに引数番号を指定して埋め込む
format()メソッドでは、置換フィールドに、引数番号を設定して、埋め込む文字列や数値をその番号で指定することができます。
次のコードをご覧ください。
name = "山田"
age = 30
point = 100.25
text = "得点:{2}、名前:{0}、年齢:{1}才"
result = text.format(name, age, point)
print(result)
format()メソッドの引数には、(name, age, point)の順番で渡していますが、出力結果を見てみると(point, name, age)の順に埋め込まれていますね。これはnameは引数番号0、ageは引数番号1、pointは引数番号2が設定されているからです。
なお、引数番号は1からではなく0から始まりますので覚えておきましょう。
2.4. 置換フィールドにキーワード引数を指定して埋め込む
同じように、置換フィールド{}の中にあらかじめ埋め込みたい変数(キーワード引数)を指定しておくこともできます。
text = "{name}選手、年齢{age}才の得点は{point}点でした。"
result = text.format(name="山田", age=30, point=100.25)
print(result)
これも便利な方法なので覚えておきましょう。
重要:f文字列
なお、Python 3.6 以降は、「f文字列」という方法が追加されました。これは、format()メソッドと比べて、
- さらに簡潔なコードを書くことができる。
- さらに処理速度が速い。
というメリットがあります。次のように使います。
name = "山田"
age = 30
point = 100.25
text = f"{name}選手、年齢{age}才の得点は{point}点でした。"
print(text)
これについては『Pythonで文字列を連結/結合する方法まとめ』で詳しく解説しているので、ぜひご覧ください。
2.5. 引数番号とキーワード引数を組み合わせる
引数番号とキーワード引数は、次のように組み合わせて使うこともできます。
text = "{}選手、年齢{}才の得点は{point}点でした。"
result = text.format("山田", 30, point=100.25)
print(result)
3. format()メソッドの引数にリストやタプル、辞書を渡す
次に、format()メソッドの引数にリストやタプル、辞書を渡す方法を見ていきましょう。
3.1. format()メソッドの引数にリストを渡す
format()メソッドの引数にリストを渡すには、次のように書きます。リストを引数に渡すときに、前にアスタリスク * を一つつけることがポイントです。
なおリストに関しては『初心者のためのPythonのリストの作成方法まとめ』をご確認ください。
#format()メソッドの引数にリストを渡すこともできます。
list = ["山田", 30, 100.25]
text = "{}選手、年齢{}才の得点は{}点でした。"
print(text.format(*list))
このように、リストのインデックス順に埋め込まれていきます。
次のように、インデックス番号を指定することで、リストから任意の値を埋め込むこともできます。この場合は、format()メソッドの引数に渡す時にアスタリスク * をつける必要はありません。
#インデックス番号で渡す値を指定することもできます。。
list = ["山田", 30, 100.25]
text = "年齢{0[1]}才の{0[0]}選手の得点は{0[2]}点でした。"
print(text.format(list))
置換フィールドに{0[1]}、{0[0]}、{0[2]}と入れています。まず[]の中の数字は該当するリストの要素のインデックス番号です。インデックス番号については『Pythonのリストのスライスと分割の方法まとめ』で詳しく解説していますのでご覧ください。[]の左側の数字は、format()メソッドの何番目の引数かを表します。引数番号もインデックス番号と同じく0から数えます。
下図をご覧いただくとイメージしやすいと思います。
参考に次のコードも見てみましょう。
#インデックス番号で渡す値を指定することもできます。。
list_a = ["山田", 30, 100.25]
list_b = ["遠藤", 35, 98.75]
text = "年齢{0[1]}才の{0[0]}選手の得点は{0[2]}点でした。\n\
年齢{1[1]}才の{1[0]}選手の得点は{1[2]}点でした。"
print(text.format(list_a, list_b))
text.format(list_a, list_b)と入れています。format()メソッドに渡したlist_aの引数番号は0で、list_bの引数番号は1です。置換フィールド{}の中にまず引数番号を指定して、それに対応する要素をスライスしています。
下図のようになっています。
なお、リスト内の同じ要素を繰り返し呼び出して埋め込むこともできます。
#同じ要素を繰り返し使うこともできます。
list = ["山田", 30, 100.25, "遠藤"]
text = "{0[0]}選手、年齢{0[1]}才の得点は{0[2]}点でした。\n\
同じく{0[3]}選手、年齢{0[1]}才の得点も{0[2]}点でした。"
print(text.format(list))
3.2. format()メソッドの引数にタプルを渡す
タプルの要素を埋め込む時も、リストの時と全く同じです。タプルから要素を順番に取り出すには、format()メソッドの引数にタプルを渡す時にアスタリスク * をつけます。
タプルに関しては『初心者のためのPythonのタプルの基本操作とポイントまとめ』をご確認ください。
#引数にタプルを渡すこともできます。
tuple = ("山田", 30, 100.25)
text = "{}選手、年齢{}才の得点は{}点でした。"
print(text.format(*tuple))
引数番号とインデックス番号を指定して、任意の箇所に任意の要素を埋め込むときには、アスタリスク * は不要です。
#使い方はリストと同じです。
tuple = ("山田", 30, 100.25)
text = "年齢{0[1]}才の{0[0]}選手の得点は{0[2]}点でした。"
print(text.format(tuple))
3.3. format()メソッドの引数に辞書を渡す
辞書の要素を埋め込むには、次のように書きます。
なお辞書については『初心者のためのPythonの辞書の基本と作成方法まとめ』をご確認ください。
#辞書から埋め込むには、引数に渡すときに**をつけます。
dict = {"name" : "山田", "age" : 30, "score" : 100.25}
text = "{name}選手、年齢{age}才の得点は{score}点でした。"
print(text.format(**dict))
このように辞書から値を埋め込む時は、置換フィールド{}の中に対応する値のキーを入力します。また、format()メソッドに辞書を渡す時は、前にアスタリスクを二つ ** と、つける必要があります。
次のように書くと、複数の辞書から値を取ってくることができます。考え方は、リストやタプルの時と同じです。置換フィールドの中に、辞書の引数番号を書いておきます。この場合は、引数に渡す辞書に**をつける必要はありません。
#文字列やリスト、タプルと同じように複数の辞書から値を取ってくることができます。
dict_1 = {'key1': 'マック', 'key2':'ウインドウズ', 'key3':100}
dict_2 = {1:'iPhone', 2:'iPad', 3:'デスクトップPC', 4:'ノートPC'}
dict_3 = {'type1':'パソコン', 'type2':'ウォッチ', 'type3':'okGoogle'}
print("{0[type1]}は{1[key2]}と{1[key1]}のどちらが好きですか?".format(dict_3, dict_1))
4. formatメソッドを使った数値操作
ここからはformatメソッドを使った数値操作について解説します。なお、位取りを含めた、数値や小数点の桁数の操作については、特に『Pythonのprintで桁数(数値や小数点以下など)を指定して出力する方法』でより詳しく解説していますので、併せてご確認頂ければと思います。
4.1. 数値を3桁ずつ位取りする
置換フィールドにコロン : とカンマ , を書いて{:,}としておくと、そこに数値を埋め込んだ時に3桁ずつ位取りして出力します。
#3桁ずつの数値の位取り
print("{:,}".format(1234567))
文字列に埋め込むには次のように書きます。
#文字列に埋め込む時は次のように書きます。
text = "東京の人口は{:,}人です。"
print(text.format(3000000))
引数に変数(キーワード引数)を渡すこともできます。
#引数が変数でも同様です。
text = "東京の人口は{:,}人です。"
num = 3000000
print(text.format(num))
4.2. 数値の小数点以下の桁数を指定する
数値を出力する時に、小数点以下の桁数を指定したい場合は、置換フィールドの中にコロン : とピリオド . と桁fを続けて{:.5f}というように書きます。例えば、小数点以下2位までなら{:.2f}、小数点以下3位までなら{:.3f}と書きます。
なお、”f”は「浮動小数点数(floating point numbers)」の”f”です。数値については『初心者のためのPythonの数値計算の基礎知識』でも詳しく解説しているので、是非目を通してみてください。
それでは、次のコードをご覧ください。円周率を小数点以下2位までに桁指定しました。
# 小数点以下2桁にする。
print("{:.2f}".format(3.141592))
なお、桁指定したら、数値は丸められます。
#なお桁指定した時は丸められます。
print("{:.1f}".format(3.141592))
print("{:.3f}".format(3.141592))
print("{:.4f}".format(3.141592))
「丸め」とは、四捨五入ではないので、注意が必要です。
例えば、1.4 という数字があるとします。1.4 と 1 の差は 0.4 です。1.4 と 2 の差は 0.6 です。つまり、1.4 は、1 により近い数字なので丸めると 1 になります。しかし、1.5 の場合は、2 に対しても 1 に対しても、同じ 0.5 の違いです。こうした場合、「丸め」では偶数側に数値を加工します。
参考に以下をご覧ください。
print("{:.1f}".format(1.55)) #偶数側に丸めます。
print("{:.1f}".format(1.65)) #偶数側に丸めます。
『Pythonの数値の桁数や丸めなどの操作のまとめ』でも解説しているように、数値を丸める関数にround()関数というものがあります。小数点指定した場合も、丸めはこれと同じなので、参考に目を通してみてください。
また、実際以上の小数点を桁指定すると、0が表示されます。
# 固定小数点5桁
print("{:.5f}".format(12.34))
もちろん、次のように文字列に埋め込むことができます。
#文字列の中に埋め込んでみます。
text = "円周率は{:.2f}です。小学校では{:.0f}で計算します。"
pi = 3.141592
print(text.format(pi, pi))
4.3. 数値の表示幅と寄せを指定する
出力する数値の表示幅を指定したい場合は、置換フィールドにコロン : と幅を指定する数字を入れて{:10}というように書きます。
#文字幅を指定するには置換フィールドに{:○}と書く
print("{:5}".format(5)) #半角5文字幅
print("{:10}".format(5)) #半角10文字幅
print("{:20}".format(5)) #半角20文字幅
文字列に埋め込んで見ると違いが分かりやすいです。
#文字列に埋め込むと違いが分かりやすいです。
text_a = "山田選手の得点は{:10}点です" #半角10文字幅
text_b = "山田選手の得点は{:20}点です" #半角20文字幅
print(text_a.format(100.25))
print(text_b.format(100.25))
なお、次のように書くと、空白スペースを0詰めすることができます。
#次のように書くと0詰めができます。
print("{:05}".format(5)) #半角5文字幅
print("{:010}".format(5)) #半角10文字幅
print("{:020}".format(5)) #半角20文字幅
数値の寄せの指定は次のように行います。>で右寄せ、<で左寄せ、^で中央寄せです。
#数値を左、中央、右寄せで表示する。
print("{:>10}".format(5)) #右寄せ
print("{:<10}".format(5)) #左寄せ
print("{:^10}".format(5)) #中央寄せ
これも文字列に埋め込んで違いを見てみましょう。
#文字列に埋め込むと違いが分かりやすいです。
text_c = "山田選手の得点は{:>20}点です" #右寄せ
text_d = "山田選手の得点は{:<20}点です" #左寄せ
text_e = "山田選手の得点は{:^20}点です" #中央寄せ
print(text_c.format(100.25))
print(text_d.format(100.25))
print(text_e.format(100.25))
なお、幅寄せの時は詰め文字を指定することもできます。
#幅寄せの時は詰め文字を指定することもできます。
text_f = "山田選手の得点は{:+>20}点です" #詰め文字に+を指定
text_g = "山田選手の得点は{:-<20}点です" #詰め文字に-を指定
text_h = "山田選手の得点は{:*^20}点です" #詰め文字に*を指定
print(text_f.format(100.25))
print(text_g.format(100.25))
print(text_h.format(100.25))
4.4. 位取り、小数点指定、幅指定、寄せ指定を同時に行う
位取りと桁数指定を同時に行うには、置換フィールドに続けて、{:,.○f}と書きます。
#位取りと小数点の桁数指定は{:,.○f}で同時に行うことができます。
print("{:,.2f}".format(1234567.891))
#文字列に埋め込んでみましょう。
text = "山田選手の総合ポイントは{:,.1f}です。"
point = 1525.46812
print(text.format(point))
全てを組み合わせることもできます。
#位取り、小数点以下の桁指定、幅指定、位置揃えの組み合わせ
text_j = "山田選手の総合ポイントは{:-^30,.3f}です。"
point = 1525.46812
print(text_j.format(point))
組み合わせる時は、まずコロン:を先頭に書いて、詰め文字指定、寄せ指定、幅指定、位取り指定、小数点以下の桁数指定の順番に書くということを覚えておきましょう。
4.5. 進数変換を行う
format()メソッドを使うと、数値の進数変換を行うこともできます。置換フィールドのコロンの後に、10進数なら {:d}、2進数なら {:b}、8進数なら {:o}、16進数なら {:x} と書きます。
print("{:d}".format(10)) #10進数は"d"
print("{:b}".format(10)) #2進数は"b"
print("{:o}".format(10)) #8進数は"o"
print("{:x}".format(10)) #16進数は"x"
文字列に埋め込んでみましょう。
text = "10の10進数は{:d}、2進数は{:b}、8進数は{:o}、16進数は{:x}です。"
print(text.format(10, 10, 10, 10))
簡単ですね。
4.6. %に変換して出力する
置換フィールドで、コロン : の後に%をつけると、小数を自動的にパーセンテージに変換して出力してくれます。その際に、ピリオド . と数値を入れると、パーセンテージ表記時の小数点の桁数を指定することができます。
print('{:%}'.format(0.12345))
print('{:.2%}'.format(0.12345)) #小数点以下の桁数を指定できます。
文字列に埋め込んでみましょう。
text = '{}選手の勝率は{:.2%}です。'
name = '山田'
num = 0.875875
print(text.format(name, num))
5. formatメソッドよりもさらに良い書きかた
文中でも少しだけ触れましたが、Python3.6からformatメソッドよりも、
- さらに簡潔なコードになる。
- さらに負荷が少ない。
という観点から、さらに良い「f文字列」という書きかたが追加されました。このページで、formatメソッドで行った出力は全て行うことができます。以下に並べておきますので、確認しておきましょう。formatメソッドを学習した後なら理解は簡単です。
#f文字列のもっとも基本的な使い方
a = '赤'
b = '青'
c = '黄'
text = f'チューリップには{a}と{b}と{c}があります。'
print(text)
#formatメソッド同様、数値を埋め込んでもエラーになりません。
name = '太郎くん'
age = 5
text = f'{name}の年齢は{age}才です。'
print(text)
#リストは次のようにスライスで要素を埋め込みます。
list = ['山田', 30, 100.25]
text = f'{list[0]}、年齢{list[1]}才の得点は{list[2]}です'
print(text)
#タプルもリストと同じです。
tuple = ('山田', 30, 100.25)
text = f'{tuple[0]}、年齢{tuple[1]}才の得点は{tuple[2]}です'
print(text)
#辞書の要素も埋め込むことができます。
dict = {'name' : '山田', 'age' : 30, 'score' : 100.25}
text = f"{dict['name']}、年齢{dict['age']}才の得点は{dict['score']}です"
print(text)
#数値の位取り
num = 1234567
text = f'{num}を位取りすると{num:,}です。'
print(text)
#桁指定
pi = 3.141592
text = f'円周率は{pi}よりもっと長いですが、計算では{pi:.2f}を使います。'
print(text)
#幅指定と位置指定
score = 98.75
text = f'山田選手の得点は{score:^10}点です。'
print(text)
#%表示
num = 0.87575
text = f'山田選手の勝率は{num:.2%}です。'
print(text)
コメント