業務で filter 関数を使うことがあり、まだ理解が足りない点が多いのでアウトプットして知識を深めていく。
filter 関数とは
Python の組み込み関数の 1 つで、import 文不要で動作する。構文は filter(関数, イテラブル)
であり、イテラブルを関数に渡して真だった場合の要素からイテラブルを生成する。for 文を使わなくてもよい。
>>> def f(item): ... return item == 1 >>> list(filter(f, l)) [1]
filter 関数の返り値の型は filter 型となる。以前書いた zip 関数とは違って遅延評価ではなく、変数に代入して処理することも可能のようだ。配列で返してほしい場合は list でラップするするとよさそう。
>>> value = filter(f, l) >>> print(value) <filter object at 0x1052eb1f0> >>> >>> type(value) <class 'filter'> >>> >>> list(value) [1]
filter 関数はジェネレータ式というものやリスト内包表記と同等の動きをするらしい。
>>> list((item for item in l if f(item))) [1] >>> >>> [item for item in l if f(item)] [1]
なお、
filter(function, iterable)
は、関数がNone
でなければジェネレータ式(item for item in iterable if function(item))
と同等で、関数がNone
なら(item for item in iterable if item)
と同等です。
今関わっているプロジェクトは filter 関数の第 1 引数で指定する関数にラムダ式を用いていた。
>>> list(filter(lambda x: x == 1, l)) [1]
雑感
そろそろ Python 3 年生だが、list 関数や zip 関数、filter 関数やリスト内包表記はまだ読みづらいと感じる。頭がごちゃってしまう。ただこれは Pythonic 思考に反する気がしているので慣れが必要だとも思っている。どんどん書いていこう。ただ参考にした記事だと filter 関数よりもリスト内包表記やジェネレータ式を使った方が好ましいとの記載があったので、また調べてアウトプットしようと思う。