トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS   ログイン


python-logo.gif

Python Programing Langage

インデントブロック is not アンフリーフォーマット

 インデントブロックは、ABC言語から受けついだPython最大の特徴としてよく紹介されます。そしてこの特徴を以って、古参のベテランプログラマの方々はCobolなどのフォーマット固定言語を彷彿させ、難色を示すという話を時々聞きます。

 実際から言えば、Pythonはほぼフリーフォーマットです。ブロックのインデントは強制されますが、式はいくらでも長くできますし、パーレン(丸括弧)でくくれば、行もかなりファジーに設定できます。

 何より、強制されなくともブロック構造はインデントされて書かれるのが普通なので、むしろ「ブロックに括弧を書かなくて良い、手軽な言語」として考えていただいたほうが正確かと思います。

 ただ、TABによるインデントはトラブルの元なので、ホワイトスペースによるインデントをお勧めいたします。


どこにでもあるelse?

 if文にelse節があるのはあたりまえ。elifも、case文と同様と考えればそんなに珍しくもない。でも、for文やwhile文にelse節が付けられるのはPythonぐらいでしょう。しかもこのelse節は「breakせずに正常にループが終了したら起こる」のです。

 理屈としてはこうです。if文の条件式が偽になった時にelse節が実行されます。forやwhileは、条件を満たさなくなった時にループを抜けます。ゆえに、「条件節を満たさなかった時にelse」は理屈には合っています。しかし、「正常にループが終わるとelse(~でなければ)」というのは、語感的に微妙な気がしないでもないですね。


Lambdaはお一人様のみ

 Pythonのラムダ文と呼ばれる文法は、lambdaキーワードによって、式を関数に変換して返すことが出来ます。ただし、defキーワードによる関数定義と異なり、ラムダ文の中には式しか書けません。Pythonでは代入は式でなく文ですから、ラムダ文によって記述できる関数は、かなり限定的なものになります。

 ラムダ文が式にしか適用できないのは、ラムダ文の中であまり複雑化しないように、という配慮らしいのですが、その結果、数学で言うところのλ式に近い雰囲気になっている(当然、本来のλ式には代入などない)ともいえます。

 ラムダ文は、名前にバインドされない無名関数を作ることによく使われますが、別に代入文を使って名前をつけることも可能です。むしろ「関数オブジェクト」を記すリテラルと考えていただいたほうがいいかもしれません。


文は式ならず

 文と式の区別の無い言語の信奉者には、Pythonの「文と式の区別」は、前に挙げた「ブロックインデント」とともに、異端審問のように糾弾されるネタの一つです。Pythonでの式文(lambda文を含む)以外の文は、代入文、print文、exec文、for文、if文、while文、クラスや関数などの定義文、その他の例外文関連でしょうか。

 このうち、print文とexec文はPython3000では関数に変更されますし、if文は条件付評価式(Conditional Expressions)でかなりのことが書けます。for文も内包表現でそして、どんな文もdef定義で囲ってしまえば関数⇒式になってしまいます。各文を無理やり式にする必要は無いと思いますし、そのメリットもあるんだか無いのだか、結構理解しにくいです。

 では、文と式を分けることにメリットはあるのか……これは、代入(=)と比較演算(==)での単純ミスを起こさないため、ということがよく例に挙げられます。その他にも、式で表現できるということは、逆に複雑な式が書けてしまうという「悪しき欲求(ダークフォース?)」を呼びます。その抑制のためにも、文法で禁止してしまうのも一つの方法ではないのかな、と思います。


なんでもimport?

 Pythonでは、プログラムを終了するにも、コマンドパラメータを取得するにもインポートが必要です。他のスクリプト言語では、面倒なパッケージインポートなどをせずとも使える組み込みツール(関数/手続き)がてんこ盛りなのに、Pythonはそれに比較して意外と少ないです。

 これは、逆に考えれば自由に使える名前が多い、ということです。名前空間は混雑しやすいですから、必要なものだけを導入し、すっきりと記述できる、という方針でもあります。また、インポートするパッケージ/モジュールを見ることで、スクリプトの性質が理解しやすくなるという点もあります。

 どうしても面倒だという方は、よく使うツールを自分用に登録したモジュールを用意されることをお勧めします。


PythonはC++風、RubyはSmalltalk風?(オブジェクト指向の話)

 Wikipediaに書き込んだら「根拠が無い」と削除された(泣)一文です。つってもRubyがSmalltalkライクだってのは作者が公言してますし、「Programming Python」とかにも「C++ライクな」と書かれているので、別に根拠が無いわけじゃないと思うんですが……

 ま、それはともかく、Pythonは「オブジェクトとメッセージ」というくくりではなく、「オブジェクトと演算子」に「文構造のためのブロックヘッダ」というコンポーネントで出来ています。文構造なんて、C++どころか、関数オンリーのCですら無いですね(笑)Pascalライク、のほうが良かったかしら(歴史的にはご存知の通り、BASICライクなABC言語から発展しました)

 とかく、メッセージ指向系ではなく、あきらかに抽象データ型から発展したクラス指向の究極(いききったところ)という雰囲気です。

 Javaが敬遠した、演算子のオーバーロードだの多重継承だの、ばしばしに残ってます。Javaが唯一多重継承の価値として残したインターフェイスも、タイプルーズでは何の意味も無いので、Pythonの多重継承は単なる悪魔合体だとしか思えません。

※時々PythonがJavaと同列に語られることがあるけど、言語仕様だけを見れば、同じC++ライクでこれほど発展のベクトルが違うというのも面白いかと。