この講義では、Pythonをゼロから学ぶ。しかし、始める前になぜPythonを学ぶべきなのか?Pythonを学んでどうするのか?について少し伝えたいことがある。
この講義の目的は「これまでプログラムを組めなかった人がプログラムを組めるようになること」ではない。また、Pythonを扱うが、「Pythonをマスターすること」を目的とはしない。そもそも全くプログラムを組んだことがない状態から、半期の講義を受けたらPythonをバリバリ組めるようになる、というのは不可能だ。
では何を目的とするか。それは「これくらいのプログラムを書けば、これくらいのことができるんだなぁ」という「感覚」を身につけることだ。これから短いプログラムから、それなりに長いプログラムまで多数組むことになるが、そこで文法とか、ライブラリの使い方などを覚える必要はない。ざっくりと「Pythonにはこんなライブラリがあり、それを使うとわずか数行でこれくらいのことができる」ということを頭の片隅に置いてくれればそれでよい。
なぜプログラムを覚えるべきか。それは今後プログラムが就職活動に必須スキルになるからでもなく、ましてAIがブームだからでもない。「プログラマ的な感覚」を身につけるためだ。たとえ普段プログラムをバリバリ組んでいなくても、「プログラマ的な感覚」を身に着けた人は、そうでない人に比べて作業能力が桁違いに上がる可能性がある。
例を挙げよう。今、あなたは卒論もしくは仕事で、あるフォルダの中にある100枚くらいの画像を全て半分にリサイズする必要が出てきた。とりあえずWindowsユーザだとして、「ペイント」を使ってファイルを開き、「Ctrl+E」でイメージのプロパティを開き、そこで幅と高さを調整して上書き保存できることは知っているとしよう。
ここで、この講義を受けた人は、詳細は覚えていなくとも「少なくともPythonには画像を扱うライブラリがあり、リサイズもできるはずで、またフォルダの中のファイル一覧も簡単に取れるに違いない」と思うだろう。そして「Python 画像 リサイズ」や「Python フォルダ ファイル 一覧」などのキーワードでググって、以下のようなコードを書く。
import glob
from PIL import Image
for file in glob.glob("*.png"):
img = Image.open(file)
(w, h) = img.size
img.resize((w//2, h//2), Image.LANCZOS).save("resized/"+file)カレントディレクトリにあるPNGファイルを、半分のサイズにしてはresizedというフォルダに放り込んでいくスクリプトである。たった6行だ。
もしくは、「これくらいのことならPythonいらないかもしれない」と思って、「画像 リサイズ 一括」というキーワードで検索して、ImageMagickというツールにたどり着くかもしれない。それなら一行でできる。
mogrify -path resized -resize 50% *.pngここで重要なのは「PythonのglobやPILというライブラリの存在や使い方を覚えていること」でも「ImageMagickというツールを知っていること」でもない。「これくらいのことなら数行でできるに違いない」という感覚である。プログラマ的な感覚を身に着けていない人は、そもそも「これは簡単にできるだろう」という発想がないため、検索もできない。
もしかしたら「プログラムの素養がなくたって画像のリサイズくらいなら自動でできると思いつくだろ」と思うかもしれない。では、こんな課題はどうだろう?
あなたは卒論でトランジスタの特性を調べることになった。それぞれのトランジスタにはあるパラメータがあり、それを変えて作られている。そのトランジスタの電圧ー電流特性が、以下のようなファイルに保存されているとしよう。
0.0 0.0
0.1 0.01
0.2 0.2
0.3 0.8
...
このようなデータが、トランジスタのパラメタを含めてdata_48.datといった名前で保存されており、それが100個近くある。トランジスタは、ゲートにかける電圧がある「しきい値」を超えると電流が流れ始める。このデータに適当にフィッティングをかけることで、「しきい値」を求めたいとしよう。ファイルそれぞれのデータにフィッティングをかけて、ファイル名のうしろにある値(この場合は48)をx軸に、しきい値をy軸にしてプロットしたい。
「画像のリサイズ」は一般的なニーズだからツールはあるが、この卒論のテーマはあなたしかやっていないから、当然そんな便利なツールはない。ここで、もしあなたが「プログラマ的な感覚」がなければ、一つ一つエクセルでファイルを開き、スレッショルドを求めて、別のエクセルシートにパラメタとして記入していくかもしれない。そして徹夜で作業して「卒論がんばってる!」と錯覚するかもしれない。しかし、もしあなたが「プログラマ的な感覚」を持っていれば、「これはPythonを使えば、長くても数十行でできるな」と思うはずだ。
くりかえしになるが、必要なのは「知識」ではなく「感覚」である。「globを使ってファイル一覧を取得し、scipyのcurve_fitでフィッティングをかけることができる」ということを覚えておく必要はない。大事なのは「そういうことが簡単にできるはずだ」と思うことで、そう思うことができれば「Python フィッティング」で検索すればすぐにscipy.curve_fitにたどり着けるはずだし、もしかしたらPythonではなくRを使いたくなるかもしれない。そうするとあなたのスキルはどんどん増えていくことになる。
こういった考えは別にPythonに限らない。エクセルを使っていても、面倒な処理を見た時に「これは一括でできるマクロがあるに違いない」と思って探すかどうか。毎日決まった時間に、あるウェブサイトにアクセスして、ある値を読み取らないといけないという「仕事」が与えられた時に、「ウェブサイトにアクセスして値を読み込めるツールがあるに違いない。毎日決まった時間に何かを自動的に実行する方法があるに違いない。それを組み合わせれば良い」と思えるかどうか。これが「プログラマ的発想」である。
こういう発想ができるようになれば、日々の作業効率が飛躍的に向上するのが想像できるであろう。別に全ての作業を自動化する必要はない。プログラムは何かの目的を達成するための手段の一つに過ぎず、プログラムするか、ツールを導入するか、それとも今回は手でやるか、自動化のためのコストと、自動化しなかった時のコストを考えて、その時その時に最適と思える選択をすればよい。
細かい文法などは最初は気にせず、必要に応じて調べれば良い。「Pythonはこういうことができるんだな」「それはこれくらいの作業量でできるんだな」という「感覚」を頭の片隅に残すこと、それを目的として講義を受けて欲しい。