クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

一つずつ確かめてバグを探す

このレッスンのあとで: 一つずつ確かめながら、バグの場所を見つけることができます。

50分のレッスンコマンドなし

平均が少しだけ低い

コンビニチェーンの本部で、店舗ごとの売上レポートを作っています。ある店長から「うちの店の1日の平均が、いつも少し低い」と連絡がありました。

エラーは出ていません。数字だけが合いません。当てずっぽうで直すと、別の場所が壊れます。順番に確かめていく方法を学びます。

このレッスンのゴール

メモ

一つずつ確かめながら、バグの場所を見つけることができます。

キーワード

ことばいみれい
バグプログラムの中の間違いです。
デバッグバグを見つけて直す作業です。
トレースバックエラーが起きた場所を示すメッセージです。line 5
print デバッグ途中の値を表示して確かめる方法です。print("total =", total)
二分探索範囲を半分ずつにして探す方法です。

学生が入力するセルは、このプレビューでは空白です。

エラーは最後の行から読む

エラーが出たら、まずトレースバックの最後の行を読みます。そこに、エラーの種類と理由が書いてあります。

次に、その少し上にある line 6 のような行番号を見ます。その行で、どの値が予想と違うのかを考えます。

メッセージを読まずにコードを書き換えるのは、いちばん時間のかかるやり方です。

実行: エラーを読む

コード: python
# 店舗の売上を、CSVファイルから読み込んだつもりのデータです。
sales = [32000, 41000, "28000", 39000]

total = 0
for amount in sales:
    total = total + amount

print("合計:", total, "円")

# エラーの最後の行と、行番号を読んでください。
# 3番目の値だけ、引用符で囲まれた文字列になっています。

print で途中の値を見る

エラーが出ないのに答えが違うときは、途中の値を表示します。

ループの中に print を一つ入れると、足した値と、そこまでの合計が順に見えます。自分の予想と一つずつ比べて、最初に違った場所がバグの場所です。

バグが直ったら、確かめるための print は消しておきます。

練習: 足されていない値

コード: python
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

学生が入力するセルは、このプレビューでは空白です。

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。