日々ろぐ

人に優しく٩( 'ω' )و

filter,map,reduceの使い方

タイトルの通り

先日のPyFukuoka#3でLTした高階関数について、ちょっとまとめて行こうかなと思うところです。 ついでに、LTで喋りきれなかったジェネレーターとか、内包表記とかもまとめていけたらいいなと思ったり。

まず手始めに、簡単なfilter,map,reduceについてまとめます。

注意

まとめてる内容はPython3での挙動になり、Python2とは書き方、返り値など異なります。

filter

イテレータを対象に、条件に一致する要素のみを抽出してイテレータとして返す。

#偶数を返す
def is_even(val):
if val % 2 == 0:
return val</code>

print(list(filter(is_even, range(1,10))))

>>> [2, 4, 6, 8]

#Lambdaを使って書くと
print(list(filter(lambda x: x % 2 == 0, range(1, 10))))

>>> [2, 4, 6, 8]

map

イテレータの全ての要素に対して同一の処理を適用し、イテレータとして返す。

#倍返しだ!
def double(val):
return val * 2</code>

print(list(map(double, range(1,10))))

>>> [2, 4, 6, 8, 10, 12, 14, 16, 18]

#Lambdaを使って書くと
print(list(map(lambda x: x * 2, range(1, 10))))

>>> [2, 4, 6, 8, 10, 12, 14, 16, 18]

reduce

全ての要素をまとめていく。

import functools</code>

#ひたすら足して返す
def add(val1, val2):
return val1 + val2

print(functools.reduce(add, range(1,10)))

>>> 45

#Lambdaを使って書くと
print(functools.reduce(lambda x, y:x + y, range(1,10)))

>>> 45