変数とオブジェクト あとlambda

pythonの変数はオブジェクトを参照するだけで値は持たない。その点は別に珍しくない。
でも関数やメソッドの名前は実は変数で、関数やメソッドが代入されている。Rubyでもクラスが定数に代入されてたりしたけど、pythonはもっと徹底しているわけだ。

# python
def abc():
  print 'abc'

x = abc
x() # abcと表示する。

要はdefやclassは関数オブジェクトやクラスオブジェクトを作って変数に代入しているということのようだ。
PHPも確か関数を変数に代入する方法があったと思ったけど、変数全部に$が付いてるから普通の関数のように使うことはできなかった。まぁ見た目だけの問題だけど。
Rubyだと関数やメソッド呼び出しの括弧を省略できるので、括弧のあるなしで動作を変えることはできないから、method()を使わないとメソッドオブジェクトは取得できなかった。呼び出すにもcallメソッドを呼ぶ必要があったし。でもRubyは何でもイテレータを使うからあまり困らないと思うけど。
実際Rubyでprocやブロックを使っていたような箇所はこの関数オブジェクトや、あとlambdaを使うことが多そうだ。lambdaは式として定義できる無名な関数で、ちょっとしたことならそれで間に合う。

# pythonのよくある例
a = [3, 1, 4]
a.sort(lambda x, y: x - y)