まちがいと向き合う

INPUT · スライド

print で中身をのぞく

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 を置く
  • 予想と合っていれば原因はそこから先、ちがっていればそこより前
  • 範囲を半分ずつせばめて、1行までしぼる

半分に割っていくので、100行あっても7回くらいで見つかる。あてずっぽうに眺めるより、ずっと速いよ。

次のグループでは、まちがいに備える側へ回る。起きてから探すのではなく、起きたときのふるまいを自分で決める書きかただよ。