9月第一週

構文や基本データ型についてはほぼ出揃いました。構造体的なデータ表現はまだ登場させていませんが、リスト・タプル・文字列・集合・辞書とそれを制御する各種制御構造さえあれば、もはやほとんどの問題は何でも解けてしまう段階です。

このあたりのゴリゴリした手続き的処理にもっと時間を割いてもいいのでしょうが(ほとんどのスクールでは実際ゴリゴリの力技をまずやるのでしょうね)、しかし、それよりもずっとずっと大事なこととして、当スクールでは関数の扱いについてしつこいくらいに時間を割いています。

具体的には関数オブジェクトの扱いです。Pythonという言語は、私の最も愛する言語であるLispのように第一級のオブジェクトとして関数を扱うことができます。 LispやHaskellなどとまではいいませんが、Pythonにおいても関数を受け取ったり関数を生成して返したりという手法は呼吸をするくらいに自然なアプローチといえます。世間一般では関数型プログラミング手法を身につけるのは難しいとされているようですが、必ずしも私はそうは思いません。学習の初期の段階から関数的アプローチに基づいた自然な抽象化に徐々に慣れていけば良いだけだと考えています。

今週はリストに対する昇順のバブルソートをまず素直なアルゴリズムを基に実装してもらい、後にそれを高階関数化しました。隣り合う要素のスワップ判定を行う判定関数を、ソート関数の引数として渡してもらうという自然な拡張です。さらに、任意の判定関数を渡し、その判定関数の返り値を論理否定した値を結果として返すクロージャを生成する高階関数も定義しました。これによって生成されたクロージャをバブルソートを行う関数に判定関数として渡してやれば、結果として逆順のソート結果が得られるという寸法です。

抽象化こそがプログラミングの力の源泉です。力任せにゴリゴリ書いていても意味がありません。世に蔓延するコピペプログラマのように思考を放棄して無駄な体力を使うことを選択するよりも、まず自分の脳みそを最大限に振り絞ってラクをする方法を考えることがプログラミングではなにより大切です。同じ問題を扱うにしても、何も考えずに何時間も汗水たらして力仕事をしたところで、抽象化手法を使って汗一つかかず一瞬で終わらせられる人間のほうがこの世界では百万倍は使えるのです。

来週は、これまでのおさらいをしながら、mapやreduceなど関数プログラミングでおなじみの手法を混ぜ込んでいく予定です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です