353

filtermap、およびreducePython 2 で完全に機能します。以下に例を示します。

>>> def f(x):
        return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

>>> def cube(x):
        return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

>>> def add(x,y):
        return x+y
>>> reduce(add, range(1, 11))
55

しかし、Python 3 では、次の出力を受け取ります。

>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>

>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>

>>> reduce(add, range(1, 11))
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    reduce(add, range(1, 11))
NameError: name 'reduce' is not defined

誰かがこれがなぜなのかを説明していただければ幸いです。

さらに明確にするためのコードのスクリーンショット:

Python 2 と 3 の IDLE セッションを並べて表示

4

8 に答える 8

376

What's New In Python 3.0で変更について読むことができます。多くの変更が加えられているため、2.x から 3.x に移行するときは、この文書をよくお読みください。

ここでの回答全体は、ドキュメントからの引用です。

リストの代わりにビューとイテレータ

一部の有名な API はリストを返さなくなりました。

  • [...]
  • map()そしてfilter()イテレータを返します。リストが本当に必要な場合は、簡単な修正として例list(map(...))を挙げますが、リスト内包表記 (特に元のコードでラムダを使用する場合) を使用するか、リストをまったく必要としないようにコードを書き直すことをお勧めします。map()関数の副作用については、特に注意が必要です。正しい変換は、通常のforループを使用することです (リストを作成すると無駄になるため)。
  • [...]

ビルトイン

  • [...]
  • 削除されreduce()ました。functools.reduce()本当に必要な場合に使用してください。ただし、99% の場合、明示的なforループの方が読みやすくなります。
  • [...]
于 2012-11-30T04:22:03.457 に答える
98

mapとの機能はfilterイテレータを返すように意図的に変更され、reduce は組み込みから削除されて に配置されましたfunctools.reduce

そのため、 forfilterと をmapでラップして、list()以前と同じように結果を確認できます。

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> list(filter(f, range(2, 25)))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x): return x*x*x
...
>>> list(map(cube, range(1, 11)))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> import functools
>>> def add(x,y): return x+y
...
>>> functools.reduce(add, range(1, 11))
55
>>>

現在推奨されているのは、マップとフィルターの使用をジェネレータ式またはリスト内包表記に置き換えることです。例:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> [i for i in range(2, 25) if f(i)]
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x): return x*x*x
...
>>> [cube(i) for i in range(1, 11)]
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>>

for ループは reduce よりも 99% 読みやすいと言われていますが、私はそのままfunctools.reduce.

編集: 99 パーセントの数字は、Guido van Rossum が作成したPython 3.0 の新機能ページから直接引用されています。

于 2012-11-30T04:17:44.600 に答える