リファクタリングをPythonで実践!基本手法とコード例・注意点まで
- 1.Pythonのformatメソッドとは?
- 2.formatメソッドの基本的なルール
- 3.Pythonのformatメソッドを使ってみよう
- 4.f文字列を使ってみよう(Python 3.6以上)
- 5.Pythonでformatメソッドを使う際の注意点とコツ
1.Pythonのformatメソッドとは?
Python(「パイソン」と読みます)のformatメソッドとは、簡単に言えば、「(主に文字列の)書式を整えてくれるメソッド」です。何が役立つの?と思われるかもしれませんが、様々な場面で威力を発揮します。
例えば、数値に3桁ごとに「,」を入れたいとき。人間がやれば簡単ですが、実はコンピュータにやらせるのはそれなりに大変なのです。でも、Pythonのformatメソッドなら、簡単にできます。
この記事では、formatメソッド、そしてf文字列について解説していきます。
①formatメソッドでできることや利用シーン
formatメソッドは、文字列に限らずさまざまなもので使えるのですが、最初のうちは文字列の場合だけを覚えるといいでしょう。実際に多用するのは文字列の場合です。
できることとしては
・数値の整形(3桁ごとに区切る、0を数値の頭に付け足す、小数点以下の桁数を指定するなど)
・一つの文を書くだけで、場合に応じてさまざまな文字列が獲得できる(獲得した文字列の出力先は画面だったり、ファイルだったり様々です)
などです。
デバッグでのprint文の出力や、出力する文字列の形式が仕様で決まっている場合などに使います。
②format関数との違い
このformat関数との違いというのは大変難しい概念です。厳密にいえば、format関数というものは存在しません。
Pythonにおいて、関数とメソッドの違いは以下です。
関数:単独で呼び出せる
メソッド:クラス内で定義された関数。なので、クラスオブジェクトの次に「.」をつけて呼び出す
例えば、
は単独で呼び出せるので関数です。
formatは単独では呼び出せません。必ず何かのクラスオブジェクトのインスタンスに追記して呼び出します。formatはそのインスタンスに対して作動します。
そうなのです、文字列も「クラスオブジェクト」なのです。
しかしこの点を追求するとなかなか深い問題になりますので、とりあえず最初のうちは
「文字列の後ろに.を付けて呼び出すのだな」と覚えていただいて構いません。
しかし、開発が進んできて、他のクラスにformatを追加するようなことになると、この点をしっかり理解していないとつまずきますので、そのときにまた学習してくださいね。
2.formatメソッドの基本的なルール
それでは、formatメソッドの基本的なルールについて解説します。
①置換フィールドへの引数の設定方法
難しい言葉が出てきましたね。置換フィールドとはなんでしょうか?
サンプルを挙げます。なおこの記事では、サンプルは全てPythonの対話シェルで行っているとします。
>>> a = 0
>>> print('aは{}'.format(a))
aは0
いかがでしょうか?つまり、「{}」のところにformatのあとに書いた変数の値が代入されるのです。formatメソッドはこのように、文字列の後に「.format」をつけて使います。
このサンプルではaを代入して定義していますが、プログラムの途中で、aの値がその時々で変わるプログラムなら、
print('aは{}'.format(a))
という一文を挟んでおけば、aの値がprintされます。
例えば、
print('JSONの先頭の文字列:{}'.format(a))
などというように。
これが置換フィールドです。
置換フィールドについて、もう少し見ていきましょう。
>>> a = 0
>>> b = 1
>>> print('aは{}, bは{}'.format(a, b))
aは0, bは1
「{}」が出てきた順に、formatの中に書いた変数が代入されます。
しかしこれだとどの変数の値がどこに出力されるか分かりません。この点を解消するには2つの書き方があります。
1つ目は
>>> a = 0
>>> b = 1
>>> print('aは{0}, bは{1}'.format(a, b))
aは0, bは1
とインデックスを指定する書き方です(インデックスはゼロから始まります)、
2つ目は
>>> a = 0
>>> b = 1
>>> print('aは{v1}, bは{v2}'.format(v1=a, v2=b))
aは0, bは1
と一時的な代入用の変数を使って値を受け渡す書き方です。インデックスや代入用の変数を使うと、同じ変数の値を複数回出力できます。
>>> a = 3
>>> print('{0},{0},{0}'.format(a))
3,3,3
また、formatの「()」の中はPythonの文なので、Pythonでできる計算はできます。
>>> a = 3
>>> print('{0},{1},{2}'.format(a, a+1, a+2))
3,4,5
といった具合です。
②書式指定文字列の使い方
「書式指定文字列」も、例を見た方が分かりやすいです。
>>> a = 1234567890
>>> print('{:11}'.format(a))
1234567890
このサンプルでは「11桁で表示しろ」と指定しています。
置換フィールドは「{}」ですが、その置換フィールドの中に、さまざまな「書式」を設定できるのです。
方法としては「:」を書き、その後に書式を書きます。
単に数値を書くと、「桁数」になります。
この桁数の書き方は基本です。次に様々な書式を紹介しますが、だいたいの書式は桁数も合わせて指定できますので、まずは桁数の指定の仕方をしっかりと覚えましょう。
3.Pythonのformatメソッドを使ってみよう
それでは、書式の指定の仕方を見ていきます。
①文字の表示位置(左、右、中央)を指定する
これは次の文字で指定します。
<:左寄せ
^:中央寄せ
>:右寄せ
この表示位置の指定は、桁数と一緒に指定しないと意味がないです。そのまま表示したら、そのままの桁数で出てくるだけですから。
具体的な例としては
>>> a = 1234567890
>>> print('{:<20}'.format(a))
1234567890
>>> print('{:^20}'.format(a))
1234567890
>>> print('{:>20}'.format(a))
1234567890
表示位置が指定した通りにずれていますね。
桁数の指定は、このようにだいたいの場合は他の指定の後に書く、という決まりがあります。覚えておいてください。
②0(ゼロ)を埋める
数値の上位に0を付けて、全体を定められた長さにすることを「ゼロ埋め」と言います。
このゼロ埋めの書式指定文字列は
0
です。
>>> a = 1234567890
>>> print('{:020}'.format(a))
00000000001234567890
この書式指定文字列は、
020
となっていますが、最初の「0」が「ゼロ埋めしろ」という書式、次の「20」が「20桁で」という書式です。
少しわかりにくいですが、混同しないようにしてください。
③符号を指定する
さて、普通にformatを指定すると
>>> a = 3
>>> print('{}'.format(a))
3
>>> b = -3
>>> print('{}'.format(b))
-3
プラスのときは符号が表示されません。
プラスの時も符号を表示するには、
+
を使います。
>>> a = 3
>>> print('{:+}'.format(a))
+3
この「+」も、桁数も指定できます。
>>> a = 3
>>> print('{:+3}'.format(a))
+3
④桁区切りを指定する
3桁ごとに区切って表示するには
,
を使います。
ただし、この「,」は桁数の指定ができないので注意してください。
>>> a = 1234567890
>>> print('{:,}'.format(a))
1,234,567,890
⑤2進数、8進数、16進数の変換
ある数値を2進数、8進数、16進数で表示する書式指定文字列は
b:2進数表記
o:8進数表記
x:16進数表記(a~fは小文字)
X:16進数表記(A~Fは大文字)
です。
xとXはアルファベットの表示が違うので、区別してください。
>>> a = 127
>>> print('{:b}'.format(a))
1111111
>>> print('{:o}'.format(a))
177
>>> print('{:x}'.format(a))
7f
>>> print('{:X}'.format(a))
7F
この2進数、8進数、16進数のときには桁数は指定できません。
⑥小数点以下の桁数を指定する
小数点以下の桁数を指定するのは
.数値f
です。
.3f
などです。
>>> a = 100.1
>>> print('{:.3f}'.format(a))
100.100
⑦有効桁数を指定する
有効桁数を指定するのは
.数値g
です。
.3g
などです。
>>> a = 12345.67890
>>> print('{:.6g}'.format(a))
12345.7
>>> print('{:.15g}'.format(a))
12345.6789
また有効桁数は科学の概念なので、指数表記になることもあります。
>>> a = 0.000012345
>>> print('{:.3g}'.format(a))
1.23e-05
>>> print('{:.15g}'.format(a))
1.2345e-05
1.23e-05
は
1.23 × 10(-5乗)
という意味です。この指数表記はプログラミングではよく登場するので覚えておいてください。
⑧浮動小数点の指数表記
それではその指数表記を常にさせるにはどうすればいいのでしょうか。
それには
.数値e
.数値E
を使います。数値は小数点以下の桁数です。
ただ
e
E
と書くと決まった有効桁数で表示されます。あまり使いません(科学的に、あまり意味がないので使う用途がないです)。
>>> a = 3
>>> print('{:.3e}'.format(a))
3.000e+00
>>> print('{:e}'.format(a))
3.000000e+00
⑨パーセント表示を指定する
最後にパーセント表示の方法尾を確認しましょう。
パーセント表示は
%
を使います。
>>> a = 0.6
>>> print('{:%}'.format(a))
60.000000%
小数点以下の桁数や、ゼロ埋めと一緒に使うこともできます。「%」は最後に書いてください。
>>> print('{:.1%}'.format(a))
60.0%
>>> print('{:010.1%}'.format(a))
0000060.0%
4.f文字列を使ってみよう(Python 3.6以上)
f文字列とは、formatメソッドを更に簡単にしたもので、Python 3.6で導入されました。
formatは文字列の後ろに「.format」と書いて代入する変数を書きますが、f文字列では「{}」の中に書きます。
>>> a = 3
>>> print(f'{a}')
3
このように、文字列の前に「f」を書くだけでf文字列になります。
formatでできることは全てf文字列でもできるので、複数の変数の参照や、書式指定文字列も使えます。
>>> a = 3
>>> b = 5
>>> print(f'a={a},b={b}')
a=3,b=5
>>> print(f'{a:05}')
00003
>>> print(f'{a:.3f}')
3.000
5.Pythonでformatメソッドを使う際の注意点とコツ
formatメソッドは便利ですが、書式指定文字列が少しややこしいです。この記事で紹介しきれなかった書式指定文字列もありますし、またこの記事でも、難しいところはあえて説明していません。
formatメソッドは便利ですが、書式指定文字列が少しややこしいです。この記事で紹介しきれなかった書式指定文字列もありますし、またこの記事でも、難しいところはあえて説明していません。
書式指定文字列の厄介なところは、エラーになっても、Pythonのエラーではないので、書式指定文字列内のエラーの箇所が特定できないところです。なので、コーディングする際は細心の注意をもってコーディングしてください。
それさえ気を付ければ、format文字列は便利です。どんどん使っていきましょう。