2013-05-25 23 views
6

結果は、ネストされたリストで、次のようになります。結果のPythonのマップ機能反復

>>> def pr(line): 
...  print line 

通常の反復がこのように振る舞うことを行います。

>>> results 
[[1, 2, 3, 'a', 'b'], [1, 2, 3, 'c', 'd'], [4, 5, 6, 'a', 'b'], [4, 5, 6, 'c', 'd']] 

PRは、このような定義では、関数であります:マップと

>>> for result in results: 
...  pr(result) 
... 
[1, 2, 3, 'a', 'b'] 
[1, 2, 3, 'c', 'd'] 
[4, 5, 6, 'a', 'b'] 
[4, 5, 6, 'c', 'd'] 

しかし、暗黙的な反復、この行動の結果:

>>> map(pr, results) 
[1, 2, 3, 'a', 'b'] 
[1, 2, 3, 'c', 'd'] 
[4, 5, 6, 'a', 'b'] 
[4, 5, 6, 'c', 'd'] 
[None, None, None, None] 

私の質問:なぜマップ関数が追加の反復を生成するのですか?

+0

'map'は関数型プログラミング言語から来ますhttp://en.wikipedia.org/wiki/Map_%28higher-order_function%29このように使用されることはありません – jamylak

+2

@jamylak:prはこれのデモ関数です質問、私は自分のコードで他の変換を適用していた。 –

答えて

6

mapは、iterableの各要素に関数を適用し、その結果をリスト(またはPython 3のマップオブジェクト)に戻して格納します。したがって、[None, None, None, None]の部分はマップ関数の戻り値です。あなたがスクリプトを実行するときは、これを表示されませんが、あなたはまた、単に値に割り当てることによってIDLEにそれを取り除くことができます。

>>> _ = map(pr, results) 

注しかし、少なくとも、結果リスト(の建設ということPython 2では)いくつかの影響がありますので、結果が必要ない場合は、この場合はmapを使用しないほうが良いでしょう。

3

[None, None, None, None]は、mapの呼び出しの結果で、これはPythonインタプリタコンソールに自動的に表示されます。

6

mapでPython 2は、あなたが渡した関数のすべての戻り値で構築されたリストを返します。 pr関数はNoneを返します(暗黙のうちに、最後から落ちる)。したがって、mapの結果は、あなたが渡したiterableの各オブジェクトに1つずつ、Noneで埋められたリストになります。これは、対話型インタプリタによって自動的に出力されます。これは、変数に割り当てられていないためですあなたが見ているライン。

あなたは変数に割り当てないときより明確にこれを見ることができます:

>>> a = map(pr, results) 
[1, 2, 3, 'a', 'b'] 
[1, 2, 3, 'c', 'd'] 
[4, 5, 6, 'a', 'b'] 
[4, 5, 6, 'c', 'd'] 
>>> a 
[None, None, None, None] 

は、あなたがこの結果を気にしないときmapを使用することが一般的に読み、あなたのコードは難しくwlilことに注意してください。副作用のためにそれを使用することは、それ以上です。どちらの場合も、明示的なループを記述することが望ましいです。

関連する問題