6

results はネストされたリストで、次のようになります。

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

pr は関数であり、次のような定義があります。

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

結果に対する通常の反復は、次のように動作します。

>>> 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 を使用した暗黙的な反復では、次の動作が発生します。

>>> 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]

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

4

3 に答える 3

6

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

>>> _ = map(pr, results)

ただし、結果リストの作成 (少なくとも Python 2 では) にはある程度の影響があるため、結果が必要ない場合はmap、この場合は使用しない方がよいことに注意してください。

于 2013-05-25T14:32:04.660 に答える
5

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

これを変数に割り当てると、これがより明確にわかります。

>>> 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この結果を気にしないときに使用すると、一般的にコードが読みにくくなることに注意してください。副作用のためにそれを使用することはなおさらです。どちらの場合も、明示的なループを記述することをお勧めします。

于 2013-05-25T14:31:47.983 に答える
3

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

于 2013-05-25T14:31:40.000 に答える