964

Pythonラムダを理解しようとしています。lambda実生活で忘れてはならない「おもしろい」言葉のひとつですか?

それが必要になるかもしれないいくつかのエッジケースがあると確信していますが、それが曖昧であることを考えると、将来のリリースで再定義される可能性(さまざまな定義に基づく私の仮定)とコーディングの明確さの低下-避けられますか?

これは、C型のオーバーフロー(バッファオーバーフロー)を思い出させます-最上位の変数を指し、他のフィールド値を設定するためにオーバーロードします。それは一種の技術的なショーマンシップのように感じますが、メンテナンスコーダーの悪夢です。

4

26 に答える 26

1046

ラムダ式について話しているのですか?好き

lambda x: x**2 + 2*x - 5

それらは実際には非常に便利です。Pythonは、関数型プログラミングと呼ばれるプログラミングのスタイルをサポートしています。関数型プログラミングでは、関数を他の関数に渡して処理を行うことができます。例:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

に設定mult3[3, 6, 9]ます。元のリストの3の倍数である要素。これは、

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

もちろん、この特定のケースでは、リスト内包と同じことを行うことができます。

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(またはrange(3,10,3))ですが、リスト内包表記を使用できない、より洗練されたユースケースが他にもたくさんあり、ラムダ関数が何かを書き出すための最短の方法である可能性があります。

  • 別の関数から関数を返す

      >>> def transform(n):
      ...     return lambda x: x + n
      ...
      >>> f = transform(3)
      >>> f(4)
      7
    

    これは、Pythonのデコレータなどの関数ラッパーを作成するためによく使用されます。

  • 反復可能なシーケンスの要素をreduce()

      >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
      '1, 2, 3, 4, 5, 6, 7, 8, 9'
    
  • 代替キーによる並べ替え

      >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
      [5, 4, 6, 3, 7, 2, 8, 1, 9]
    

私は定期的にラムダ関数を使用しています。それらに慣れるのに少し時間がかかりましたが、やがてそれらが言語の非常に貴重な部分であることがわかりました。

于 2009-05-20T20:52:10.930 に答える
393

lambdaただの空想的な言い方ですfunction。その名前以外に、それについて曖昧、威圧的、または不可解なものは何もありません。次の行を読むときは、頭の中で次のように置き換えlambdafunctionください。

>>> f = lambda x: x + 1
>>> f(3)
4

の関数を定義するだけですx。のような他のいくつかの言語は、Rそれを明示的に言います:

> f = function(x) { x + 1 }
> f(3)
4

分かりますか?これは、プログラミングで行う最も自然なことの1つです。

于 2010-01-16T15:03:17.950 に答える
110

2行の要約:

  1. 閉鎖:非常に便利です。それらを学び、それらを使用し、それらを愛しなさい。
  2. Pythonのlambdaキーワード:不要、場合によっては便利。リモートで複雑なことをしていることに気付いた場合は、それを片付けて実際の関数を定義してください。
于 2009-05-20T22:37:58.050 に答える
73

ラムダは、高階関数を処理する非常に重要な抽象化メカニズムの一部です。その価値を正しく理解するには、AbelsonとSussmanによる質の高いレッスンを見て、 SICPという本を読んでください。

これらは現代のソフトウェアビジネスに関連する問題であり、ますます人気が高まっています。

于 2009-05-20T20:49:01.437 に答える
62

ラムダがなくなるとは思えません。最終的にそれを削除しようとすることをあきらめることについてのGuidoの投稿を参照してください。競合の概要も参照してください。

Pythonの機能機能の背後にある取引の詳細については、この投稿をチェックしてください:http: //python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

不思議なことに、ラムダ関数やその他の関数機能の導入の動機となったmap、filter、reduce関数は、リスト内包表記やジェネレーター式に大幅に取って代わられています。実際、reduce関数はPython3.0の組み込み関数のリストから削除されました。(ただし、ラムダ、マップ、またはフィルターの削除に関する苦情を送信する必要はありません。それらはそのままです。:-)

私自身の2セント:明快さに関しては、ラムダがそれだけの価値があることはめったにありません。一般的に、ラムダを含まないより明確な解決策があります。

于 2009-05-20T20:46:27.790 に答える
61

ラムダはGUIプログラミングで非常に役立ちます。たとえば、ボタンのグループを作成していて、ボタンごとに一意のコールバックではなく、単一のパラメータ化されたコールバックを使用したいとします。Lambdaを使用すると、これを簡単に実行できます。

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()

(注:この質問は具体的に質問していますが、 functools.partiallambdaを使用して同じタイプの結果を取得することもできます)

別の方法は、ボタンごとに個別のコールバックを作成することです。これにより、コードが重複する可能性があります。

于 2011-04-24T16:48:11.790 に答える
39

Pythonでは、lambda関数をインラインで定義する方法にすぎません。

a = lambda x: x + 1
print a(1)

と..

def a(x): return x + 1
print a(1)

..まったく同じです。

通常の関数ではできないラムダでできることは何もありません。Pythonでは、関数は他のものと同じようにオブジェクトであり、ラムダは単に関数を定義します。

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

正直なところ、このlambdaキーワードはPythonでは冗長だと思います。キーワードを使用する必要はありませんでした(または、通常の関数、リスト内包表記、または多くの組み込み関数の1つを代わりに使用した方がよい場合に使用されたものを見たことがあります)。

完全にランダムな例として、「Pythonのラムダが壊れています!」という記事から。

ラムダがどのように壊れているかを確認するには、関数のリストを生成してみてfs=[f0,...,f9]くださいfi(n)=i+n。最初の試み:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

それがうまくいったとしても、それは恐ろしく「非Python的」であり、同じ機能を他の無数の方法で書くことができると私は主張します。たとえば、次のようになります。

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

はい、同じではありませんが、リストにラムダ関数のグループを生成する必要がある原因は見たことがありません。他の言語では意味があるかもしれませんが、PythonはHaskell(またはLisp、または...)ではありません

ラムダを使用しても、この方法で目的の結果を達成できることに注意してください。

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

編集:

ラムダが役立つ場合がいくつかあります。たとえば、次のように、PyQtアプリケーションで信号を接続するときに便利なことがよくあります。

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

実行するだけで、追加の引数を指定しw.textChanged.connect(dothing)てメソッドが呼び出され、エラーが発生します。ラムダを使用すると、ラッピング関数を定義しなくても引数をきちんと削除できます。dothingevent

于 2009-05-21T02:03:55.543 に答える
35

ラムダは、同じことを実行する関数のリストに役立ちますが、状況は異なります。

Mozillaの複数形のように:

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

あなたがそれらすべてのために関数を定義しなければならないなら、あなたはそれの終わりまでに怒ってしまうでしょう。また、、などの
関数名ではうまくいきません。また、可変関数IDに依存している場合は、これが必要になります。plural_rule_1plural_rule_2eval()

于 2010-01-16T15:43:04.210 に答える
26

lambda名前付き関数またはリスト式とジェネレーター式のいずれかを使用すると、できることのほとんどすべてをうまく行うことができます。

したがって、ほとんどの場合、基本的にすべての状況でそれらの1つだけを使用する必要があります(インタラクティブインタープリターで記述されたスクラッチコードを除く)。

于 2009-05-20T20:45:27.357 に答える
19

私はPythonを数年間使用していますが、ラムダが必要な場合に遭遇したことはありません。本当に、チュートリアルが述べているように、それは単に構文糖衣のためです。

于 2009-05-20T20:47:48.567 に答える
17

Pythonのラムダの特定の実装について話すことはできませんが、一般的にラムダ関数は本当に便利です。これらは関数型プログラミングのコアテクニック(おそらくTHEテクニック)であり、オブジェクト指向プログラムでも非常に役立ちます。特定の種類の問題については、それらが最善の解決策であるため、忘れてはなりません。

クロージャmap関数(Pythonドキュメントにリンクしていますが、関数構造をサポートするほぼすべての言語に存在します)を読んで、なぜそれが役立つのかを確認することをお勧めします。

于 2009-05-20T20:45:12.193 に答える
17

ラムダ関数は、関数を作成するための非官僚的な方法です。

それでおしまい。たとえば、メイン関数があり、値を2乗する必要があるとします。これを行うための従来の方法とラムダの方法を見てみましょう。

従来の方法:

def main():
...
...
y = square(some_number)
...
return something

def square(x):
    return x**2

ラムダの方法:

def main():
...
square = lambda x: x**2
y = square(some_number)
return something

違いを見ます?

Lambda関数は、リスト内包表記やマップなどのリストと非常によく合います。実際、リスト内包表記は、ラムダを使用して自分自身を表現するための「Pythonic」な方法です。元:

>>>a = [1,2,3,4]
>>>[x**2 for x in a]
[1,4,9,16]

構文の各要素の意味を見てみましょう。

[]:「リストをください」

x ** 2:「この生まれたばかりの関数を使用する」

aのxの場合:「aの各要素に」

便利ですね このような関数を作成します。ラムダを使用して書き直してみましょう:

>>> square = lambda x: x**2
>>> [square(s) for x in a]
[1,4,9,16]

次に、マップを使用しましょう。これは同じですが、言語に依存しません。マップは2つの引数を取ります:

(i)1つの機能

(ii)反復可能

そして、各要素がiterableの各要素に適用される関数であるリストを提供します。

したがって、マップを使用すると、次のようになります。

>>> a = [1,2,3,4]
>>> squared_list = map(lambda x: x**2, a)

ラムダとマッピングをマスターすると、データを簡潔に操作するための優れた能力が得られます。Lambda関数は、あいまいでも、コードの明確さを損なうものでもありません。何か難しいことと新しいことを混同しないでください。それらを使い始めると、それは非常に明確になります。

于 2013-10-11T03:03:51.060 に答える
13

lambda私の意見では、それについての良い点の1つは、値が必要になるまで単純なフォームの評価を延期する方法であるということです。説明させてください。

多くのライブラリルーチンは、特定のパラメータを呼び出し可能にするように実装されています(そのうちのラムダは1つです)。実際の値は、使用されるとき(呼び出されたときではなく)にのみ計算されるという考え方です。(考案された)例は、要点を説明するのに役立つかもしれません。指定されたタイムスタンプをログに記録するルーチンがあるとします。ルーチンで現在の時刻から30分を引いたものを使用する必要があります。あなたはそれをそのように呼ぶでしょう

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))

ここで、特定のイベントが発生したときにのみ実際の関数が呼び出され、その時点でのみタイムスタンプを計算するとします。あなたはそうすることができます

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))

がこのような呼び出し可能オブジェクトを処理できると仮定すると、log_timestamp必要なときにこれを評価し、その時点でタイムスタンプを取得します。

もちろん、これを行う別の方法(operatorたとえば、モジュールを使用)もありますが、要点を伝えたと思います。

更新:これはもう少し具体的な実世界の例です

アップデート2 :これはいわゆるサンクの例だと思います。

于 2010-01-16T15:30:05.100 に答える
11

上記のように、Pythonのラムダ演算子は無名関数を定義し、Pythonの関数はクロージャです。クロージャの概念を、それらの構文メタドンにすぎない演算子ラムダと混同しないことが重要です。

数年前にPythonを始めたとき、リスト内包表記とともに、ラムダがかっこいいと思ってラムダをよく使用しました。しかし、私はPythonで書かれた、数千のファンクションポイントのオーダーの大きなWebサイトを作成し、維持する必要があります。私は経験から、ラムダはプロトタイプを作成しても問題ないかもしれないことを学びましたが、いくつかのキーストロークを保存するかどうかを除いて、インライン関数(クロージャという名前)には何も提供しません。

基本的に、これはいくつかのポイントに要約されます。

  • 意味のある名前を使用して明示的に記述されたソフトウェアを読む方が簡単です。匿名のクロージャには名前がないため、定義上、意味のある名前を付けることはできません。この簡潔さは、何らかの理由でラムダパラメーターにも感染しているように見えるため、ラムダx:x+1のような例がよく見られます。
  • 名前付きクロージャは、参照する名前がある場合、名前で複数回参照できるため、再利用する方が簡単です。
  • 名前はトレースバックとエラーの前後に表示されるため、ラムダの代わりに名前付きクロージャを使用しているコードをデバッグする方が簡単です。

これは、それらを切り上げて名前付きクロージャに変換するのに十分な理由です。しかし、私は匿名の閉鎖に対して他に2つの恨みを抱いています。

最初の恨みは、それらが言語を乱雑にするもう1つの不要なキーワードであるということです。

2番目の恨みはより深く、パラダイムレベルです。つまり、ラムダ計算はチューリングではないため、関数型プログラミングスタイルはメッセージパッシング、オブジェクト指向、または手続き型スタイルよりも柔軟性が低いため、関数型プログラミングスタイルを促進するのは好きではありません。完全(Pythonでは幸運なことに、ラムダ内でもその制限から抜け出すことができます)。ラムダがこのスタイルを促進すると私が感じる理由は次のとおりです。

  • 暗黙のリターンがあります。つまり、関数である必要があるように見えます。

  • これらは、別の、より明示的で、より読みやすく、より再利用可能で、より一般的なメカニズムであるメソッドに代わる状態隠蔽メカニズムです。

私はラムダフリーのPythonを作成し、ラムダを一目で削除しようと懸命に努力しています。Pythonはラムダがなければ少し良い言語になると思いますが、それは私の意見です。

于 2010-10-18T18:01:05.913 に答える
11

ラムダは実際には関数型プログラミングのアイデアから生まれた非常に強力な構造であり、Pythonの近い将来に簡単に修正、再定義、または削除されることは決してありません。関数をパラメーターとして渡すことができるため、より強力なコードを作成するのに役立ちます。したがって、関数は第一級市民としての考え方になります。

ラムダは混乱する傾向がありますが、しっかりとした理解が得られたら、次のようなクリーンでエレガントなコードを記述できます。

squared = map(lambda x: x*x, [1, 2, 3, 4, 5])

上記のコード行は、リスト内の数値の2乗のリストを返します。もちろん、次のようにすることもできます。

def square(x):
    return x*x

squared = map(square, [1, 2, 3, 4, 5])

前者のコードの方が短いことは明らかです。これは、map関数(または関数をパラメーターとして受け取る同様の関数)を1か所でのみ使用する場合に特に当てはまります。これにより、コードがより直感的でエレガントになります。

また、@ David Zaslavskyが彼の回答で述べたように、リスト内包表記は、特にリストがいくつかのあいまいな数学的方法から値を取得する必要がある場合は、必ずしもうまくいくとは限りません。

より実用的な観点から、私にとってラムダの最大の利点の1つは、最近GUIとイベント駆動型プログラミングにあります。Tkinterのコールバックを見ると、それらが引数として取るのは、それらをトリガーしたイベントだけです。例えば

def define_bindings(widget):
    widget.bind("<Button-1>", do-something-cool)

def do-something-cool(event):
    #Your code to execute on the event trigger

では、渡す引数があったらどうなるでしょうか。マウスクリックの座標を格納するために2つの引数を渡すのと同じくらい簡単なもの。あなたはこのように簡単にそれを行うことができます:

def main():
    # define widgets and other imp stuff
    x, y = None, None
    widget.bind("<Button-1>", lambda event: do-something-cool(x, y))

def do-something-cool(event, x, y):
    x = event.x
    y = event.y
    #Do other cool stuff

これはグローバル変数を使用して実行できると主張できますが、特にグローバル変数が特定の場所でのみ使用される場合は、メモリ管理とリークについて心配して頭を悩ませたいですか?それはただ貧弱なプログラミングスタイルでしょう。

要するに、ラムダは素晴らしく、過小評価されるべきではありません。PythonラムダはLISPラムダと同じではありませんが(より強力です)、Pythonラムダを使用して実際に多くの魔法のようなことを行うことができます。

于 2013-05-24T13:02:56.363 に答える
8

ラムダは、一般的に関数型プログラミングスタイルと深く関連しています。一部のデータに関数を適用し、結果をマージすることで問題を解決できるという考えは、Googleがほとんどのアルゴリズムを実装するために使用するものです。

関数型プログラミングスタイルで記述されたプログラムは、簡単に並列化できるため、最新のマルチコアマシンではますます重要になっています。つまり、NOあなたはそれらを忘れてはなりません。

于 2009-05-20T20:46:37.883 に答える
7

ラムダを理解することができた最初のおめでとうございます。私の意見では、これは非常に強力な構成要素です。関数型プログラミング言語への最近の傾向は、それが避けられるべきではなく、近い将来再定義されることもないことを確かに示しています。

あなたは少し違うことを考える必要があります。きっとあなたはすぐにそれを気に入るはずです。ただし、Pythonのみを扱う場合は注意が必要です。ラムダは実際のクロージャーではないため、何らかの形で「壊れています」:pythonsラムダが壊れています

于 2009-05-20T20:47:05.760 に答える
6

私はPythonを始めたばかりで、最初にLambdaに頭を悩ませました-それは私が理解するのに時間がかかりました。

これは何の非難でもないことに注意してください。誰もが簡単に来ないものの異なるセットを持っています。

ラムダは、実生活で忘れられるべき「興味深い」言語アイテムの1つですか?

いいえ。

それが必要になるかもしれないいくつかのエッジケースがあると確信していますが、それのあいまいさを考えると、

あいまいではありません。私が取り組んできた過去2チームは、誰もがこの機能を常に使用していました。

将来のリリースで再定義される可能性(さまざまな定義に基づく私の仮定)

数年前にクロージャーのセマンティクスを修正する以外に、Pythonでそれを再定義するという真剣な提案は見たことがありません。

コーディングの明確さの低下-避けるべきですか?

あなたがそれを正しく使っているかどうかは、それほど明確ではありません。それどころか、利用可能な言語構造を増やすと、明確さが増します。

これは、C型のオーバーフロー(バッファオーバーフロー)を思い出させます-最上位の変数を指し、他のフィールド値を設定するためにオーバーロードします...一種の技術的なショーマンシップですが、メンテナンスコーダーの悪夢です。

ラムダはバッファオーバーフローのようなものですか?わお。「メンテナンスの悪夢」だと思ったら、ラムダをどのように使用しているのか想像できません。

于 2009-05-20T20:57:23.337 に答える
6

コードの重複を避けるためにラムダを使用しています。これにより、関数が簡単に理解できるようになります。例:

def a_func()
  ...
  if some_conditon:
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)
  else
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)

私はそれを一時ラムダに置き換えます

def a_func()
  ...
  call_big_f = lambda args_that_change: call_some_big_func(arg1, arg2, arg3, args_that_change)
  if some_conditon:
     ...
     call_big_f(argX)
  else
     ...
     call_big_f(argY)
于 2013-10-09T00:29:45.483 に答える
5

私は今日、DavidMertzの本「Pythonでのテキスト処理」を読み始めました。彼は最初の章のラムダの例のかなり簡潔な説明を付録Aの説明と組み合わせて持っていますが、それらを私のために(ついに)ページから飛び出させました、そして突然私はそれらの価値を理解しました。それは彼の説明があなたのために働くということではありません、そして私はまだ発見段階にあるので、私は以下以外のこれらの応答に追加しようとはしません:私はPythonに不慣れです私はOOPに不慣れですラムダスは私にとって苦労しましたMertzを読んだ今、私​​はそれらを手に入れ、プログラミングへのよりクリーンなアプローチを可能にすると思うのと同じくらい非常に役立つと思います。

彼はPythonのZenを再現しており、その1行は複雑よりも単純です。ラムダを使用してコードを読み取る非OOPプログラマーとして(そして先週までリスト内包表記)、私は考えました-これは簡単ですか?。私はついに今日、これらの機能によってコードが他の方法よりもはるかに読みやすく、理解しやすくなることに気づきました。これは常にある種のループです。また、財務諸表のように、Pythonは初心者ユーザー向けではなく、教育を受けたいユーザー向けに設計されていることにも気づきました。この言語がどれほど強力か信じられません。それが(ついに)ラムダの目的と価値に気づいたとき、私は約30のプログラムをリッピングし、必要に応じてラムダを最初からやり直したいと思いました。

于 2009-05-21T01:08:31.070 に答える
5

私が実際にラムダを真剣に必要とした例をあげることができます。私はグラフィカルプログラムを作成しています。このプログラムでは、ファイルを右クリックして、3つのオプションのいずれかを割り当てます。Tkinter(私がこれを書いているGUIインターフェースプログラム)では、誰かがボタンを押すと、引数を受け取るコマンドに割り当てることができないことがわかりました。したがって、オプションの1つを選択し、選択した結果を次のようにしたい場合:

print 'hi there'

それなら大したことはありません。しかし、特定の詳細を選択する必要がある場合はどうなりますか。たとえば、選択肢Aを選択した場合、選択肢A、B、またはCに依存する引数を受け取る関数を呼び出しますが、TKinterはこれをサポートできませんでした。ラムダはこれを実際に回避する唯一のオプションでした...

于 2011-07-13T23:05:09.110 に答える
5

ラムダを使用するための便利なケースは、長いリスト内包の可読性を向上させることです。この例loop_dicではわかりやすくするために短いですが、loop_dic非常に長いことを想像してください。iその値のラムダバージョンの代わりにを含むプレーンな値を使用する場合は、を取得しNameErrorます。

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> loop_dic = lambda i: {"name": i["name"] + " Wallace" }
>>> new_lis = [loop_dic(i) for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

それ以外の

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> new_lis = [{"name": i["name"] + " Wallace"} for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]
于 2012-11-03T12:25:57.467 に答える
4

主にnullオブジェクトとして、またはパラメーターを関数に部分的にバインドするために、これを頻繁に使用します。

次に例を示します。

nullオブジェクトパターンを実装するには:

{
    DATA_PACKET: self.handle_data_packets
    NET_PACKET: self.handle_hardware_packets
}.get(packet_type, lambda x : None)(payload)

パラメータバインディングの場合:

私は次のAPIを持っているとしましょう

def dump_hex(file, var)
    # some code
    pass

class X(object):
    #...
    def packet_received(data):
        # some kind of preprocessing
        self.callback(data)
    #...

次に、受信したデータをファイルにすばやくダンプしたくない場合は、次のようにします。

dump_file = file('hex_dump.txt','w')
X.callback = lambda (x): dump_hex(dump_file, x)
...
dump_file.close()
于 2009-05-20T21:20:18.267 に答える
4

lambdaパラメータを含むコールバックを作成するために使用します。同じ機能を実行するメソッドを作成するよりも、ラムダを1行で作成する方がクリーンです。

例えば:

import imported.module

def func():
    return lambda: imported.module.method("foo", "bar")

とは対照的に:

import imported.module

def func():
    def cb():
        return imported.module.method("foo", "bar")
    return cb
于 2014-01-03T18:31:54.767 に答える
4

私はPythonの初心者なので、ラムダの明確なアイデアを得るために、それを「for」ループと比較しました。効率の面で。これがコードです(python 2.7)-

import time
start = time.time() # Measure the time taken for execution

def first():
    squares = map(lambda x: x**2, range(10))
    # ^ Lambda
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0 seconds

def second():
    lst = []
    for i in range(10):
        lst.append(i**2)
    # ^ a 'for' loop
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0019998550415 seconds.

print abs(second() - first()) # Gives 0.0019998550415 seconds!(duh)
于 2014-02-06T18:43:36.967 に答える
2

Lambdaはプロシージャコンストラクターです。Pythonのラムダはそれほど強力ではありませんが、実行時にプログラムを合成できます。そのようなプログラミングを理解している人はほとんどいないことに注意してください。

于 2009-05-20T20:52:40.960 に答える