【Python学習帳】031_制御構造まで学んで一休み
初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf
をCC-BY-NC-NDライセンスに従って引用します。
第5章の制御構造の勉強をしてきました。
5.9 数値を表示する際のフォーマット指定
まで学び、f文字列も自習しました。
制御構の勉強の締めくくりは、下記のような課題でした。
演習 5-17 力試し
inputcheck.py, p5-6.py を組み合わせて以下の条件を満たす平方根を求めるプログラム作成しなさい.
以下の項目に一度に取り組むのではなく,これまでに学んだどの節が関係するかを整理し,1項目づつプログラムを改修しては動作を確認するようにしてください.
- 絶対値の計算には abs() 関数を用いること.
- 平方根を求める数を繰り返し端末から入力できるようにすること.
- 平方根を求める数の入力が数値に変換できない場合は,その旨を示して,次の入力を求めること.
- 平方根を求める数が 0 以下の場合は,その旨を示して,次の入力を求めること.
できれば以下にも挑戦すること
- 端末からの入力が “end” という文字列なら終了すること.
- 計算精度を絶対精度ではなく,相対精度で 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章を終えました。ここでしばしお暇いただきます。