python入門講座 | 変数を文字列にしてみよう(フォーマット指定子の使い方)[第17回]

アラサーOLのためのpython入門講座
フォーマット指定子を使うと文字数、桁数、小数点以下桁数、符号、ゼロ埋めなどを自在に指定できます!

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」です!この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!「パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

今日はフォーマット指定子を用いた変数や数値の文字列化について解説します!Pythonではint型やfloat型の変数をstr()で文字列に変換し、”+”(プラス)演算子で結合することができますが、数値の桁数や小数点以下の桁数、符号の有無、ゼロ埋めなど細かい指定をする場合にはフォーマット演算子を使います。出力を見やすくしたり、ファイル名を定義する場合に必要な方法です。この機会に覚えておきましょう!
ぜひ最後までお付き合いください!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • pythonの基本的な使い方を知りたい!
  • 独学で学んだpythonの知識を整理したい!

Abstract | フォーマット指定子で自由自在に変数を出力!

フォーマット指定子を使うと、str型、int型、float型といった様々な型の変数や数値を好きな形で文字列に変換できます。その結果を出力すれば見やすい形式で出力できますし、変数に格納することもできます。例えばファイル名を定義する場合には、文字数、数値の桁数や小数点以下の桁数、符号の有無など細かい指定をしたいことが多いです。このような場合にはフォーマット指定子を使うことで対応できます。

簡単なプログラミングをやっている分には前回記事で扱ったstr()と+演算子でどうにかなってしまいますが、本格的にプログラミングをやっていくとフォーマット指定子で出力したい場面に出くわします。この機会に頭の片隅に入れておきましょう!



Background | 文字列への変換とフォーマット指定子

フォーマット指定子を使うと、小数点以下の桁数やゼロ埋めなど、様々な型の変数を文字列に変換する際のフォーマット指定を行えます。前回の記事「python入門講座 | 文字列を連結してみよう(変数の型変換の応用)」では、str()を使ってint型やfloat型など文字列ではない型を文字列に変換して連結にする方法を扱いました。この方法では小数点以下の桁数など細かい指定はできませんでした。このような指定を行って文字列への変換をする場合にはフォーマット指定子を使います。

フォーマット指定子はもともとC言語のprintf系関数(printf(), fprintf(), sprintf(), scanf(), fscanf(), sscanf()など)で使われる、出力フォーマットと入力フォーマットを指定する表現です。C言語以外にもPythonやRなどのprint系関数、文字列への変換で使うことができます。

フォーマット指定子の種類

よく使われるフォーマット指定子には以下の種類があります。

# フォーマット指定子使い方
1%s文字列として出力する
2%d整数値として出力する
3%f浮動小数点として出力する
4%e指数表記で出力する
5%g有効桁数を指定して浮動小数点または指数表記で出力する
表1. 代表的なフォーマット指定子の種類

これら5つを基本として桁数の指定など細かい指定を行うことができます。以下で詳しく見ていきましょう。



Method | フォーマット指定子の使い方

フォーマット指定子の使い方を説明します。実際に手を動かしながら学んでいきましょう!Jupyter Notebookを立ち上げてコーディングしながら読み進めてください。

準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。いつものpython_practiceのディレクトリに「practice_format_operator」という名前のpython notebookを作成してください。ターミナルを立ち上げて~/python_practiceに移動、jupyter notebookを起動し、ブラウザから新規→Python3でpython notebookを開いて、ファイル→リネームでファイル名を決定します。
もしやり方がわからなければ、前回記事「python入門講座 | 変数を使いこなそう1(変数の定義方法と基本ルール)」や過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」で詳しく解説しているので、これらを見ながらやってみてください。

python notebookを起動したら、適宜Markdownセルに説明書きを加えながら下記の説明に沿ってコードを書いて実行していきましょう。Markdownセルやコードセルなどの用語やこれらの使い方は過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」を参照してください。練習問題の後にpython notebookの例を掲載します。もし書き方がわからなければそちらを見てください。



%s : 文字列として出力する

まずは変数を文字列として出力する「%s」です。

基本的な使い方 | ‘%s’ % (変数)

以下のようにして使います。実際にpython notebookでコーディングして実行してみましょう。

# test %s format operator
print('%s' % ('python'))

Pythonではこのように、「%s」をシングルクオーテーションまたはダブルクオーテーションで囲んで文字列として扱った上で、後ろに「% (変数)」と書きます。こうすることで変数の中身が「%s」の場所に出力されます。これは他の指定子%d, %fなどでも同様です。

変数を「%s」で出力

以下の例は、変数に文字列を格納した上でそれを「%s」で出力するものです。これも実行してみましょう。

# define a str variable
var_str = 'programing'

# print with %s
print('My hobby is %s.' % (var_str))

実行すると「My hobby is programming.」となります。「%s」のところにvar_strの中身が入ります。

複数の変数を複数の「%s」で出力

一つの文字列の中に複数のフォーマット指定子を入れることも可能です。その場合は文字列の後の「% (変数)」の変数のところにカンマで複数の変数を入れます。以下のようにします。

# define two variables
content1 = 'format'
content2 = 'operator'

# define name of this file
f_name = 'practice_%s_%s.ipynb' % (content1, content2)

# print the filename
print(f_name)

f_nameという変数にフォーマット指定子で作成した文字列を格納しています。「%s」を2つ使ったので、% ()の中の変数も2つである必要があります。この例のように、フォーマット指定子で構築した文字列を変数に格納することも可能です。実際にプログラミングではこのようにファイル名を決める場面でフォーマット指定子がよく使われます。計算で使った条件や数値に応じて出力ファイル名を決めたりするときに使われます。

「%s」は文字列(str型)以外にも使用可能

「%s」は文字列やstr型変数以外でも使用できます。出力したい変数がint型である場合を試してみましょう。以下を実行してみましょう。

# define a int variable
var_int = 1

# print with %s
print('int variable = %s' % (var_int))

「int variable = 1」と出力されます。float型の場合も同様です。以下を実行してみましょう。

# define a float variable
var_float = 3.14

# print with %s
print('float variable = %s' % (var_float))

「int variable = 3.14」と出力されます。str()で変換するのと同じ挙動をします。

基本的な使い方として以上です。結果をprint()で直接出力したり、新しいstr型変数に格納したりして使います。以下では細かい設定もやってみましょう。

最小文字数の指定

出力する際の最小文字数(桁数)を指定することができます。「%」と「s」の間に所望の桁数を書きます。以下のようにやります。実行してみましょう。

# print at least 10 digits
print('"%10s"' % ('abc'))

文字数がわかりやすいよう、シングルクオーテーションで囲った文字列の最初と最後にダブルクオーテーションを入れています。これを実行すると

"       abc"

と出力されます。デフォルトでは右詰めになっているので、先頭に7つのスペースが入ります。

これは最小文字数の指定なので、出力したい文字数がもっと多い場合にはその文字数分出力されます。以下を実行してみましょう。

# print at least 10 digits
print('"%10s"' % ('abcdefghijklmnopqrstuvwxyz'))

aからzまですべて出力されます。

最大文字数の指定

最大文字数の指定は「%」と「s」の間に「.5」のように小数点+数字を書くことで指定できます。以下を実行してみましょう。

# print at most 5 digits
print('"%.5s"' % ('abcdefghijklmn'))

abcdeの5文字が出力されます。

最大文字数と最小文字数を同時に指定することも可能です。例えばぴったり5文字出力したい場合は以下のようにします。

# print exactly 5 digits
print('"%5.5s"' % ('abc'))
print('"%5.5s"' % ('abcdefgh'))

実行すると

"  abc"
"abcde"

となります。1つ目はスペースが2つ入って5文字に、2つめはf以降が切り落とされて5文字で出力されます。

右詰め・左詰めの指定

右詰めや左詰めの指定を行うことができます。デフォルトでは右詰めになっています。左詰めにする場合は「%」の直後に「-」(マイナス)を付けます。以下を実行してみましょう。

# lefted 10 digits
print('"%-10s"' % ('abc'))

実行すると

"abc       "

と表示されます。先程の右詰めの例では「abc」の前にスペースが入っていましたが、今回は「abc」が左詰めされ、その後ろにスペースが入っています。



%d : 整数値として出力する

次に整数値として出力する「%d」の使い方です。

基本的な使い方

基本的な使い方は「%s」と同様です。以下を実行してみましょう。

# print with %d
print('%d' % (1))

1が出力されます。変数を出力する場合も同様です。以下を実行してみましょう。

# define a int variable
var_int = 2

# print with %d
print('%d' % (var_int))

2が出力されます。

文字列変数に格納することも可能です。複数のint型変数でやってみましょう。以下を実行してみましょう。

# define a int variable
version_1 = 3
version_2 = 2

# define filename for example with %d
f_name = 'tmp_name_v%d.%d' % (version_1, version_2)

print(f_name)

f_nameという変数に「tmp_name_v3.2」という文字列が格納され、最後にprint()で出力されます。

float型を整数値として出力することも可能(小数点以下切り捨て)

「%d」はfloat型変数に対して使うこともできます。以下を実行してみましょう。

# define a float variable
var_float = 3.92

# print with %d
print('float %s as int: %d' % (var_float, var_float))

実行すると

float 3.92 as int: 3

と出力されます。「%s」のところは「3.14」全体が表示され、「%d」のところはint型への変換int()が施された上で整数値として出力されます。int()は切り捨ての変換なのでこの場合は3となります。ちなみに後で説明する「%f」で小数点以下の桁数を指定すると四捨五入となります。

数値でない変数は出力できない(str型など)

str型や文字列など、数値ではない変数は「%d」で出力することはできません。以下を実行してみましょう。

# define a str variable
var_str = 'abc'

# print with %d
print('%d' % (var_str)) # error

結果は「TypeError: %d format: a number is required, not str」となるはずです。「%d」は数値しか受け付けません。

基本的な使い方は以上です。以下では詳細指定を解説します。

表示桁数の指定

表示桁数の指定は「%」と「d」の間に数値を書いて行います。以下のようにします。実行してみましょう。

# print at least 10 digits
print('"%10d"' % (123))

実行すると

"       123"

と左側にスペースが入って10桁で出力されます。ちなみに最大桁数の指定はできません。表示桁数を超える桁の数値は全桁出力されます。

# print at least 10 digits
print('"%10d"' % (1234567890123))

を実行すると「”1234567890123″」となります。

左詰指定

「%s」のときと同様「%」の後に「-」を入れると左詰指定となります。

# print at least 10 digits
print('"%-10d"' % (123))

これを実行すると

"123       "

と出力されます。

リーディングゼロ(ゼロ埋め)の指定

数値を桁数指定で出力する場合、上の桁にゼロを入れる(リーディングゼロ)ことがほとんどです。これは桁数指定の数字の前にゼロを書くことで指定します。以下を実行してみましょう。

# print 10 digits with zero
print('%010d' % (123))

「0000000123」と出力されます。

符号の出力

出力に必ず符号を付けたい場合には「%」と「d」の間に「+」を入れます。まずはデフォルトの挙動を確かめましょう。「%d」はデフォルトでは正の数は符号なし、負の数は-がついて出力されます。以下を実行してください。

# by default, a positive number has no sign
print('%d' % (123)) #123

# while a negative has sign
print('%d' % (-123)) #-123

2つ目だけに符号が付きます。

次に符号指定をして以下を実行してみましょう。

# print with sign
print('%+d' % (123)) #+123

今度は「+123」と正の数でも符号付きで出力されます。

桁数指定と組み合わせると以下のようになります。

# print with sign and reading zero
print('%+05d' % (123)) #+0123

結果は「+0123」となり、符号まで含めて5桁で出力されます。



%f : 浮動小数点として出力する

「%f」は数値を浮動小数点形式で出力する指定子です。

基本的な使い方

基本的な使い方は「%s」や「%f」と同じです。以下のように使います。やってみましょう。

# print with %f
print('%f' % (3.140000))

「3.140000」と出力されます。「%f」はデフォルトでは小数点以下6桁を出力するので、小数第三位以降はゼロ埋めされます。

変数を出力する例や結果を文字列に格納する例も以下のようにやってみましょう。

# define two variables
var1 = 3.14
var2 = 2.71

# get str variable
var_str = 'str_%f_%f' % (var1, var2)

# print
print(var_str)

「str_3.140000_2.710000」と出力されます。

「%f」はint型を出力することも可能です。以下を実行してみましょう。

# define a int variable
var_int = 2

# print with %f
print('%f' % (var_int))

「2.000000」と出力されます。

当然ながら数値以外の変数を出力することはできません。以下を試してみてください。

# define a str variable
var_str = 'abc'

# print with %f
print('%f' % (var_str)) #error

「TypeError: must be real number, not str」となります。

以下では詳細指定をやっていきます。

表示桁数の指定

「%f」の桁数指定は「%全桁数.小数点以下桁数f」のように行います。まずは小数点以下桁数だけ指定してみましょう。以下を実行してみましょう。

# print 3-digits fraction
print('%.3f' % (3.141592)) # 3.142

「%.3f」は小数点以下3桁表示の指定です。4桁目が四捨五入されるので3.142となります。「%.0f」なら整数値となります。以下を実行すると小数点第1位が四捨五入され、3が表示されます。

# print nearest integer
print('%.0f' % (2.7)) # 3

全桁数と小数点以下の桁数を同時に指定してみましょう。以下を実行してみましょう。

# print 10 digit in total with 3-digit fraction
print('"%10.3f"' % (3.141592))

「” 3.142″」となります。小数点まで含めて全部で10桁、小数点以下は3桁となります。

リーディングゼロ(ゼロ埋め)の指定

「%d」同様、リーディングゼロの指定ができます。以下のように実行すれば、全部で10桁、小数点以下3桁でリーディングゼロにできます。

# reading zero
print('%010.3f' % (3.141592))

「000003.142」と表示されます。

符号の出力

符号の出力も「%d」と同様です。以下を実行してみましょう。

# print with sign
print('%+010.3f' % (3.141592))

「+00003.142」となります。符号まで含めて全10桁で表示されます。



%e : 指数表記で出力する

「%e」を使うと、「3.1415e+01」といった指数表示で出力できます。桁数の大きな数値や小さな数値を表すのに便利です。

基本的な使い方

まずは基本的な使い方です。以下を実行してみましょう。

# print with %e
print('%e' % (1234567890123.1234567890123))

「1.234568e+12」と出力されます。これは\(1.234568 \times 10^{12}\)と同じ意味です。「e」の後ろの「+12」は指数部(exponent)と呼ばれ、10の12乗を表します。手前の「1.234568」は仮数部(fraction)と呼ばれ、指数部に掛け算する数値を表します。「%f」と同様、仮数部の小数点はデフォルトでは6桁です。基本的な使い方は「%f」と同じなので詳しくは省略します。

表示桁数の指定

表示桁数の指定は「%f」と同様に行うことができます。以下を実行して仮数部の小数点以下の桁数指定をしてみましょう。

# print 10-digit fraction
print('%.10e' % (1234567890123.1234567890123))

「1.2345678901e+12」と表示されます。

符号の出力

符号の出力の設定も「%f」と同様です。以下を実行して確認してみましょう。

# print with sign
print('%+e' % (1234567890123.1234567890123))

「+1.234568e+12」と表示されます。

リーディングゼロ(ゼロ埋め)の指定

指数表記では仮数部の整数部分は必ず一桁になります。なので全桁数の指定やリーディングゼロは通常は使いません。ただ、機能としては可能なので確かめておきましょう。これらも「%f」と一緒です。以下を実行してみましょう。

# print 15 digit with 3-digit fraction
print('"%15.3e"' % (1234567890123.1234567890123))

# print 15 digit with 3-digit fraction with reading zero
print('"%015.3e"' % (1234567890123.1234567890123))

# print 15 digit with 3-digit fraction with reading zero and sign
print('"%+015.3e"' % (1234567890123.1234567890123))

実行すると

"      1.235e+12"
"0000001.235e+12"
"+000001.235e+12"

となります。



%g : 有効桁数で出力する

「%g」は有効桁数まで出力する指定子です。数値の大きさ次第で浮動小数点形式となるか指数形式となるかが異なります。

基本的な使い方

基本的な使い方は「%f」や「%e」と同じです。以下を実行して確かめてみましょう。

# print with %g
print('%g' % (1234567890123.1234567890123))

# print with %g
print('%g' % (3.141592))

# print with %g
print('%g' % (12345.6789123))

実行すると

1.23457e+12
3.14159
12345.7

と出力されます。1つ目は数値が大きく浮動小数点表示すると文字数が多すぎるので指数表記で出力されます。残りの2つは浮動小数点表記です。「%g」はデフォルトでは有効桁数は6桁です。

変数の出力などの他の基本的な使い方についても「%f」や「%g」と同じなので説明は省きます。ご自分で色々試してみてください!

有効桁数の指定

有効桁数は「%.有効桁数g」のように指定します。以下を実行して確かめてみましょう。

# print 4 digits
print('%.4g' % (3.141592)) # 3.142

有効数字は4桁と指定しているので、最後の592の一番上の5が四捨五入されて4桁で表示されます。

ちなみに有効数字とは数学的には「意味のある数字」という意味ですが、「%g」においては「ゼロでない意味のある数字」となります。例えば「3.100」という数字は、数学的には小数第3位がゼロであることが保証されているので有効数字は4桁です。しかし「%g」においては「3.1」までが有効数字とみなされます。以下を実行してみてください。

# print 4 digits
print('%.4g' % (3.10000)) # 3.1

「3.1」と表示されます。小数第2位以下の0は意味がない数字とみなされて表示されません。

符号の出力

符号の出力も「%f」や「%e」と同様です。以下を実行して確かめましょう。

# with sign
print('%+.3g' % (3.141592))

「+3.14」と表示されます。

リーディングゼロの指定

リーディングゼロの指定も「%f」同様です。ただし値が大きいと「%e」と同様になるので注意してください。以下を実行して確認しましょう。

# with reading zero for a small number
print('%+010.3g' % (3.141592))

# for a large number
print('%+010.3g' % (12345678901.123456789))

実行すると

+000003.14
+01.23e+10

と表示されます。1つ目は浮動小数点形式で表示されるので符号や小数点を含めて全体で10桁でゼロ埋めされます。2つ目は値が大きいので指数形式となります。したがって、符号や指数部も含めて全体で10桁となり、仮数部がゼロ埋めされます。



Result | 練習問題

最後に練習問題をやってみましょう!以下の処理をするコードを書いてみてください。

  1. 変数piに3.14を代入してください
  2. 変数rに2を代入してください
  3. 変数circumに2 * pi * rの結果を代入してください
  4. 文字列circumferenceと変数pi, r, circumを結合し, 「circumference_<rの値>_<piの値>_<circumの値>」となるように変数circum_resultを定義してください。ただし、<rの値>、<piの値>、<circumの値>は全体で6桁ゼロ埋め、小数点以下3桁の浮動小数点形式で出力してください。符号は不要です。
  5. 変数circum_resultの内容を出力してください

練習問題の回答例

できたら回答例を確認しましょう!下の画面をスクロールすると回答例が見られます!
今回の記事で出てきた他のコードも載っているので参考にしてください!

練習問題おつかれさまでした!
今日はここまでです。Python Notebookを終了しておきましょう。もしPython Notebookを終了方法がわからなければ過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」の「Python Notebookの起動・終了方法」の章を参照してください!



Conclusion | まとめ

最後までご覧いただきありがとうございます!
フォーマット指定子を使って様々な型の変数を文字列化する方法を紹介しました!

文字列への変換や文字列としての結合はstr()と+演算子でも可能ですが、フォーマット指定子を使ったほうが桁数の指定などができて便利です。特にファイル名の定義など一定のルールに基づいて、桁数や小数点以下の桁数、符号の有無を指定する必要がある場合に使います。本格的なプログラミングをし始めると使う場面が出てくるので頭の片隅に置いておきましょう!

以上「python入門講座 | 変数を文字列にしてみよう(フォーマット指定子の使い方)」でした!
またお会いしましょう!Ciao!



References | 参考

参考教科書

以下の教科書を参考にして進めています!より詳しく学びたい方は購入して読んでみてください!

コメント

タイトルとURLをコピーしました