Python 高階関数 #3 filter

株式会社リュディアです。今回は高階関数の 1 つである filter についてまとめてみたいと思います。ここでは高階関数という用語は別にして filter の使い方を見ていきます。

前回までの高階関数のまとめへのリンクは以下を参考にしてください。

filter はイテラブルなオブジェクトの要素のうち何らかの条件に合致した要素をイテラブルなオブジェクトとして返します。具体例を見ていきましょう。

def isEven(x):
   if x%2 == 0:
       return True
   else:
       return False

l_num = [0, 1, 2, 3, 4]

l_result = filter(isEven, l_num)
print(l_result)       # 戻り値はイテレータであってリストでは無いことに注意
print(list(l_result)) # 表示するにはリスト型に変換する必要あり

# <filter object at 0x000002B115CFAC40>
# [0, 2, 4]

定義した関数 isEven は引数の値が偶数であれば True, そうでなければ False を返す関数です。またイテラブルなオブジェクトとしてリスト l_num を定義します。この l_num の各要素が偶数か基数かを判別し偶数の要素のみで構成されたイテラブルなオブジェクトを返します。map と同じく戻り値はイテレータオブジェクトであってリストでは無いことに注意が必要です。イテレータオブジェクトについて知識が怪しい人は以下のまとめ記事を見てください。

イテレータオブジェクトを表示しても内容はわからないので、list() でリスト型に変換すると元のリスト l_num の各要素のうち偶数の要素のみが戻り値になっていることがわかりますね。

では、map, reduce のまとめと同様に内包表記の例も試してみます。以下の例を見てください。

l_num = [0, 1, 2, 3, 4]
l_result = [i for i in l_num if i % 2 == 0]
print(l_result)

# [0, 2, 4]

同じ結果になりましたね。私個人は map 関数と同様、filter も使わなくてもよい、と考えています。reduce 関数だけは使っています。map 関数でも書きましたように大規模なプログラムを作っておられる方でぎりぎりまで高速化したいという要望がある方は実装環境に応じて判断してください。あくまで私の感覚的なものです。

最後に関数定義を無名関数、いわゆる lambda(ラムダ)関数で実装した例を以下につけておきます。ラムダ関数については別途まとめる予定なので以下は参考です。

l_num = [0, 1, 2, 3, 4]

l_result = filter(lambda x : x%2 == 0, l_num)
print(l_result)       # 戻り値はイテレータであってリストでは無いことに注意
print(list(l_result)) # 表示するにはリスト型に変換する必要あり

# <filter object at 0x000002B115CFAEB0>
# [0, 2, 4]

高階関数に関するまとめの続きは以下からどうぞ。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?