f文字列とpprintによるフォーマット指定

目的

print関数で文字列中に変数の値を出力するときにf文字列を用いた.f文字列ではフォーマット(書式)を指定することができる.ここでは,f文字列によるフォーマット指定について学ぶ.また,リストや辞書のような複数の要素からなるデータを整形して出力する際に使用されるpprintモジュールの使い方を学ぶ.

説明

f文字列

f文字列の基本的な使い方

print関数で文字列中に変数の値を出力したい場合,f文字列を使用すればよかった.f文字列とは文字列の前にfをつけたもので,f文字列中に中括弧で囲んで変数名を記述すると,その部分に値が表示される.また,中括弧の中には演算子を記述することができ,演算結果を表示することができた.

このように,f文字列中では中括弧は特別な意味を持つ.f文字列中で中括弧を表示したい場合は中括弧を二重にして使用すれば良い.例えば以下のように記述すると,

中括弧を二重にして使用した箇所に中括弧が表示されていることがわかる.

左寄せ・中央寄せ・右寄せ

f文字列では,変数の値の横方向の配置(左寄せ・中央寄せ・右寄せ)を指定できる.指定の仕方は,変数名の後に「:」を,その後に左寄せの場合は「<」中央寄せの場合は「^」右寄せの場合は「>」を,その後に表示領域の長さを記述すればよい.例えば,以下のように記述すると,

16文字分の表示領域に文字列データを左寄せ・中央寄せ・右寄せで表示できる.

以上のように,表示領域は半角スペースで埋められるが,コロンの後に文字を指定すれば,指定した文字で表示領域が埋められる.例えば,以下のように,アンダースコア「_」を指定すると,

表示領域にアンダースコアが表示される.

これらは文字列データ以外の数値データに対しても使用できる.例えば,以下のように記述すると,

整数や浮動小数点数に対しても水平方向の配置を指定できる.また,6行目や12行目のようにコロンの後に表示領域の長さだけを指定することができ,この場合は右寄せで表示される.

ゼロ埋め(zero padding)

数値データに対しては,コロンの後に「0」を,その後に表示領域の長さを指定すると,表示領域の長さに応じて数値の先頭が0で埋められる.例えば,以下のように記述すると,

表示領域の長さ4や8に応じて数値の先頭が0で埋められていることがわかる.

有効桁数の指定(小数点以下の桁数で指定)

浮動小数点数のデータに対しては,小数点以下の桁数を指定して概数近似したものを表示したいことがある.そのような場合,コロンの後に「.」を,その後に小数点以下の桁数を,その後に「f」を指定すればよい.例えば円周率πを概数で表示するには,以下のように記述すればよい.

この例では,mathモジュールの変数piを使用して円周率を表示している.5行目のように記述すると,小数点以下15桁まで表示されていることがわかる.6行目から8行目のように記述すると,指定した小数点以下の桁数で近似された結果が表示されていることがわかる.

また,数値データは右寄せで表示することが多いため,以下のように表示領域の長さの指定と組み合わせて使用することが多い.

この例では,8文字分の表示領域に円周率を右寄せで表示している.(5行目の結果を見てわかるように,元のデータが指定した表示領域の長さより長い場合には,指定した長さを越えて表示される.)

有効桁数の指定(全体の桁数で指定)

浮動小数点数データに対して,有効桁数を指定して概数近似したものを表示したいことがある.そのような場合,コロンの後に「.」を,その後に有効桁数を,その後に「g」を指定すればよい.

6行目から8行目のように記述すると,指定した有効桁数で近似された円周率が表示されていることがわかる.また,11行目から13行目のように,表示領域の長さの指定と組み合わせると,右寄せで結果が表示できることがわかる.

指数表示

桁が大きい数値を表示する際には指数を使用して表示したいことがある.例えば,世界人口を表示する例は以下のようになる.

3行目のように表示すると,桁が大きすぎるため7億なのか76億なのか把握するのに時間がかかる.4行目のように,コロンの後に「e」を記述すると,数値を指数形式で表示することができる.結果の「e+09」から10の9乗であることがわかる.10の9乗は10億の桁となるので,76億であることが確認できる.また,5行目のように,有効桁数も同時に指定することができ,小数点以下2桁までで表示すると,約76億1千万人であることが確認できる.さらに,6行目のように,表示領域の長さと組み合わせて指定すると,右寄せで数値を表示することができる.7行目のように,指数表示は「E」と記述しても指定できる.その場合は結果の表記も「E+09」と大文字になる.

また,指数表示するように指定しなくても,指数として結果が表示されることがある.

3行目のように小さい数を表示すると,指数として結果が表示されることがわかる.また,6行目のように大きい数を有効桁数を指定して表示した場合も結果が指数として表示されることがわかる.

パーセント表示

比率や割合をパーセントで表示したいときには,以下のように記述すればよい.

比率3分の2をパーセント表示したいときには,4行目のように,コロンの後に「%」を記述すればよい.また,5行目のように,有効桁数も同時に指定することができ,小数点以下2桁までで表示すると66.7%であることがわかる.6行目のように,表示領域の長さの指定と組み合わせることもできる.

2進・8進・16進数表示

コンピュータ内の情報は2進数で表現されているため,数値データを2進数や8進数や16進数で表現したいことがある.例えば,画像中の1つの画素の値が127であり,その2進・8進・16進数表現を知りたい場合には,以下のように記述すればよい.

4行目から6行目のように,数値データを2進数に変換したいときはコロンの後に「b」を,8進数に変換したいときは「o」を,16進数に変換したいときは「x」を指定すればよい.また,7行目のように「X」を指定すると16進数が大文字で表示される.

上のように数値を表示すると,例えば8進表現の177は10進数のように見えてしまう.そのようなことを避けるために,数値の先頭に2進数では「0b」を,8進数では「0o」を,16進数では「0x」をつけることがある.そのような表現で表示したい場合には,以下のように記述すればよい.

4行目から6行目のように,コロンの後に「#」を付け加えればよい.

桁区切り

金額や大きな数値に対しては,3桁ごとにカンマで区切って表示したいことがある.そのような場合には,数値データに対し,コロンの後にカンマ「,」を指定すればよい.例えば,以下のように記述すると,

金額のデータを3桁ごとにカンマで区切って表示することができる.

また,2進表現では桁が大きくなることが多いため,コロンの後にアンダースコア「_」を指定すると,4桁ごとにアンダースコアで区切って表示することができる.

5行目のように記述すると,2進数が4桁ごとにアンダースコアで区切られて表示される.また,8桁でゼロ埋めして表示したい場合には,6行目のように指定すればよい.先頭に「0b」を表示したい場合には,7行目のように記述すればよい.

数値から文字列への変換

これまでf文字列はprint関数とセットで使用したため,データを整形して表示するためのもののように見える.f文字列は単に文字列を生成しているだけであるので,数値データを文字列データに変換する目的で使用されることもある.例えば260名いる3年生の学籍番号からなるリストを生成したいときには,以下のように記述すればよい.

学籍番号のルールとして,260名で連番であるとすると「1」から始まり「260」までとなる.連番の番号の前に学部・学科・入学年度を表す接頭辞がつき,それが「1B1020」だとする.また,連番の番号は4桁でゼロ埋めして揃えるものとする.そのようなルールの学籍番号を作るには,4行目のように学生数分だけ繰り返し,5行目のようにf文字列で指定すればよい.3行目で学籍番号のリストを初期化し,6行目でリストに生成した学籍番号を追加している.7行目で作成した学籍番号リストを表示すると,以下のように,260名分の学籍番号が生成されていることが確認できる.

pprint関数

これまではprint関数を使用してデータを表示してきた.ここでは,pprintモジュールのpprint関数を使用したデータの表示方法を説明する.

辞書のリストの表示

pprintモジュールのpprint関数は,リストや辞書のような複数の要素からなるデータを表示するときによく使用される.例えば,以下のような,氏名とテストの点数からなる辞書の人数分のリストをprint関数とpprint関数でそれぞれ表示すると,

以下のようになる.print関数で表示した場合は1行で表示されているのに対し,pprint関数で表示した場合は,リストの要素ごとに改行されて表示されており,見やすくなっていることがわかる.

表示領域の幅の指定

では,先程の辞書データに理科の点数を追加したものに対してpprint関数を使用してみよう.

10行目のように表示すると,辞書データが5行に分かれて表示され,見づらくなっていることがわかる.これは,デフォルトで設定されている表示領域の幅をデータが越えてしまったために生じている.11行目のようにキーワード引数widthで表示領域の幅を100文字に指定すれば,辞書データが1行に収まって表示されていることが確認できる.また,12行目のように300文字と指定すると,1行に全て表示されてしまい,見づらくなっていることがわかる.

表示するデータの深さの指定

次に,以下のように,辞書の辞書のリストのような3層構造のデータをpprint関数で表示してみよう.

10行目のように表示すると,3層構造のデータが全て表示されていることがわかる.一方11行目のようにキーワード引数depthで表示する深さを2に設定すると,一番深い階層の試験の点数の辞書データが「…」と表示され,表示が省略されていることがわかる.

インデントの指定

先程と同じ3層構造のデータをpprint関数で表示してみよう.

10行目のように表示すると,1階層目と2階層目のインデント(改行時の字下げ幅)が1文字分となっていることがわかる.11行目のように,キーワード引数indentを4に設定すると,インデントが4文字分となることがわかる.

要素数の多いリストの表示

先程の例では,辞書の辞書のリストといった3層構造のデータをpprint関数で表示した.次に,構造は単純なリストであるが,要素が多いリストをprint関数とpprint関数で表示してみよう.

30名分の学籍番号のリストを生成し,10行目のようにprint関数で表示すると,1行で表示されてしまう.また,11行目のようにpprint関数で表示すると,30行で表示されてしまう.そこで,12行目のように,pprint関数のキーワード引数compactにTrueを設定すると,表示領域の幅でうまく改行され,見やすく表示されていることがわかる.

課題

課題0

自己紹介文を左寄せ・中央寄せ・右寄せで表示せよ.

課題1

100円,1000円,10000円を桁を揃えて表示せよ.

課題2

100個のデータを処理している最中に,「001/100」「002/100」…と表示させることがある.繰り返しを使用して,このように表示させよ.

課題3

半径4の円の円周の長さを求め,小数点以下1桁までで表示せよ.

課題4

半径6371kmの円の円周の長さを求め,有効数字3桁で表示せよ.

課題5

貯金が1年に2倍になるとする.最初1円だった貯金が30年後にいくらになるか求め,概数で表示せよ.

課題6

ある大学の入学試験を115,922人が受験した.そのうち22,533人が合格した.合格した割合を小数点以下1桁までのパーセントで表示せよ.

課題7

自分の学籍番号の下3桁を2進数で表示せよ.

課題8

色を6桁の16進数で表現することがある.HTMLで名前が定義されている色lightskyblueのRGB値がR:135 G:206 B:250であるとき,この色の16進数表現を表示せよ.

課題9

学籍番号のリストを作り,表示せよ.