KNIMEST’s diary

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

もしもPythonが書けたなら

もしも Pythonが書けたなら

思いのすべてをCodeにして

きみに伝えることだろう

 

もしも KNIMEが書けたなら

workflowをHubにあげて

きみに共有するだろう

 

だけどぼくにはスキルがない

きみに聞かせるネタもない


心はいつでも半開き

伝える言葉が残される

ああ~ ああ ああ~ ああ
ああ~ 残される

引用元:

西田敏行 もしもピアノが弾けたなら 歌詞 - 歌ネット

 

旧めの名曲の替え歌で失礼いたします。はてなブログでも替え歌はアウトかな…

www.jasrac.or.jp

 

半年強Pythonの基礎について勉強したのですが、後輩がサクッとPythonでのプログラミング実装を仕上げてくるのを見て一旦挫けておりました。
自分の仕事はほぼKNIMEでできてしまうし、社内外にPythonが書ける人は多くて、困ったら依頼した方が質の高いシステムが組めます。
過去に数回勉強しては途中でやめ、結局独力での実装はできていないです。その上後輩には「Python書けない詐欺」と煽られる始末…

 

でも、諦めたくはない。
また、これまでKNIMEで作ってきたシステムも、Pythonへリプレースすべきと考えるものもいくつかあります。
参考:

https://www.slideshare.net/KNIMEST/20231111knimestpdf

Pythonへの換装を進めることが、実際に役に立つプログラミング知識の体得と活用につながると信じて再び勉強を始めます。


もう一回、もう一回

僕はこの手を伸ばしたい

Mr.Children HANABI 歌詞 - 歌ネット

【Python学習帳】031_制御構造まで学んで一休み

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

hdl.handle.net

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

第5章の制御構造の勉強をしてきました。

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

まで学び、f文字列も自習しました。

knimest.hatenablog.com

 

制御構の勉強の締めくくりは、下記のような課題でした。

演習 5-17 力試し

inputcheck.py, p5-6.py を組み合わせて以下の条件を満たす平方根を求めるプログラム作成しなさい.

以下の項目に一度に取り組むのではなく,これまでに学んだどの節が関係するかを整理し,1項目づつプログラムを改修しては動作を確認するようにしてください.

  1. 絶対値の計算には abs() 関数を用いること.
  2. 平方根を求める数を繰り返し端末から入力できるようにすること.
  3. 平方根を求める数の入力が数値に変換できない場合は,その旨を示して,次の入力を求めること.
  4. 平方根を求める数が 0 以下の場合は,その旨を示して,次の入力を求めること.

 

できれば以下にも挑戦すること

 

  1. 端末からの入力が “end” という文字列なら終了すること.
  2. 計算精度を絶対精度ではなく,相対精度で 10-6 とすること.

 

これについて大きな数や小さな数(例えば 10の10乗 や 10の-10乗)の平方根を求め,結果を確認すること.

これ、大学の講義で課題になるんでしょうね。私の拙いコードを公開してミスリードするなど迷惑になってもいけないので、結果だけ報告して終わりにします。

1-4まではすでに学習済のコードを組み入れるだけなのであまり苦労はしませんでした。ただ、前に自分の書いたコードを見ないでWhile文やIf文を書くとエラーを多発させてしまい、自分の身についていなさ加減にがっかりしました。

何も前のコードを見ないでp5-6.pyのカスタマイズは出来るようになりたいです。いや、ニュートン法の説明を復習するだけで何もないところから書けるべきか。

5も同様にinputされたxの内容による分岐処理なので書けました。

相対精度の定義をどうプログラムに書けばいいかは一人では正しく書けなかったようで、BingChatのお世話になりました。

実行結果は以下の通りでした。

あと、余談ですが、データチェック部分に

    elif x == float('inf') or x != x:

        print(f"{x}は平方根を算出できない値です")

        continue

    elif x == 1:

        print("1.0")

        continue

と例外処理を加えてみました。

Inf(無限大)とかNaN(非数)を入れたら警告が出るようにとか、入力が1だと何も出力されなかったので何らかの出力が出るようにしました。でも良く考えると相対誤差で制御しているのだから1の近傍で他にも何も出力されない値の範囲がありますね。

こんなときこそMathモジュールの出番なのか。計算プログラムを作る時はよくよく考えないといけないなぁと改めて思いました。

 

これで第5章を終えました。ここでしばしお暇いただきます。

【Python学習帳】030_f文字列

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

hdl.handle.net

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

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

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

まで学びました。

knimest.hatenablog.com

そして

gammasoft.jp

を読んで

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

とあったのでf文字列を体験しようとしています。

BingChatにひとまず教材にf文字列に関しての記述があるかを聞いてみたところ、

PDF全てを検索して記載がなかったのか、例を自作して説明を始めてくれました。

f文字列とは、Python 3.6以降で導入された、文字列の中に変数や式を埋め込むことができる機能です。例えば、次のように書くと、変数nameとageの値が文字列に反映されます。

name = "Alice"
age = 20
message = f"Hello, {name}. You are {age} years old."
print(message)

 

出力:
Hello, Alice. You are 20 years old.

 

f文字列は、文字列の先頭にfを付けることで使えます。また、{}の中には任意のPython式を書くことができます。例えば、次のように書くと、計算結果が文字列に反映されます。

a = 10
b = 5
message = f"{a} + {b} = {a + b}"
print(message)

出力:
10 + 5 = 15

f文字列は、文字列のフォーマットや結合を簡単に行うことができる便利な機能です。詳しくは、Pythonの公式ドキュメントやオンラインマニュアルを参照してください。

今回は下記の記事を引用させていただきつつ学習を進めます。

gammasoft.jp

f文字列(f-string)はフォーマット済み文字列リテラル( formatted string literal )ともいうようです。

f文字列とは、クウォートで囲んだ文字列の前にfまたはFを付けたもので、その中に波かっこで囲まれた変数名や式があると実行時に置換してくれます。

f文字列の追加により、format()メソッドを使わないでも、文字列の中に書式を指定して数値などの値を埋め込めるようになりました。{0}や{1}のようにインデックス番号ではなく、変数名で直接指定できるので、直感的で可読性も良くなります。

前回のコードを元にformat()メソッドからf文字列への変換をしてみます。

print(f"光速は{c:12.8g} m/s, アボガドロ数は {na:12.8g} mol**(-1) です")
と{  }の中に表示したい引数とその表示形式を書き込むので直観的にわかりやすいというのは頷けます。

 

併せて読むと良さそうな記事も紹介しておきます。

qiita.com

こちらだと特定の文字のエスケープのさせ方についての例が豊富でした。

f-stringsの文字列中で、{}の括弧の記号をそのまま出力した場合にバックスラッシュでのエスケープは利きません。試してみるとエラーになります。」
「もし{}の括弧をエスケープしたい場合には{}の括弧を二重({{}}といったように)書くとエスケープすることができます。

なるほどと思って、上述のf文字列表記を一部{}でエスケープさせて

光速は{2.9979246e+08} m/s, アボガドロ数は 6.0221408e+23 mol**(-1) です
と出力させようと思ったのですが
以下の通り失敗しました。恥ずかしいけども正直に記録してみました。

 

print(f"光速は{{c:12.8g}} m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

 

出力は

光速は{c:12.8g} m/s, アボガドロ数は 6.0221408e+23 mol**(-1) ですこの場合、{{ と }} を使用して、{ と } をエスケープしています。ただし、この方法では値が表示されず、書式指定子そのものが表示されます。

次の私の大間違いも記録します。

 

print(f"光速は{{}{c:12.8g}{}} m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

 

文法エラー

SyntaxError: f-string: single '}' is not allowed

 

正直お作法が全くわかってませんでした。

そこでBingChatに相談したら

 

f-string の中で、} を表示するには、}} と書く必要があります。} は f-string の中で特別な意味を持つため、そのままでは表示することができません。代わりに、}} と書くことで、} をエスケープして表示することができます。

ただし、上記のコードでは、{{} のように {} の前に { があるため、エラーが発生しています。この場合、Python は {} をエスケープされた { と解釈し、その後の } が単独で存在すると判断してエラーを発生させます。

上記のコードを修正するには、次のように書くことができます。

 

print(f"光速は{{{c:12.8g}}} m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

 

これで

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

と目的の表示にできました。
{{は{
}}は}
エスケープされるんですね。

十二分に寄り道していますがもう少し。

光速は”2.9979246e+08” m/s, アボガドロ数は 6.0221408e+23 mol**(-1) です
表示させたい場合は

print(f"光速は{"{c:12.8g}}" m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

じゃないですよ。一般的なエスケープ文字「\」を使って

print(f"光速は\"{c:12.8g}\" m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

 

では本題に戻るとしましょう。次は第5章の総括の力試しです。

knimest.hatenablog.com

【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文字列を体験してみようと思います。

【Python学習帳】028_Mathモジュールと精度

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

hdl.handle.net

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

第5章の制御構造の勉強をしてきました。
前回から

5.7 Python での数学関数

を学んでいます。

knimest.hatenablog.com

3.7系の日本語ドキュメントも読んでみました。

docs.python.org

math.pi

利用可能なだけの精度の数学定数 π = 3.141592... (円周率)。

と精度についての注釈が付いています。精度に関しては教材でも何度か話題に取り上げています。
精度はプログラミングで数値データを扱う処理で本来は念頭に置いておかないといけない注意点だと思います。

knimest.hatenablog.com

今回はMathモジュールなど関数利用に関してBingChatと質疑をいくつかしましたので紹介しておきます。

Q1.

math.fsum(iterable): iterable 中の値の浮動小数点数の正確な和を返します。

とありますが、

sum(iterable)

と異なるということでしょうか?

A1. はい、math.fsum(iterable) と sum(iterable) は異なります。sum(iterable) は組み込み関数で、イテラブルオブジェクトの要素を左から右へ足し合わせて総和を返します。しかし、浮動小数点数の計算には誤差が生じることがあります。例えば、10個の浮動小数点数0.1をリストにして、すべての要素を足すと、0.9999999999999999となり、1.0に届きません1。

 

math.fsum(iterable) はMathモジュールの関数で、イテラブルオブジェクト中の値の浮動小数点数の正確な和を返します。複数の部分和を追跡することで精度のロスを防ぎます。上と同じ計算を math.fsum(iterable) を使って実行すると、1.0となります。

 

このように、高い精度を求める場合は、math.fsum(iterable) 関数を使う方がよいでしょう。

この件は京都大学の無料Python教材「プログラミング演習 Python 2021」では

http://hdl.handle.net/2433/265459

Version2021_10_08_02.pdf

のコラム編で詳しく説明してくれています。

 

1.2 2進数で浮動小数点数を扱うことの嫌な点

高速な計算を実現するために,コンピュータ内部では基数を 10 とする 10 進数で

はなく,2 とする 2 進数が広く用いられています.整数を扱う際には 10 進数も 2 進数も本質的な違いはありませんが,小数では差異が出てしまいます.

10 進数の小数では 1/3 は 0.33333… となり有限の桁数では表せません,これは

十進数の小数が各桁の大きさ 1/10, 1/100, 1/1000 … のそれぞれ 0 ~9 倍の和として表そうとするためです.小学校で習ったときには違和感を持たれた方も少なくな

いと思いますが,もう慣れましたよね.

2 進数の小数では 1/2, 1/4, 1/8, 1/16 …が各桁の大きさとなり,その 0 倍か 1 倍の和で数値を表します.このため,10 進数を使う我々がしばしば用いる 0.1 が2

進数では正確に表せません.小学校の時の違和感がコンピュータのおかげで私たち

が日常的に用いる 10 進数の扱いで生じるのです.

実際,Python で 0.1 を 3 回加えたものが 0.3 と等しいかどうかを評価する以下

の式について試してみると

0.1 + 0.1 + 0.1 == 0.3

その値は False となってしまいます.

科学や技術の計算では,十分な精度さえあればよい場合がほとんどで 0.1 が厳密

な値をとっていることはあまり問題になりません 1.しかしながら,お金を扱う会計

計算では,金額としてかなりの桁数を扱う一方で,金利が 0.01 (1%) など,10 進

数の小数で扱われることが多いです.このため,十進数の小数が正確に表せないこ

とは避ける必要がでてきます.会計にコンピュータを用いるためには,コンピュー

タ内部でも 10 進数の計算をすることが求められます.Python では正確な 10 進数

で演算する decimal というモジュールが用意されています.

参考文献として紹介されている

docs.python.org

に、冒頭紹介した「利用可能なだけの精度」の具体的な例も示されていますのでご興味あれば。


以下は余談ですが、私が下記のようなアホな質問をしても、Chatはきちんと教えてくれます。

Q2. math.fabs(x): x の絶対値を返します。

との回答ですが、

math.abs(x)

では動作しないのですか?

A2. math.abs(x) ではなく、abs(x) と書くと動作します。
abs(x) は組み込み関数で、Mathモジュールには含まれていません。
abs(x) は引数の型に応じて整数や浮動小数点数複素数の絶対値を返します。math.fabs(x) はMathモジュールの関数で、引数が整数や浮動小数点数でなく複素数だとTypeErrorを送出します。math.fabs(x) は常に浮動小数点数の絶対値を返します。

 

ちなみに絶対値の算出方法も各種ありなかなかに奥が深いようでして、下記の記事のように掘り下げて解説して下さっている方もいました。

python.atelierkobato.com

今回もひとさまの知恵に頼りっきりの学習となりました。

次回は関数でのデータ変換に進みます。

knimest.hatenablog.com

【Python学習帳】027_Python の数学関数Mathモジュール

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

hdl.handle.net

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

第5章の制御構造の勉強をしてきました。

knimest.hatenablog.com

今回は

5.7 Python での数学関数

を学びます。

 

これまでの例では誤差 diff の絶対値を「負の場合は符号を反転する」という方法 で

if diff < 0:

    diff = -diff

と明示的に計算していました.Python では絶対値関数 abs() が利用可能ですの で,上の計算は1行で

diff = abs(diff)v

と書けます。さらに

ライブラリ(モジュール) math

も使ってみるようにと課題が出ていました。

少し詳しく調べたくなって、BingChatと下記の通り問答しました。

 

Q1. PythonのMathモジュール について初心者向けに教えてください。

 

A1. PythonのMathモジュールは、数学関数へのアクセスを提供するモジュールです1。Mathモジュールを使うには、まず import math という文を書いてモジュールをインポートします。その後、 math.関数名(引数) という形式でモジュール内の関数を呼び出すことができます。

Mathモジュールには、次のような関数があります1

  • ceil(x): x の「天井」( x 以上の最小の整数) を返します。
  • comb(n, k): n 個の中からk 個を重複無く順序をつけずに選ぶ方法の数を返します。
  • copysign(x, y): x の大きさ(絶対値) でy と同じ符号の浮動小数点数を返します。
  • fabs(x): x の絶対値を返します。
  • factorial(n): n の階乗を整数で返します。
  • floor(x): x の「床」( x 以下の最大の整数) を返します。
  • fmod(x, y): プラットフォームのC ライブラリで定義されているfmod (x, y) を返します。
  • frexp(x): x の仮数と指数を(m, e) のペアとして返します。
  • fsum(iterable): iterable 中の値の浮動小数点数の正確な和を返します。
  • gcd(*integers): 指定された整数引数の最大公約数を返します。
  • isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0): 値a とb が互いに近い場合 True を、そうでない場合は False を返します。

Mathモジュールについてもっと詳しく知りたい場合は、公式ドキュメント参考サイトをご覧ください。Pythonの標準ライブラリには、Mathモジュール以外にも多くの便利なモジュールがあります2。ぜひチェックしてみてください😊

Ref. 1: math --- 数学関数 — Python 3.11.4 ドキュメント

Ref. 2: https://docs.python.org/ja/3/library/index.html

 

絵文字まで使って回答してくれるのか、BingChat。

余談ですが実は私の環境だと、PythonのバージョンがPython 3.7.1なので、上記の例のうち、math.comb(n, k)は使えなかったです。Ref. 1のドキュメントを見ると「バージョン 3.8 で追加.」と明記してありました。世に公開されている情報と自分の使っている環境とのバージョンの違いってしばしば悩みの種になります。Chatに質問する時にうまく質問しないといけないのかもしれません。

 

今回は3.7系の日本語ドキュメントを読んでみました。

docs.python.org

上記の例だと私が一生使わないかもしれない関数も結構紹介されていたのですが、他の関数として指数関数や対数関数、三角関数などむしろなじみのものや定数としてのπなどがあるとわかります。

math.pi

利用可能なだけの精度の数学定数 π = 3.141592... (円周率)。

math.e

利用可能なだけの精度の数学定数 e = 2.718281... (自然対数の底)。

タウの説明にはかなり力が入っていました。

math.tau

利用可能なだけの精度の数学定数 τ = 6.283185... です。 タウは 2π に等しい円定数で、円周と半径の比です。 タウについて学ぶには Vi Hart のビデオ Pi is (still) Wrong をチェックして、パイを二倍食べて Tau day を祝い始めましょう!

infとNaNという定数も定義されているのですね。

math.inf

浮動小数の正の無限大です。(負の無限大には -math.inf を使います。) float('inf') の出力と等価です。

math.nan

浮動小数の非数 "not a number" (NaN) です。float('nan') の出力と等価です。

Mathモジュールについてのドキュメントなどの紹介はここまでなのですが、「利用可能なだけの精度の」という注釈、普段は目にすることがあまりないので次回は精度についても教材など勉強してみます。

knimest.hatenablog.com

【Python学習帳】026_端末からの入力と誤入力

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

hdl.handle.net

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

第5章の制御構造の勉強中で、if 文の基礎まで学びました。

knimest.hatenablog.com

knimest.hatenablog.com

今回は

5.5端末からの入力

5.6エラーへの対処

を学びます。

これまで平方根を計算したい数値をプログラムに埋め込んで計算してきました. 端末から入力する方法を考えましょう.

input 関数の引数(() 内に書く文字列)は端末に表示する文字列です.また,返り値(呼び出し結果)のデータ型は文字列です.

ですから、input関数を使って数値を入力させたい場合は下記の点に注意しなくてはいけません。

数値データを得るにはこれを int() や float() で適した型に変換します.

先の平方根を求めるプログラムでは x の値を設定している箇所を

    x = input(“平方根を求める数 “)

    x = float(x)

 

と入れ替えるか,あるいは一括して

    x = float(input(“平方根を求める数 “))

と書きかえることで変数 x に端末から入力された数値を得ることができます

上記の通りaの方は”2.0”と入れても文字列データの扱いになっているので注意が必要です。一方でxは整数値の2を入れても2.0のfloat型データになりますね。

 

ユーザに手入力してもらったり、あるいはExcelファイルから読み込んだりってプログラム上よくある使い方なんですが、とにかくよくあるのが想定外の入力によるエラーです。

関数 float() や int() は引数として与えられた文字列が数値として解釈できない

場合 ValueError という種類のエラーを発生します.特にその場合の処理を指定し

ていなければ Python はそこで処理を中断します.

そこで不正な入力があったら分岐処理してプログラムを止めないようにしたいのですが、その目的で

プログラム内でエラーを処理するには try 文を使います.

教材に提示されたサンプルコード5-10.pyを少しだけ変えていろいろと使ってみました。

プログラムは継続的に入力を受け取りエラー処理を行い,正の数値の場合の み print(x) で値を出力します.

try 文では例外を生じるブロックを try 文の中に入れ,except 文で例外を指定して 処理するブロックを書きます.例外が指定されていない except 文は(その上で処理されるものを除いて)すべての例外に対して機能します.

この節の締めくくりの言葉には納得です。

外部から与えられる入力はプログラマーには統制できません.正しい入力だけを想定して書かれたプログラムは想定外の入力に正しく応答できず,場合によっては間違った結果を出してしまう恐れもあります.外部からの入力については「疑ってかかる」ことが重要で,値の妥当性を検査したり,生じえるエラーの処理を的確に行ったりすることが望まれます.

次回は基本的な数値データ処理機能をいくつか学習します。

knimest.hatenablog.com