KNIMEST’s diary

KNIME使いがPythonも使いたくて勉強中

【Python学習帳】029_データ型やフォーマットの指定

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

第5章の制御構造の勉強をしています。

5.7 Python での数学関数

を学びました。

knimest.hatenablog.com

今回は

5.8 数値データ・文字列の変換,文字列の結合

を学びます。

input() 関数では文字列が得られ,これを数値データに変換するために int() や float() などの関数を使いました.他方,数値データを文字列に変換するには str() 関数や書式を指定する場合には次に述べる format() メソッドを使います,ここでこ れらを整理しておきましょう.

なお,print() 関数に数値データなど文字列以外のデータを渡したときには自動で文 字列に変換されます.

数値データを文字列と結合するには str() 関数でまず文字列に変換してから結合します.

BingChatに上記の実例入りで一覧表を作ってもらったので以下に。

使ってみます。

文字列の結合は単純に文字列どうしを「+」演算子でつなぎます.このほか, 「*」演算子は整数型の値と組み合わせて文字列を繰り返すことができます.

次に

5.9 数値を表示する際のフォーマット指定

を勉強したのですが、ここがおそろしく情報量が多くて、本当にごく一部しか学習できなかったです。

Python の print() 関数で数値を表示すると,与えられた数値に合った桁数などが 自動で選ばれます.表示する桁数をそろえるなど,利用者が表示する書式を指定す ることも可能です.

具体例が示されています。

c = 2.99792458E8

na = 6.02214076E23

form = '光速は{0:12.8g} m/s, アボガドロ数は {1:12.8g} mol**(-1) です' print(form.format(c, na))

実行結果は

光速は2.9979246e+08 m/s, アボガドロ数は 6.0221408e+23 mol**(-1) です

となります。

指数表記をあえて例に選んでいただけたのがとても勉強になりました。

 

{0:12.8g}

とはそれぞれ何を指定しているのかなかなか難しいです。左から順に

{0:12.8g}

の0は引数に置換したい値を指定しています。引数は左から順番にゼロから始まる番号(インデックス番号)に対応します。

 

form.format(c, na)

で言うならcが0番目で、naが1番目になっています。

 

{0:12.8g}

12は表示に用いる最小文字数なので

cを
2.9979246e+08
と示す時には13文字使って表示しており、12文字以上のため特に表示に影響が出ていません。

また、

{0:12.8g}

8gとはg形式で有効数字が8桁の数値表記になるよう指定しています。

ここが特に私にはわかりにくくてBingChatに質問しまくって得た結果としては以下の通りです。

「formatメソッドのg形式(General format)は、浮動小数点数を指数表記で表示する場合に、有効数字を考慮して表示する書式指定子です。」

Understanding the Python %g in string formatting, achieving Java String.format behavior - Stack Overflow

General format. For a given precision p >= 1, this rounds the number to p significant digits and then formats the result in either fixed-point format or in scientific notation, depending on its magnitude.

とあるのでBingChatに和訳してもらったら

一般形式。
与えられた精度p >= 1に対して、この形式は数値をp桁の有効数字に丸めてから、その大きさに応じて固定小数点形式または指数表記で結果を書式化します。

pを指定しないとデフォルトは有効数字6桁だそうです。

例えばなんですが{0:12.8g}を{1:20.3g}に変えたら先述の例がどうなるかを見ると

光速の値はアボガドロ数を引いてきてしまっているので間違っているうえに、左側に12個の空白が入り残り8文字で計20文字、有効数字3桁の指数表示となっています。

何やってるんだかとなるわけですが、あえて間違ってみると、それぞれの設定の仕組みの理解につながるなと思いました。

 

g形式

形式には
整数を 10 進数で表示する場合は'd',
浮動小数点数を指数表記で表すには 'e',
固定小数点表記で表すには 'f'が用いられます.

そして
e形式とf形式の両者を値によって切り替えるのが 'g' 形式です。

光速とかの様に有効数字を考慮しながら指数表記したくなる自然科学系の定数を扱うには頻繁に利用するでしょう。あえてg形式で具体例を示されたところに教材を作って下さった方々のご配慮を感じています。

 

更に教材には補足説明として

4 行目の form.format(c, na) は文字列 form を書式に変数 c と na を変換した文字列を生成することを意味します.

文字列変数(ここでは form)に付随するメソッド(関数のようなもの)format を呼び出して実施するのですが, メソッドは対象となる変数に「.」で続けて指定しています

とありました。

 

今回の学習内容のうち、formatだけがメソッドに分類されています。このメソッドは機能がとても多いです。興味があれば下記記事などご覧になってもいいのではないでしょうか。

http://Pythonの文字列フォーマット(formatメソッドの使い方) - ガンマソフト (gammasoft.jp)

上記の内容理解に四苦八苦した後見たからでしょうか、とてもわかりやすいなと感心しました。そんな中で一点気になる記述がありました。

今回はPython3ならばどのバージョンでも使えるformat()メソッドについて説明しますが、Python3.6以上に限定できるのであればf文字列の方が直感的で使いやすいです。

そこで次回はf文字列を体験してみようと思います。