ナノピコ教室の東海道五十三次をPythonで解いてみた(2)
前回の続きです。
ライブラリのインポート・グローバル変数
import csv
import math
import copy
import sys
fare_list = []
stations = []
csv、math、copy、sysの4つの標準ライブラリをインポートしています。
csvライブラリは、csvファイルを読み込む際にcsv.reader関数を使っています。
mathライブラリは、1キロメートル未満の端数を切り上げるためにmath.ceil関数を使っています。JRの運賃計算が
運賃は営業キロを使用して計算します。
営業キロは、「JR時刻表」の列車時刻の駅名欄の左側にある「営業キロ」から算出し、1キロメートル未満のは数は切り上げ、これを「A表 本州3社内の幹線の普通運賃表」または「B表 本州3社内の地方交通線の普通運賃表」にあてはめて運賃を計算します。
東京・名古屋・大阪の一部地区では特定運賃が適用される区間があります。
となっているためです。
copyライブラリは、リストをコピーする際にcopy.deepcopyを使っています。プログラムを作る際に配列・リストのようなデータの集まりをコピーする場合「浅いコピー」「深いコピー」で引っかかることがよくあります。詳細は省きますが、「浅いコピー」「深いコピー」「参照渡し」「値渡し」という言葉に馴染みがない場合、簡単なプログラムを動かして挙動を確認したり、配列などがどのようにメモリ内部にデータを持っているかを確認したりするとよいと思います。別の変数名だから別の値だと思ってプログラムを書いていると、値を変更したり追加したときに連動して変更・追加されてしまうことがあるので要注意です。
sysライブラリは、ものすごく大きい数としてsys.maxsizeを使うために利用しています。ものすごく大きい数をどうするかという問題になりますが、運賃だから百万円は超えないだろうから1,000,000にするのでよいでしょうか?かつてジンバブエがハイパーインフレに見舞われ100兆ジンバブエ・ドルが発行されたという過去もあるので、ベタで数値を書くのではなく、システムが持っている最大の数sys.maxsizeを使っています。ジンバブエもびっくりな922京を超えるような金額を計算する必要が出た場合、見つけるのが困難なバグの温床ですが・・・
変数fare_listは営業キロと運賃の対応を扱う変数です。また、変数stationsは駅の名前、東京からの営業キロといったデータを扱う変数です。
main関数
def main():
init()
find()
print_result()
プログラムがやっている流れがわかりやすいように、粒度を大きくして関数にしています。
このプログラムでは
初期化をして(init関数) → 最安ルートを探索して(find関数) → 結果表示する(print_result関数)
だけです。各関数については別のところで書きます。
main関数の呼び出しは64行目以降の
if __name__ == '__main__':
main()
から呼び出しています。64行目のif文により、直接実行した場合のみmain関数が実行されます。
長くなったので、今回はここまでにして続きは後日書きます。
ディスカッション
コメント一覧
まだ、コメントがありません