作者: 機械伯爵
日時: 2003/2/10(00:42)
 機械です。

 タイトルが質問型になってますが、実際は「わかった」
んでちと書いておきます。

 いや、見る人が見ればわかるんだろーけど、私には結
構難しかったんで・・・

 applyとゆー組み込み関数があります。

 関数オブジェクトを第一引数に取って間接的に関数を
呼び出すなかなか面白い関数なのですが、lambdaあたり
と併用すると「コードがみにくくなる」と言われる、言
わばPythonの「獣道」の一つです。

 ま、それはともあれ、どーやって使うかというと・・・

>>> def f(a,b,c):return 100 * a + 10 * b + c
...
>>> f(5,6,7)
567
>>> apply(f,(5,6,7))
567
>>> apply(f,(5,6),{'c':7}
567
>>> apply(f,(),{'a':5,'b':6,'c':7}
567

 まぁ、こんな感じで、引数をタプルやキーワード辞書
の形で渡すことができる、まぁそこそこ便利な関数です。

 ところが、Pythonの企画委員会にはλ(lambda)族撲滅
民族浄化会議が存在するらしく(いねーよ)、λ一族で
あるapplyを撲滅しようと、次のよーな文法を編み出しま
した。

>>> def f(a,b,c):return 100 * a + 10 * b + c
...
>>> f(*(5,6,7))
567
>>> f(**{'a':5,'b':6,'c':7})
567

 これでは何のためにあるのか判らん文法なので、apply
の意味も含めて、もうすこし実際的な例を書いてみます。

>>> def f(a,b,c):return 100 * a + 10 * b + c
...
>>> f(5,6,7)
567
>>> x = 5,6,7  # タプルの代入です
>>> x
(5, 6, 7)
>>> y = {}
>>> y['a'] = 5
>>> y['b'] = 6
>>> y['c'] = 7
>>> apply(f,x)
567
>>> apply(f,(),y)
567
>>> apply(lambda a,b,c:100 +)

>>> f(*x)
567
>>> f(**y)
567

 この新しい文法では、λ関数ではなくdefによる関数定
義が必要なので、λ排除に大きな効果が期待できますが、
わかりやすいかどうかについては・・・さぁねぇ・・・?

<lambdaで書くと・・・>
>>> apply(lambda a,b,c:100*a+10*b+c,(5,6,7))
567

 いつの日か、λとその一族が滅亡する(文法や組み込
み関数として消滅する)日がくるのか、はたまた容認さ
れつづけるのか、まぁ、今後を注目というところでしょ
う。

※個人的には面白いので残して欲しいんですが、まぁ、
  醜い(見難い)コードを書きやすいというのは事実だ
  しなぁ・・・

                     機械伯爵