作者: 機械伯爵
日時: 2006/4/24(10:40)
 ども、機械す。

> | 使い捨て関数を定義するのに、evalに文字列渡して評価させるなんて、
> |ぞっとしないです。
> 
> evalに文字列なんてことはしなくても、名前を付けてスコープロー
> カル関数を使えばよいんじゃないでしょうか。文も書けるし。

 はい、そのとーりです。

 GvRも基本的には、その方法を薦める方向でlambdaを廃止したかった
わけなんですが………

 Pythonユーザがこんなこと言っちゃダメなんだろうけど………面倒
臭いんですよ、いちいち名前つけるの(泣)

 参照して何度も使う関数は、もちろん名前つけますが、その部分だけ
の繰り返しのためだけの式にいちいち名前つけるの、疲れます。

 例えば、こーいうの。

def fncA(x, y):
  return x + y

def fncB(x, y):
  return x - y

def fncC(x, y):
  return x * y

def fncD(x, y):
  return x / y

fncList = [fncA, fncB, fncC, fncD]

del fncA, fncB, fncC, fncD

※実行

fncList[0](5, 10) ⇒ 15

 最終的に、リストに纏める関数を定義するのに、あとで消去する
名前をいちいち付けるのは辛いです。

 で、関数名を使わずにevalを使うとこんな感じでしょうか

fncStr = [
  'x + y',
  'x - y',
  'x * y',
  'x / y']

※実行

eval(fncStr[0],{'x': 5, 'y': 10}) ⇒ 15

 実行時に結構面倒なコード書かなければならないし、それに内部の
引数に使った引数文字を知っている必要があります。

 んでもって、lambdaを使うならこれで一発。

fncList = [
(lambda x, y: x + y),
(lambda x, y: x - y),
(lambda x, y: x * y),
(lambda x, y: x / y)]

※実行

fncList[0](5, 10) ⇒ 15

 コードも見やすいし、無駄な名前もでてきません(スッキリ)
 折角関数がファーストクラスオブジェクトなので、こういう有効利用
するには、やっぱラムダがあってくれるのが大助かりとゆーことなのです。

 /機械伯爵/