私はPython使いになるかも知れない
ただの日記です。
いままでスクリプト言語はPerlがメインでしたが、これからはPythonがメインになるかも知れない、というお話です。
ことさらPythonを持ち上げる(いわゆるマンセー)とか、Perlを貶める(いわゆるdis)という意図は全くありません。
Perlを使っていた理由
Perlを使い続けていた理由は、わりと消極的なものでした。
まだ初心者のころ、サーバーサイドプログラミングをするためにPerlを学んだのが始まりで、それからPerlを中心に学んでいたこともあって簡単なスクリプトなら深く考えなくても書けたので、重宝していました。
簡単なテキスト処理なら、私にとってはPerlが一番楽だったのです。
一方、RubyとPythonについては、一時期少しかじっていて、Rubyはこのブログでもネタにしていたことがありました。Pythonはネタにはしていませんが少しだけ使っていました。
このときに、なぜPerlから切り替えなかったのか。
それは、次のような消極的な理由からです。
当時の現場では、残念なことに、PythonもRubyも使えなかったのです。サーバーも作業PCも、インストールが制限されていたためです。
幸か不幸か、Perlはサーバーにデフォルトで入っていました。作業PCにも、別の製品に同梱されていた実行環境があったので、それを使うことができました。当然、CPANは使えませんでしたが。
Encodeが追加されたバージョン5.8は2002年には既に出ていて、それ以上のバージョンが使えたのは救いでした。
そのほかにも、潜在的なPerlユーザーが多かったというのもあります。保守的な技術者でも、Unix-like環境に長く携わっているベテランなら、Perlくらいはできる場合が多かったのです。
とにかく、アプリケーションではなく、ツールとして使う分にはPerlは使い勝手が良いものでした。
そして今、これらの制約が無くなったため、Perlを積極的に使い続ける理由が無くなったというわけです。
もちろん、今後Perlをまったく使わないというわけではなく、積極的に新しいことを取り入れないというだけです。
Perlをやって良かったこと
Perlでmap
関数に出会っていたのはラッキーだったかも知れません。
関数型プログラミングを意識する前から、map
関数のありがたみを教えてくれたからです。
コレクションは、最低でもfilter
,map
,foreach
の操作ができないと発狂します。
Perlでなくても出会いようはあるでしょうが、今のように関数型プログラミングが話題になる前でしたし、初心者だったので「関数型なにそれ」でしたから。ちなみに、Perlの関数型っぽい機能はLisp由来らしいので、map
関数もきっとそうなんでしょう。
ただ、クロージャーの概念はあまり理解できていなかったようで、map
関数の第1引数を引数として認識できておらず、特別な処理ブロックのような何かと解釈していた時期もありました。さらに他の言語を学んでいくうちに理解できるようにはなりましたけどね。
あと正規表現。
Perlをやっていたから身に付いたもので、そうでなければ使いこなせていなかったでしょう。
そういえば、Pythonには正規表現リテラルはありませんが、正規表現リテラルは必要か?という議論が過去に湧き起っていますね。特に引用はしません。
私的には、要るかどうかに関係なく、正規表現オブジェクトと言えば/.../
であって欲しいのですけどね。理屈じゃなくて。
なお、正規表現の時代も終わるのでは?という話もあったりなかったり。
Pythonに切り替えようと思ったきっかけ
AI関連で話題になったという点も少なくないです。
でも、いちばん大きな理由は、これ↓です。
teratailというQ&Aサイトに参加させていただいているのですが、ここ最近teratailでPythonについて回答する機会が多くて、そこで調べながら回答していくにつれて、Python面白いなーと思ったのがもっとも大きな理由です。
調べながら回答するのと同時に、新しいことを学習できましたし、興味と意欲が沸いてきました。
私はこれを、(質問への)「回答駆動学習」と呼んでいます。
なお、Rubyにしなかった理由は、小さいことの積み重ねでPythonのほうが自分的に高評価になったためです。感覚的なものなので説明が難しいのですよね...
Pythonの好きなところ
私は波カッコが好きではない*1ので、Pythonはそれを書かなくてよい点では、昔から好きでした。ただ昔触っていたときはなんとなく興味をひかれなかったため、自然消滅してしまっていました。
私は、コーディングスタイルはお任せできるほうが良いと思っています。
PythonにはPEP8というコーディング規約があって、それを自動で適用してくれるautopep8というツールがあります。Javaで言うところの、CheckStyleとフォーマッターを一緒にしたような感じです。自動で適用できないところもあるので、そこは警告を出してくれます。
PythonはREPLが標準なところも良いですね。PerlのREPL、perlshを最近になって知りましたが、もっと早く知っていればまた違った状況になっていたかも。
内包表記も良いですね。filter
,map
関数のような処理は、簡潔に、そしていかにも数式っぽくかけるのが望ましいです。なので、内包表記はできれば記号だけで書けると最高ですが、Pythonのでも十分です。
ジェネレーターの機能も面白いですね。
あと、Perlと比べてという点では、文字列などがオブジェクトとして扱えるところですね。今となっては特に珍しい機能ではありませんが。
他にもありますが、上手く説明できません。これも感覚的なものが多分にあります。
初心者として導入したこと
EclipseのPleiades All in Oneには、PyDevというPythonプラグインが入っているので、それを使っています。これのフルパッケージには、Pythonの実行環境も同梱されているので、それを使っても良いですが、PyDevからCygwinのPython実行環境を使うこともできますので、実行環境はCygwinのものを使っています。
PyDevで、保存時にautopep8をかけるように設定しています。
Macでは、pyenvを入れています。
複数の実行環境をglobal
やlocal
で使い分けられるので便利です。便利なんですが、local
を設定したディレクトリーでのシェルの動作がおかしくなるのが気になります。
Pythonの面倒なところ
基本はPython3を使っていく予定ですが、製品の中にはPython2でないと動作しないものがあったりするので、両方の環境を作っておかないといけないのが少し面倒ですね。
さらに細かいバージョンの管理も。
スクリプト言語全般に言えることですが、ライブラリーが実行環境に結びついているのは、ちょっと扱いづらいところがあります。
これを上手に解決する方法があるのかも知れませんが、私はまだ不勉強にして存じませんので、悪しからず。
併存できるのでそれほど苦では無いですけどね。二度手間ってだけで。
あと、Pythonに限ったことではないですが、適当にググったりすると、Python2のコードなのかPython3のコードなのか、見分けがつかなくて困ることがあります。
もう少し熟練すれば、簡単に見分けられるようになるのでしょうか。
そういえば、Perlは4と5の端境期に同じような問題がありましたが、Perl6も同じような問題が発生するのでしょうか。
最後に
ということで、ごめんねさようならPerl。いままでありがとう。
とは言え、Pythonまだ使い始めたばかりですし、具体的に何をするかも決まっていません。PerlでやっていたことはPythonでできるようにしたいですね。
とりあえず、オライリーの入門 Python 3を買ったので、それで少しずつ勉強する予定です。
何か面白いことができると良いのですが。
(おわり)