search
LoginSignup
1

posted at

updated at

初心者は面倒くさくてもprint系関数で挙動を確認しようね

print系関数使っていますか?

C言語なら printf() 、Pythonなら print()、どんな言語を学ぶ際にも「Hellow World!」を出力する関数をまず学びますよね?
(本記事ではそれらを print系関数 と呼びます)

それから多くの関数やループ処理を学んだあと、もしあなたのプログラムが思った通りに動かなかったら、それは最初に学んだ print 系の関数を使いこなしていないからではないでしょうか?

頭の中で何回シミュレートしても、実際コードを走らせると思った結果が出なくて悩んでませんか?

以下はPythonで openpyxl ライブラリを使って、Excelのシートをリストに従って並べ替える自作関数の一部です。

リストを reversed() で逆順に読んだり、任意の位置以降に並べ替えたシートを配置するためにシートの移動距離 offset= を数式で表現したりと少しテクいことをしています。

慣れた人でないとパッと見このコードが何をしているかわかりにくいのではないでしょうか?

import openpyxl
sl = 3

(中略)

    print("シートを並べ替えています\n")

    for e in reversed(slist):
        
        if e in wb.sheetnames:
            print(e + " exists in sheets.")
            ws = wb[e]
            print("sheet index of " + e + " is " + str(wb.index(ws)))
            print(e + " is moving by offset=" + str( sl - wb.index(ws)))
            wb.move_sheet(ws, offset= sl - wb.index(ws))
            print("sheet index of " + e + " is " + str(wb.index(ws)) + "\n")
            wb.save(savename)
        else:
            continue
    print("完了")

やたらと入っている print() は何をしているのでしょうか?
コードを読んだ人に意味を伝えるならコメント機能を使えば良いのでは?

コードが正しいならね

print() は何をしているのか?
それはコードが正しくないかもしれない(思った通りに動いてくれないかもしれない)ときに、いまプログラムがやっていることを、コードを書いているあなた自身に伝えているのです。

エラーと戦うためのprint系関数

上述のプログラムを走らせると、コンソールに次のようにログが表示されていきます。

シートを並べ替えています

りんご exists in sheets.
sheet index of りんご is 3
りんご is moving by offset=0
sheet index of りんご is 3

みかん exists in sheets.
sheet index of みかん is 4
みかん is moving by offset=-1
sheet index of みかん is 3

完了

ログのおかげで、プログラムが想定通り動いて終了したこと、リストが想定通りの順で読まれたこと、並べ替えの開始位置が想定通りindex[3]から開始されていることが確認できます。

そもそも初心者のプログラムは、まずエラーなくすんなり動くことはありません。

エラー文を見ればどこにエラーがありそうか分かります。
特に構文エラーの修正は簡単です。
一見では原因が見抜けないエラーもたくさんあります。
そんなエラー文との戦いの心強い味方が print系関数です

しかし、そもそもエラー箇所までの処理は本当に想定通り動いてますか?

  • 自作関数の出力は、次の処理に渡せる型になってますか?
  • 入れ子になった iffor のどこをいま処理していますか?
  • その処理の結果は想定した通りですか?

こういった不安や疑問、とりあえず print系関数 で出力すれば解決します。

print系関数を使うコツ

print系関数 を使うコツは2つです。

  1. 不安な処理の前後に入れる。
  2. 変数や関数を使って結果をそのまま出力する。

不安な処理の前後に入れる

ある処理がうまくいっているか知りたくて print系関数 を入れているのですから、その前後に入れるべきでしょう。
前に入れることで処理前の状態を、後に入れることで処理後の状態を出力できます。

変数や関数を使う

出力文字列に変数や関数を使うことで、変数の代入値の変化や変数の型のチェックができます。(例: type()is*() を使って、処理が上手くいっていることを確認しよう)

以上

print系関数 を使うとエラー箇所やプログラムが上手く回っていない部分が分かりやすくなるので、初心者は積極的に print して自分のコードを確かめよう、というお話でした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1