01 / 07
エラーが出ないまちがい
エラーが出れば、トレースバックが場所を教えてくれる。やっかいなのはエラーが出ないのに答えがまちがっているときだよ。
Pythonは書かれたとおりに動いただけなので、何も言ってくれない。あなたが思っている値と、実際の値がちがう——その場所を見つけるのが、バグ取りのすべてだよ。
探しかたはとても単純。あやしい場所で変数の中身を表示してみる。これだけなんだ。
まちがいと向き合う
INPUT · スライド
01 / 07
エラーが出れば、トレースバックが場所を教えてくれる。やっかいなのはエラーが出ないのに答えがまちがっているときだよ。
Pythonは書かれたとおりに動いただけなので、何も言ってくれない。あなたが思っている値と、実際の値がちがう——その場所を見つけるのが、バグ取りのすべてだよ。
探しかたはとても単純。あやしい場所で変数の中身を表示してみる。これだけなんだ。
02 / 07
合計を出すコードの答えが合っていない気がする。そんなときは、計算の途中に print を1行足す。
1回まわるごとの goukei が見えるので、どこでおかしくなるのかが分かるよ。
tens = [80, 60, 70]goukei = 0for ten in tens: goukei += ten print(goukei)print("こたえ", goukei)実行結果
80 140 210 こたえ 210
03 / 07
print をいくつも置くと、どの数がどれだか分からなくなる。何を表示しているかの札(ラベル)をつけよう。
カンマで並べるか、f文字列を使えばいい。変数名をそのまま札にするのがいちばん迷わないよ。
ten = 80kosuu = 3print("ten:", ten)print(f"kosuu: {kosuu}")実行結果
ten: 80 kosuu: 3
04 / 07
ここが肝心。print はただ表示する道具ではなくて、自分の思いこみを確かめる道具だよ。
表示する前に、頭の中で「たぶん 3 になっているはず」と予想してから見よう。予想どおりなら、そこまでは正しい。ちがったら、原因はそれより前にある。
下の例では、3個あるはずの果物が2回しか数えられていない。range の範囲がおかしいと気づけるね。
kudamonos = ["りんご", "みかん", "ぶどう"]kazu = 0for i in range(2): kazu += 1 print("i:", i, "kazu:", kazu)実行結果
i: 0 kazu: 1 i: 1 kazu: 2
05 / 07
関数がからむときは、渡した値と返ってきた値のどちらがおかしいのかを先に分けたい。
関数の先頭で引数を表示し、return の直前で返す値を表示する。これで「入れたものが悪いのか、中の計算が悪いのか」がはっきりするよ。
def zeikomi(nedan): print("うけとった:", nedan) kotae = nedan + nedan // 10 print("かえす:", kotae) return kotaeprint(zeikomi(200))実行結果
うけとった: 200 かえす: 220 220
06 / 07
調べるための print は、原因が分かったら消す。残しておくと、本当に見せたい出力にまぎれてしまうからね。
「そんな原始的な方法でいいの?」と思うかもしれない。いいんだ。プロのプログラマも毎日やっているよ。いちばん手軽で、いちばん確実だからね。
道具が増えてもやっていることは同じ。思っている値と実際の値を見くらべる。それだけだよ。
07 / 07
探す手順をまとめると、こうなるよ。
print を置く半分に割っていくので、100行あっても7回くらいで見つかる。あてずっぽうに眺めるより、ずっと速いよ。
次のグループでは、まちがいに備える側へ回る。起きてから探すのではなく、起きたときのふるまいを自分で決める書きかただよ。