2011-12-08 5 views
4

lambdaの式はPythonです。私はラムダ式がどのようなものでも加算器のような関数を生成するが、実際の有用性はまだ見えない、多くの簡単な例(SEの例を含む)を見てきました。ラムダなしで同じコードの平和を書くのは苦痛になるかもしれないいくつかの例です。lambdaはPythonで非常に便利です。

ラムダ式を使用するテキスト処理に何かを表示できますか?ラムダ式を回避するのは難しいでしょうか?しかし、実用的なもの(数学的なゲームではない)。私は頻繁にそれらを使用

+0

今回は機能的な方法を自分の命令コードの一部に書き換えます。おそらくラムダがなぜ有用なのかは分かります;-) –

+2

リスト内包は厳密に言えばラムダの代替ではありません。それらは 'map'と' filter'関数の代わりになりました。確かに、ラムダは 'map'と' filter'でよく使われます。 – kindall

+0

「避けがたい」と言っている点は何ですか? Lambdaは、複数行の関数定義を1つの読みやすい行に置き換えることができる場合に便利です。 http://stackoverflow.com/questions/8363390/how-to-make-tkinter-message-expand-when-i-resize-the-window/8364895#8364895はラムダなしで書くのが「難しい」ではなかったでしょうが、確かにコンパクトで簡単です。 – Dave

答えて

5

を、別の関数として、すべてのラムダ式を書くことは苦痛だっただろう。

このコードは何を簡単にしていますか?カスタムExcelテーブルをカスタムデータベーステーブルの挿入ステートメントに変換します。エクセルテーブルフィールドとデータベースフィールドとの間にはマッピングがあり、エクセルテーブルフィールドとエクセルテーブル値に適用される関数との間のマッピングがデータベースに挿入される前にマッピングされています。実際には、すべてのフィールドに別々の関数を定義する必要はありません。

map_func = { 'ID' : lambda x : 'mig_farm_seq.nextval', 
      'ENTERPRISE_NAME' : wrap_str, 
      'TAX_NUMBER' : wrap_str, 
      'FAMILY_NAME' : lambda x : wrap_str(x.split()[0]), 
      'GIVEN_NAME' : lambda x : wrap_str(x.split()[1]), 
      'ENTERPRISE_REGISTRATION_NUMBER' : wrap_str, 
      'PREMISE_NAME' : wrap_str, 
      'HOUSE_ID' : wrap_str, 
      'POSTAL_CODE' : wrap_str, 
      'PHONE_NUMBER_1' : lambda x : wrap_str(get_phone_number(x, True)), 
      'PHONE_NUMBER_2' : lambda x : wrap_str(get_phone_number(x, False)), 
      'FAX_NUMBER' : lambda x : wrap_str(x.replace(' ', '')), 
      'BANK_IDENTIFIER' : lambda x : wrap_str(x.replace(' ', '').replace('-', '')[:3]), 
      'BANK_ACCOUNT_NUMBER' : lambda x : wrap_str(x.replace(' ', '').replace('-', '')), 
      'NUMBER_OF_EMPLOYEES' : wrap_null, 
      'SETTLEMENT_NUMBER' : wrap_null, 
      'REGISTRATION_NUMBER' : lambda x : insert_reg_number % x, 
      'GENDER' : wrap_str, 
      'ACTIVITY' : lambda x : '0', 
      'REG_HOLDER_ACTIVITY' : lambda x : '0', 
      'PROCESSED_BY_JOB' : lambda x : '0' 
     } 

ソース:代わりに、ここで何を示唆するhttp://pastebin.com/MxEPBMaZ

+0

私はこの同じデザインパターンを実際のコードで何度も使用してきました。良い例のため+1。 –

+1

@bpgergoこれは良い例です。私は受け入れを考えているが、約待つ。まだ1日です。 – xralf

+0

+1 - 良い例。私はまた、このパターン(またはそれに非常によく似たパターン)を何度も使用しました。 –

4

一つの場所:sortsorted機能のkey機能:

>>> person = lambda name, age: { "name": name, "age": age } 
>>> people = [ person("Joe", 61), person("Jane", 52) ] 
>>> people.sort(key=lambda person: person["age"]) 

これは、自分の年齢によって人々のリストをソートします。

私はラムダを使用して別の場所がre.subである:あなたは二つの項目を比較するか、他のいくつかの操作を実行するために、短い機能を必要とするとき、彼らは有用であり、これは、引数として渡されます

>>> re.sub("0x([0-9a-f]+)", lambda match: "0x" + match.group(1).upper(), "0xfa") 
'0xFA' 
+3

ソートソートキーの場合、 'operator。* getter()'を使用すると、より明確な/より速い/より短い/より良いことがよくあります。これは 'people.sort(key = operator.itemgetter(" age "))'で置き換えることができます。 –

+1

はい、単純なケースでは、 'operator'モジュールを使用することは可能です。しかし、IMOではラムダを使用することが妥当であり、' operator'が不十分な場合があります(ex –

0

、そしてそこ関数が引数としてのみ使用されるため、関数に名前を付ける必要はありません。

ラムダとして書かれた関数が、通常は名前をつけるのに使用するdef行と、最後に使用するreturn行よりも短い場合に便利です。

関数を部分的に適用したい場合、つまり、別の場所に渡す必要のある関数があり、渡された関数の引数の一部またはすべてを実際に呼び出さずに渡したい場合に便利です。 Lamddaでは、必要なバリエーションごとに個別の関数を定義して名前を付けずに、これを行うことができます。

+0

これは私がすでに知っていることですが、ラムダを示す何かをするいくつかの例があります(例:名前、名前): 'people.sort(key = lambda p:p [" last_name "]、p [" first_name "])私が求めているのは不可欠です。そして、この例は何か役に立つだけのものでなければなりません(数学的な遊びではない) – xralf

+2

彼らは必須ではなく、単なる関数であり、ラムダなしで終日関数を書くことができます。 – kindall

+0

多分 '必須 'は強い言葉ですが、私は「ラムダ式なしではこれはひどいことになるでしょう」という例はまだ見ていません。 – xralf

0

私のDjangoのプロジェクトのすべてが、2列(settings.py)が含ま:この場合

DIRNAME = os.path.dirname(__file__) 
_rel = lambda x: os.path.join(DIRNAME, x) 
2

私はlambdaのためにPythonインストールとgrepのlibディレクトリを訪問することをお勧めします。あなたはあなたの食欲を満たすのに十分な例を得るでしょう。

+0

非常に良い提案です。これに私は次のように追加します: "ラムダ構造体を使ってコードを書き換えて、それらを使わないコードにしてみて、2つのバージョンを比較してみてください。おそらく、これはラムダの有用性(または無用)をケース「ケース・バイ・ベース」である。 –

+0

@Abhijitもっと具体的にしてください。多くのファイルにはラムダがなく、ほんのわずかしかありません。 – xralf

0

彼らは実際に便利だワンケース:

はあなたが他のスロット(方法)に信号を接続することができますPyQtはを、使用していると言います。時々、関数を書くのではなく、むしろ特定のアクションを実行する必要があるので、必要なのは使い捨ての関数だけです。もちろん

obj.signal.connect(lambda: doFoo(bar)) 

、それはと対比される..

def doBoo(): 
    return doFoo(bar) 
obj.signal.connect(doBoo) 

よりクリーン元の道を。

1

テキスト処理について質問したので、thisの例をご覧ください(また、this oneも同様です)。

クローズはオブジェクトよりも扱いが容易です(環境は暗黙にキャプチャされるため)が、OOPの観点から考えるとそれほど明白ではありません。少なくとも1つのまともな関数型言語(Pythonのlambdaはあまりにも制限されている)を学ぶことをお勧めします。この方法で、Pythonのような言語でこれらの手法を効率的に適用する方法を理解できます。

関連する問題