平均が少しだけ低い
コンビニチェーンの本部で、店舗ごとの売上レポートを作っています。ある店長から「うちの店の1日の平均が、いつも少し低い」と連絡がありました。
エラーは出ていません。数字だけが合いません。当てずっぽうで直すと、別の場所が壊れます。順番に確かめていく方法を学びます。
このレッスンのゴール
メモ
一つずつ確かめながら、バグの場所を見つけることができます。
キーワード
| ことば | いみ | れい |
|---|---|---|
| バグ | プログラムの中の間違いです。 | |
| デバッグ | バグを見つけて直す作業です。 | |
| トレースバック | エラーが起きた場所を示すメッセージです。 | line 5 |
| print デバッグ | 途中の値を表示して確かめる方法です。 | print("total =", total) |
| 二分探索 | 範囲を半分ずつにして探す方法です。 |
学生が入力するセルは、このプレビューでは空白です。
エラーは最後の行から読む
エラーが出たら、まずトレースバックの最後の行を読みます。そこに、エラーの種類と理由が書いてあります。
次に、その少し上にある line 6 のような行番号を見ます。その行で、どの値が予想と違うのかを考えます。
メッセージを読まずにコードを書き換えるのは、いちばん時間のかかるやり方です。
実行: エラーを読む
# 店舗の売上を、CSVファイルから読み込んだつもりのデータです。
sales = [32000, 41000, "28000", 39000]
total = 0
for amount in sales:
total = total + amount
print("合計:", total, "円")
# エラーの最後の行と、行番号を読んでください。
# 3番目の値だけ、引用符で囲まれた文字列になっています。
print で途中の値を見る
エラーが出ないのに答えが違うときは、途中の値を表示します。
ループの中に print を一つ入れると、足した値と、そこまでの合計が順に見えます。自分の予想と一つずつ比べて、最初に違った場所がバグの場所です。
バグが直ったら、確かめるための print は消しておきます。
練習: 足されていない値
def daily_average(sales):
total = 0
for i in range(1, len(sales)):
# 途中の値を表示して、一つずつ確かめます。
print("i =", i, "足す値 =", sales[i], "ここまでの合計 =", total + sales[i])
total = total + sales[i]
return total // len(sales)
# 3日分の売上です。平均は40000円になるはずです。
print("平均:", daily_average([30000, 40000, 50000]), "円")
# 表示を読んで、足されていない値を見つけてください。
# 見つけたら range(1, len(sales)) を直して、もう一度実行してください。
よくある誤解
注意
「怪しい所をまとめて何か所も直せば、早く終わる」と考える人は多いです。何か所も一度に変えると、どれが効いたのかわからなくなります。新しいバグが入ることもあります。一度に変えるのは一か所だけにして、毎回実行して確かめましょう。
問題を半分に分ける
処理が長いときは、真ん中で値を確かめます。真ん中の値が正しければ、バグは後ろの半分にあります。間違っていれば、前の半分にあります。
これをくり返すと、8つの手順でも3回確かめるだけで場所がしぼれます。Git の変更履歴でも同じ考え方を使えます。
例: 8つの手順から探す
| 確かめる場所 | 値は正しいか | わかること |
|---|---|---|
| 手順4のあと | 正しい | バグは手順5から8 |
| 手順6のあと | 間違い | バグは手順5か6 |
| 手順5のあと | 正しい | バグは手順6 |
学生が入力するセルは、このプレビューでは空白です。