【Python】Jupyter notebookを使うときに守るべきPythonの作法2選

こんにちは。この頃Pythonが流行ってきて、webを作るにもPython、データ分析・AIにもPython、時代はPythonですね。
今日はそんなPythonブームを支える一つのツールであるJupyter notebookを使うときに注意してほしいことを書いていこうと思います。

グローバル変数は極力定義しない

よくない例

Jupyter notebookの最大のメリットである対話式プログラミング。しかし、そこには意外なトラップが隠されているのです。
例えば、以下のJupyter notebookの画面をみてください。

お気づきでしょうか。関数funcは引数を取っていない、しかも関数内で変数textを定義していないのに、”hogee!”と出力されてしまっています。
これは、Pythonが変数を参照する際に、まず関数内で変数を探して、見つからなかったら関数の外へ変数を探しに行ってしまう(探しに行ってくれる?)からなんです。

しかも、カーネルをシャットダウンするまでコードを消してもずっと呼び出せます。
このケースだと特に問題は起こりませんが、Jupyter notebookで書いてテストしたコードを別ファイルから呼ぶ予定のあるプログラムに移植するときなどに問題が発生します。エラーが出て動かなくなってしまうので、気をつけてください。

Pythonの流儀その1:main関数を定義して、そこでコードを動かすべし

それでは、以下のようにするとどうでしょう。

きちんとエラーを吐き出してくれていますね。
僕もまだまだ駆け出しプログラマですが、もっとも厄介なバグはエラーを吐いてくれないバグです。
Pythonの流儀を守って楽しいプログラミング生活を送りましょう!

別ファイルからモジュールを呼ぶときは、リロードを忘れずに!

よくない例

例えば、以下のようなモジュールhogehoge.pyを作り、それをjupyter notebookから呼び出すとしましょう。

これを呼び出します。

ちゃんと表示されましたね。さて、次にこの関数をちょっと変えて、”hogehogehoge”と出力したくなったとしましょう。
先ほどのhogehoge.pyを変えていきます。

 

これでうまく出力されるはず、、、と思いきや

されません。
これは、Jupyter notebookで読み込んだモジュールhogehogeが更新されていないからなんです。

カーネルを再起動するか、import libを使う

これを解決するには、Jupyer notebookを上の方にあるぐるっと一周してある矢印ボタンで再起動するか、importlibを使います。ただもう一度import文を実行するだけではダメです。以下のようにすると、ちゃんとhogehogehogeと表示されました。

終わりに

どうだったでしょうか。
Pythonはインデントでブロックを表現したり、コーディング標準規約があったりと、非常にユニークな言語です。
慣れると他の言語で煩雑になる処理が簡潔に記述できることもあるので、Pythonの流儀を覚えてプログラミングを楽しみましょう!