機械です。
タイトルが質問型になってますが、実際は「わかった」
んでちと書いておきます。
いや、見る人が見ればわかるんだろーけど、私には結
構難しかったんで・・・
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
いつの日か、λとその一族が滅亡する(文法や組み込
み関数として消滅する)日がくるのか、はたまた容認さ
れつづけるのか、まぁ、今後を注目というところでしょ
う。
※個人的には面白いので残して欲しいんですが、まぁ、
醜い(見難い)コードを書きやすいというのは事実だ
しなぁ・・・
機械伯爵