2012-03-23 13 views
2

私は唯一の違いは速度とあなたが定義する方法で少しトリッキーでなければならないと言うことができる限りラムダ関数。例えばpythonでmap(func、list)と[func(x)in listのxの違いは何ですか]

map(lambda x: x + 1, range(4)) == [(lambda x: x + 1)(y) for y in range(4)] 

第二の方法は、より多くのニシキヘビであるようにそれは私には思われるが、私はなぜわかりません。

EDIT:

はい、私は、ラムダは第二の例では除外されることを理解し、私は可能な限り同等のコードとして表示しようとしていました。

+1

を参照してください:

もう一つの違いは、mapのでに対してマッピングするための複数のシーケンスを取ることができるということです、とマッピング関数に位置パラメータとして渡し、一つはリスト内包で必要とされるであろうビュンを回避することができますhttp://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map – ladaghini

答えて

6

これを行うための正しい方法はこちらlambda機能を構築する

[y + 1 for y in range(4)] 

ませ必要とされないだろう。あなたのコードは、リストの理解のすべての反復で新しい関数オブジェクトを不必要に構築します。

つまり、map()への呼び出しは、同等のリストの理解として書くことができます。 map()の最初の引数がlambda関数である場合、通常はリストの理解が優先されます。 map()の最初の引数が関数名である場合、両方の変種は問題ありません。他の人が

[str(x) for x in my_list] 
+0

いくつかの条件文を追加すると、マップにはラムダが必要でしょうか? '' y> 2の場合は範囲​​内のyのためのy + 1 ' – jdi

+0

@jdi: 'map()'の呼び出しは、この場合に常に 'lambda'関数を必要としますか? (あなたが 'map(1 .__ add__、range(4))'のような難読化されたコードにならない限り)。 –

+0

@SvenMarnachそれは構文的には有効ではない(あなたは括弧が必要です)。それを表現する良い方法。 – Marcin

3

を好む(私を含め)何人かの人々を好む、と言う、

map(str, my_list) 

そこには違いはありませんが、ニシキヘビの方法は、完全にラムダを省略して次のようになります。

[y + 1 for y in range(4)] 

マッピング関数がPython関数またはラムダではなく、 "ビルトイン"(C言語で書かれた)関数である場合は、mapが高速になることにも注意してください。

別のニシキヘビが、珍しく、道(不要なラムダを避ける)は次のようになります。

map(1 .__add__, range(4)) # thanks to SvenMarnach for this 

リストの内包は、常に、より効率的で、より明確になりますので、マッピングフォームでラムダを避けるために、通常は望ましいです。対照的に、複数行関数を使用することは完全に受け入れられます。インラインで記述する方法はなく、可能であってもそれほど明確ではない可能性があります。

[x+y for x,y in zip(range(4), range(2,6))] 
#vs 
from operator import add 
map(add, range(4), range(2,6)) 
+0

副題として、Python 3のマップはリストではなくイテレータを作成します。あなたが言語を使って前進するにつれて、それに注意してください。 – Bryce

+0

* "' 'map'は場合によっては微視的に速いかもしれません(目的のためにラムダを作っていないが、mapとlistcompで同じ関数を使うとき)。 ] "* - from here [here](http://stackoverflow.com/a/1247490/1132524) –

+0

@RikPoggi Trueですが、組み込み関数の場合のみです。 Pythonの関数はすべて同じパフォーマンスヒットを受けます。 – Marcin

関連する問題