質問

はmap()繰り返し処理を実行して、リストのように"、"かなある価値地図の利用対す。

その場合、現在の私のコードは以下のようなものです:

for item in items:
    item.my_func()

このままの意味では、いまの地図().そんなことが可能なのでしょうか?何は一例ですか?

役に立ちましたか?

解決

を使用できる map の代わりに for ループまで下がらない、結果 item.my_func(), この 推奨されません. map そのためには何をしなければなお多くの方にご利用頂いていな副作用の全ての要素をリストアップしました。その他のすべての状況を使用し、明確なためループを実行します。

また、Python3.0 map を返す発見られるので、そういった場合 map な動作と同じ場合を除く明示的に評価すべての要素によって返される発電機などを呼び出し list めくりと操作上の違いがござい.


編集: kibibu 求めるコメントのための明確化がなぜ map最初の引数にするべきではない機能です。したいと思います。にとっても、その問いに答えるには、ショット:

map ることでした機能 f のである、という数学的意味.そんな二重サッシで遮音性抜群で日当ために f の要素を第二引数として、 返される を確性と客観性を保証するために、コースを受講した。より重要なのは、このような状況の下 map(g, map(f, l)) は意味的に同等 map(lambda x: g(f(x)), l), にかかわらずる fg に適用され、それぞれの入力.

E.g.) なるかどうか map を返しますと、反復子は完全なリストです。ただし、 f および/または g 副作用を引き起こすと、この同等性が保証された場合に意味の map(g, map(f, l)) はるあらゆる段階 g が適用され n 要素が返される map(f, l)map(f, l) 適用 f(n+1)stの要素 l.(意味する map を行う必要があlaziest可能で繰り返し---ではPython3はPython2!)

ろうとか、さらに一歩進ん:場合も想定しているPython3の実施 map, の意味の同値が簡単に壊れる場合は、出力の map(f, l) は、例えば通 itertools.tee 前に提供される外側の map ます。

以上の議論でもいい、その理論的自然としてプログラムはより複雑になってくることが、このため、硬めのデバッグ.確保するかという不変量を軽減する問題は幾分とする可能性があるという予防プログラムのバグ修正

最後に、 map を思わせ多くの人々の真の機能局に対し、様々な(純粋)機能。広い範囲にわたって"機能"との副作用は混同を含みます。そのため、見として、明示的なループ)ではなく実施上の呼び出し map, であることを推奨一の使用制限 map その場合に適用されない原因です。

他のヒント

次のようにマップを使用してこれを書くことができます。

map(cls.my_func, items)

cls を、反復処理している項目のクラスに置き換えます。

Stephan202 が述べたように、これは 推奨されません この場合。

原則として、リスト内の各項目に何らかの関数を適用して新しいリストを作成する場合は、map を使用します。これは、関数には副作用がないため、(潜在的に) マップを並列実行できるという暗黙の意味を持ちます。

新しいリストを作成したくない場合、または関数に副作用がある場合は、for ループを使用します。これがあなたの例の場合です。

おそらく、Python言語仕様に閉じているわずかなセマンティック違い、があります。 のマップが唯一の特殊な状況でのためながら、明示的並列化です。コードはのためにのからを破るが、唯一の例外を除いて脱出することができます。のマップ

私の意見では、のマップのものためのの必要がありますが関数適用の順序を保証するべきではありません。私の知る限り何のPython実装は、現在、この自動並列化を行うことができません。

あなたがする必要がある場合は、

あなたは、いくつかのクールなネジ付きORマルチプロセッシングまたは分散コンピューティングフレームワークにあなたのmapを切り替えることができます。 ディスコには、分散、障害に対して耐性アーラン・アンド・パイソンベースのフレームワークの一例です。私は、8つのコアの2箱の上に構成された、今私のプログラムは、しかし、私はリスト内包からの私のプログラムを書き換える必要があった、ディスコクラスタへのより速い16回、感謝を実行し、ループがマップする/減らすます。

これは、ループやリストの内包のために使用してプログラムを書いて、マップ/軽減するために、同じ契約ですが、あなたはそれがクラスタ上で実行する必要があるときは、マップ/削減を使用した場合、あなたは自由のためにほとんどそれを行うことができます。あなたがしなかった場合は、さて、あなたはリライトする必要があります。

注意してください:私の知る限り、Pythonの2.xのではなく、マップからイテレータのリストを返します。私は(ただし、それを使ったことがない)、これはiter.imap()を使用してバイパスすることができると聞きました。

あなたは結果のリストを返す必要がない場合(例えば、副作用を持つ関数を)

forループの明示的に使用します。

あなたが(例えば、入力に直接基づいて値を返す関数)バック結果のリストが必要ですときリストの内包を使用します。

あなたはPythonが使用する価値があることをLispのユーザーを説得しようとしているとき、

マップを()を使用します。 ;)

あなたは、リスト内のすべての要素のいくつかの計算結果を取得したいとき

mapの主な利点はあります。たとえば、このスニペットは、リスト内のすべての値を倍増ます:

map(lambda x: x * 2, [1,2,3,4])  #=> [2, 4, 6, 8]

mapの結果と新しいリストを返すことに注意することが重要です。これは、所定の位置に元のリストは変更されません。

forと同じことを行うには、空のリストを作成し、新しいリストへの各計算の結果を追加するfor体に余分な行を追加する必要があります。 mapバージョンより簡潔かつ機能的です。

地図は時々速く組み込み関数のために手動でループをコードするよりもすることができます。タイミング試みるマップ(STR、範囲(1000000))対forループ同様の

map(lambda item: item.my_func(), items)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top