読者です 読者をやめる 読者になる 読者になる

続・PythonがRubyに似てないところがあるからって、そんな…

Python

Rubyist Magazine - Rubyist のための他言語探訪 【第 1 回】 Python

で言われてることが一般認識みたいになっているので、ちょっと違うなと思うことをメモっとこう。あなたがもしPythonを作る前のGuidoに憑依して - ネットリサーチ - livedoor ニュース とか はじめてのひき - PythonSucks とか。

まえも似たようなのを Pythonが他の言語に似てないからって、そんな… - なんたらノート 第二期 で書いてます。

self が多い

Python ではインスタンス変数のアクセスは「self.foo」のような形式で行います。これは Ruby の「@foo」という形式に比べてタイプ量が多いので面倒と感じることがあります。逆に Python ファンは「@」という記号を使うのが醜いと感じるようです。

ついさっき、「宣言にselfは必須だ」ということを書いたので、こちら Pythonのselfはなぜ必要かをJavaScriptのthisで考える - なんたらノート 第二期 を見てください。さらに、Rubyはどのへんの生産性が高いのか - なんたらノート 第二期 で、Rubyがいかに変わった言語か(なんちゃって)を説明しています。

それから、記法を比較する前に、「Rubyにはパブリックメソッドしかなくて、Pythonはすべてパブリックフィールド」という実行モデルそのものの違いを先に気にするのが重要ではないかと思います。

私見ですが、モジュールスコープに変数をうまく閉じ込めれば、selfが過剰に多くなることはないのでは? と思います。Pythonで完全なOODをやってしてしまうと、そうなるかもしれません。多くてかなわないと思うほどオブジェクトの状態数が多いとき、Python的にはオブジェクトを作りすぎなのかもしれません。

以下重要

イミュータブルな文字列

Python では文字列を書き換えることはできません。効率を考えるとうれしくないのですが、オブジェクトの書き換えは面倒を引き起こすこともありますから、うれしくないことばかりでもありません。

PythonにはRubyのシンボルと同じものがないので、文字列が兼任してる。JavaのStringと同じ理由で、けしてミュータブルであってはなりません。

タプルとリストの区別

Python には「配列」のようなデータ構造として、変更可能なリストと変更不可能なタプルのふたつをもっています。このふたつの使い分けはときどき悩みのタネです。慣れてしまうとどうということはないようですが。リストは Ruby 同様、鈎括弧でくくります。タプルは要素をカンマで区切って並べたものですが、普通は式の他の部分と区別するために丸括弧でくくります。

タプルは「イミュータブルなひとつの値」です。イミュータブルな文字列同様、スレッドセーフで確定的なハッシュ値を持つため、たとえば、辞書のキーなどに向いています。Rubyではシンボルを使う状況で、タプルを使います。

http://d.hatena.ne.jp/tanakahisateru/20081111/1226337720
の、メモ化を参照してください。可変長引数を値のタプルとして受け取り、辞書のキーにしています。

いっぽう、リストは普通の配列です。要素を追加/削除/並べ替えできます。ごく普通に、可変長に要素が並んでいるデータバッファが欲しければ、迷わずリストを選べばよいと思います。

たとえば、「行列という値(整数や虚数みたいに、数の一種:イミュータブル)」はタプルで作るのが適当で、行列計算機の内部バッファはリストで作るのが適当だと思います。言語仕様だけ見て考えるより、意味で直感的にやるのがいいかもしれません。

それでも普通は、8〜9割以上の場合で、リストが適当だと思います。