filter
、map
、およびreduce
はPython 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 3.0の新機能 を参照してください。たくさん変更されているので、2.xから3.xに移動するときは、それをよく読んでください。
ここに全体の答えはドキュメントからの引用です。
いくつかの有名なAPIはもはやリストを返しません:
- [...]
reduce()
を削除しました。本当に必要な場合はfunctools.reduce()
を使用してください。しかし、99パーセントの明示的なfor
ループは読みやすくなっています。- [...]
map
とfilter
の機能はイテレータを返すように意図的に変更され、reduceは組み込みから削除されてfunctools.reduce
に配置されました。
そのため、filter
と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
>>>
推奨事項は、map and filterの使用法を生成式またはリスト内包表記に置き換えることです。例:
>>> 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の新機能 から直接引用されています。
他の答えの補足として、これはコンテキストマネージャがこれらの関数の名前をリストを返し、グローバル名前空間にreduce
を導入するものに再マップするような細かいユースケースのようです。
簡単な実装は次のようになります。
from contextlib import contextmanager
@contextmanager
def noiters(*funcs):
if not funcs:
funcs = [map, filter, Zip] # etc
from functools import reduce
globals()[reduce.__name__] = reduce
for func in funcs:
globals()[func.__name__] = lambda *ar, func = func, **kwar: list(func(*ar, **kwar))
try:
yield
finally:
del globals()[reduce.__name__]
for func in funcs: globals()[func.__name__] = func
このように見える使い方では:
with noiters(map):
from operator import add
print(reduce(add, range(1, 20)))
print(map(int, ['1', '2']))
どの印刷物:
190
[1, 2]
ちょうど私の2セント:-)
reduce
メソッドはPython3の組み込み関数から削除されたので、コードにfunctools
をインポートすることを忘れないでください。以下のコードスニペットを見てください。
import functools
my_list = [10,15,20,25,35]
sum_numbers = functools.reduce(lambda x ,y : x+y , my_list)
print(sum_numbers)
これは、フィルタ、マップ、リデュース関数の例です。
数= [10,11,12,22,34,43,54,34,67,87,88,98,99,87,44,66]
//フィルタ
oddNumbers = list(フィルタ(λx:x%2!= 0、数字))
印刷(奇数)
//地図
multiplyOf2 = list(map(λx:x * 2、number))
print(multiplyOf2)
//減らす
Reduce関数は、一般的には使用されていないので、Python 3の組み込み関数から削除されました。それでもfunctoolsモジュールで利用可能です。
functoolsのインポートから減らす
sumOfNumbers = reduce(λx、y:x + y、数)
print(sumOfNumbers)