- 基礎的なプログラミング力を確認する
- プログラミングを何らかしらの問題に対して適用してみる
- 随時調査しながら進められるようにする
DIVERのPython入門テキストで得たことを生かし、問題を解いていってください。新しいことも登場するので、調査しながら進めていくことになります。
紙を折り続けると厚さが増していき、43回で月に届くという話があります。しかし、実際には10回も折ることができません。また、手計算も大変です。
そこで今回の課題では 1枚の紙を43回折り曲げた時の厚さを計算するプログラム を作成します。
43回折った紙の厚さ
折る前の紙の厚さ
プログラミングでは同じ動作を様々な方法で記述することができます。今回は以下の2つを作成してください。
- べき乗の算術演算子を使用
- for文を使用
べき乗の算術演算子を使用したプログラムを作ってください。
雛形として紙を1回折った時の厚さを計算するコードを用意しました。これを43回折った時のコードに書き換えてください。
雛形
"""
紙を1回折った時の厚さを計算するコード
"""
THICKNESS = 0.00008
folded_thickness = THICKNESS*2
print("厚さ: {}メートル".format(folded_thickness))
単位がメートルだと実感が湧きづらいので、◯◯万キロメートル に変換して表示させてください。
サンプルとして ◯◯キロメートル に変換したコードを用意したので、参考にして取り組んでください。小数点以下は2桁まで表示されるようにも指定しています。
サンプルコード
# メートルをキロメートルに変換して小数点以下2桁で表示する
print("厚さ: {:.2f}キロメートル".format(folded_thickness/1000))
「月までの距離」を検索して、折った紙が月に届くかどうか確認してみましょう。
次に、for文を使用したプログラムを作ってください。
べき乗の算術演算子は使ってはいけません。算術演算子は四則演算(+
、-
、*
、/
)のみ使えます。
ヒント
べき乗は以下のように掛け算の繰り返しに置き換えることができます。
2つの方法はどちらが正しいわけでもありませんが、コードの良さを評価する際には以下のような着目点があります。
- 計算速度
- メモリの使用量
- 可読性
- 拡張性
- 再利用性
今回は計算速度を比較してみます。以下の雛形を使用して、2つの方法の計算時間を出力してください。そして、それぞれの計算時間の関係を簡単に説明してください。どちらの書き方が良さそうでしょうか。
雛形
import time
start = time.time()
#####
# ここに上で書いたコードを貼り付ける
#####
elapsed_time = time.time() - start
print("time : {}[s]".format(elapsed_time))
折り曲げた時の厚さを毎回記録しておき、それを折れ線グラフで可視化してみます。
数式を一般化し、n回折った紙の厚さ
これは指数関数です。指数関数は値が急激に増加する性質があります。厚さが急激に増えて月に到達する様子をグラフで見てみましょう。
ここまでは43回折った後の最後の値だけを使用していましたが、グラフで可視化するためには過程の値も必要です。for文を使用したコードに、過程の値合計44個を記録するコードを加えてください。
ヒント
- 空のリストを作成する。
- 折る前の値をリストに追加する。
- for文の中でn回折った時の値をリストに追加していく。
最終的にリストに44個の値が格納されていることをlen関数を用いて確認しておきましょう。
グラフの描画には Matplotlib という ライブラリ を用います。リストへ記録するコードの後ろで以下の雛形を使用してください。
雛形
"""
グラフを表示する。タイトルと軸ラベル名付き。
"""
import matplotlib.pyplot as plt
%matplotlib inline
plt.title("thickness of folded paper")
plt.xlabel("number of folds")
plt.ylabel("thickness[m]")
plt.plot(リスト名) # 「リスト名」のところにリストの変数名を入れる
グラフを表示させた場合はそれに対する考察が重要です。厚さがどのように変化しているかを簡単に説明してください。
グラフをより見やすくカスタマイズしてみましょう。カスタマイズしたグラフを最低3種類作成してください。例えば以下のように書き換えることで、線の色を赤に変更できます。
サンプルコード
"""
赤い折れ線グラフを表示する。
"""
plt.title("thickness of folded paper")
plt.xlabel("number of folds")
plt.ylabel("thickness[m]")
plt.plot(リスト名, color='red')
どのようなことができるかはMatplotlibの公式ドキュメントを参考にします。
matplotlib.pyplot.plot — Matplotlib 3.0.2 documentation
カスタマイズ例
- 線の色を青と赤以外にする。
- 線を太くする。
- 線を点線にする。
- 値のフォントサイズを変更する。
上記のページに載っていないカスタマイズも可能です。
サンプルコード
"""
軸の値を大きく表示する。
"""
plt.title("thickness of folded paper")
plt.xlabel("number of folds")
plt.ylabel("thickness[m]")
plt.tick_params(labelsize=20) # 軸の値に関する設定を行う
plt.plot(リスト名)
このplt.tick_params()
に関しては以下のページで説明されています。
matplotlib.pyplot.tick_params — Matplotlib 2.1.1 documentation
様々なカスタマイズ方法を調べて見やすいグラフを作成しましょう。
この課題への回答を分かりやすく綺麗なものにまとめられたら完成です。