ナノピコ教室の東海道五十三次をPythonで解いてみた(3)
前回の続きです。今回は初期化する部分の説明です。
init関数
def init():
global start_station ,start_distance
global best_route
read()
start_station = stations.pop(0)
start_distance = float(start_station[2])
best_route = [ [start_station[0] ,start_distance ,0 ,0 ,[start_station[0]] ] ]
15・16行目のglobalで、3つの変数をグローバル変数として扱っています。前回のfare_listとstationsもここで宣言してみたのですがうまくいきませんでした。私の理解不足です。すみません。
18行目のreadは、csvファイルからの読み込みを関数としてまとめ、呼び出しています。
20行目から22行目は、計算に必要な値を初期化しています。
20行目では、読み込んだcsvファイルのデータから出発駅を最初の行がリストになった[ ‘大船’ , ‘おおふな’ , ’46.5’ , ‘神奈川県’ ]が記憶されます。
21行目では、start_stationから営業キロのデータが入っているstart_station[2]を取ってきます。ただし、文字列で読み込んでいるのでfloatで小数に変換しています。
22行目では、大船から大船までの最安ルートをリストに入れています。当然、電車に乗る必要がないので運賃を計算する必要はないのですが、0キロメートル電車に乗ったという扱いにしています。このように端点の処理をうまくしておくと、プログラムが統一的に書くことができてシンプルなプログラムになります。このような手法は番兵とか番人と呼ばれています。
この行を実行された後、best_routeは[ [‘大船’ , 46.5 , 0 , 0 , [ ‘大船’ ] ]というリストになります。
best_routeの要素は[ ‘駅名’ , 東京からの営業キロ , 最安運賃 , 通常運賃 , 乗り継ぎ方のリスト ]という形式にしました。
read関数・file_read関数
def read():
file_read('fare.csv' , fare_list)
file_read('tokaido.csv' , stations)
def file_read(file_name ,variable):
with open(file_name) as f:
reader = csv.reader(f)
header = next(reader)
for row in reader:
variable.append(row)
ファイルを開いてデータを読み取るには、24〜26行目のプログラムになります。
今回読み取るcsvファイルは2つなので、同じようなプログラムを2回書いても大丈夫です。2回ファイルを読むときに異なるのは、ファイル名と読み込んだデータを記憶しておく変数だけです。これを引数として与えて関数化してしまおうという発想です。
25・26行目では、file_read(ファイル名 ,変数名)という形式で呼び出しています。
プログラミングで、繰り返しや関数化が難しいと言われています。慣れないうちは、いきなりforなどを使ってまとめようとしないで、同じ命令を何回も書いてしまってもよいと思います。書いたコードをよく見ていると、繰り返し何回も出てくる冗長な箇所が見つかるのでそれを1回だけにして、変化しているところを変数でうまくあらわすように工夫してみると良いと思います。
紙と鉛筆書くのではなくパソコンではコピペが使えるので、繰り返し書いてもそんなに大変ではないと思います。そもそもコピペしている時点で、forとか関数とかを使ってまとめられないかと考えるようになっていきましょう。といっても、プログラムを修正や改良するときに、同じ修正を泣くほど何回も繰り返しやって嫌な思いをしないと身に付かないかもしれませんが。
29行目でファイルを開いています。withを用いて書くと自動でcloseしてくれ、closeし忘れることがないメリットがあります。
30行目でデータを読み、31行目でタイトル行を読み飛ばしています。
33行目で1行ずつrowに代入して、34行目を繰り返します。
34行目では引数variableで受け取った変数に、要素として追加しています。
初期化の部分は以上です。区切りがいいので、今回はここまでにして、続きは次回書きます。
ディスカッション
コメント一覧
まだ、コメントがありません