Python【Pythonステップアップ!】高階関数filterの便利な使い方フクロウ2017/5/222018/10/31こんにちは。フリーランスのフクロウです。いろんなプログラミング言語で実装されている機能の一つにfilter(フィルター)と言うものがあります。これはリストのようなものから条件にあった要素のみを取り出す操作になります。Pythonだけでなく、他の様々な言語で役に立つ機能なので是非とも使い方を覚えておきましょう。18.04で動作確認しました。まとめfilterとはfilter関数とはリストのような複数の要素をもったオブジェクトから、条件にあった要素のみを取り出す操作を実装したものです。Pythonに実装されたfilter関数は、与えられた条件がTrueである要素のみを取り出してくれます。この条件が複雑な場合は複数の条件式を書く必要があります。2018年10月24日を参考にして下さい。このとき、filterに渡す「条件」が関数なので、一般に高階関数と呼ばれている機能の一つに数えられます。高階関数、聞き慣れない方も多い用語だと思います。LispやHaskellといった「関数型言語」を勉強していると出てくる概念なのですが、要するに関数を受け取る関数か返り値として関数を返す関数の事を指します。普通、関数の引数には何かしらの値を持ったオブジェクトを渡しますね。中には関数を受け取る関数もあるんです!この記事で説明しているfilterもこの高階関数に含まれる機能なんです。この他にはmapなどの名前がよく挙げられますが、これについてはまた別の記事で説明しましょう。filterの使い方filterとは何か、高階関数とは何かについて理解できたでしょうか?仰々しい名前と裏腹に、意外と簡単な機能であることがわかっていただけたら嬉しいです。基本的な概念について説明が終わったので、次にここでは実際の使い方について紹介していきます。条件にあった要素のみを抽出するまずは一番簡単な例として、「数字のリストから偶数の数字のみを取り出す操作」を例に見ていきましょう。無名関数を使った方法の2つの方法が考えられます。関数を使うまずは偶数を評価する関数を作りましょう。奇数ならばFalseを返します。他のサムライの記事を読んでくださっている方であれば、関数についているタイプヒントについても気づいているでしょう。ここでは、「この関数は引数xにint型オブジェクトを受け取ります。bool型の返り値を提供します」ということが読み取れますね。実際に使ってみましょう。print(even_evaluator(18))print(even_evaluator(91))これを実行すると[実行結果]TrueFalseと表示されます。この関数がちゃんと偶数と奇数を判定してくれることがわかりました!ではこれをfilter関数で使ってみましょう。filter関数は第一引数に条件を判定する関数を(この関数の返り値はbool値(TrueかFalse))第二引数に元になるシーケンスを(listなど)を受け取ります。第一引数に先程作った関数を、第二引数に今から作る0~9の要素を持ったリストを渡してみます。num_list)print(list(even_list))これでfilter関数は偶数のみを取り出してくれるはずです。printの際にlist(even_list)としているのはなぜでしょう。objectになってしまうからです。結果を見てみましょう。8]ちゃんと偶数のリストが取り出されたことが確認できました!このようにあるシーケンスから条件にあった要素を抽出し、別のシーケンスを作ることが出来るのがfilterになります!lambda式を使う先ほどの例では条件を指定するのに、わざわざ関数を作っていましたね。==0これで前の章で作った関数と同じ機能を持ったlambda式をつくることができました。このように何かの変数(ここではeven_evaluator2)に束縛することもできますが、filter関数の第一引数にそのまま渡すこともできます。実際に使ってみましょう。18]このように先ほどと同様に偶数のみのリストを作ることができました!簡単な条件であればlambda式で書いた方が読みやすくなります。最後にfilterの機能をリスト内包表記で試してみましょう。リスト内包表記はPythonだけではなく、Haskellなどの純粋関数型言語や、Juliaといった新しい言語でも取り入れられている機能です。先程の機能をリスト内包表記で実装すると以下のようになります。0]print(even_list3)リスト内包表記に慣れ親しんだ方であればこっちの方が読みやすいかもしれませんね。28]このように同様の機能が実装できたことが確認できます。リスト内包表記とfilter関数、どちらを使っても大丈夫です。リスト内包表記の中でも関数を使うことはできます。リスト内包表記は条件式が複雑になると読みづらくなりますし、forのネストが深くなるとやはり読みづらくでしょう。リスト内包表記は表現力の強い書き方なので、ここで解説したfilterのみならず、mapなどの機能も再現できてしまいます。リスト内包表記に慣れ親しんだ人にはそのコードですら読みやすいと感じられることもあるので、他の人にコードを渡すときや、時間が経ってから後で確認する必要がある時などは読みづらさが仇となる場合も考えられます。その点filterは単一機能ですので(通常mapの代わりにfilterを使うといったことは考えづらいですよね)、読みやすさの観点から見るとこちらの方がおすすめです。実行速度などの別の事情もあるので、適宜使いどころを考えてのご使用をおすすめします。まとめこの記事ではfilter関数について解説しました。filter関数の機能はリスト内包表記や、ここで解説しなかったfor文を使った書き方でも再現できます。読みやすさの観点でこの関数は優秀です。無駄にコードのインデントを下げたくない時、読みやすさを重視したい時に是非使ってみてくださいね!TweetPocket無料でSEからWebエンジニアへ転職しませんか?侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、システムエンジニアという職業だけどコードが書けない事務作業が多くスキルがないため将来が不安スクールに通うと完全未経験者と同じスタートになるからレベルが合わないという、すでに知識があるSEならではのお悩みがあることに気づきました。弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。こちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。無料体験レッスンを予約する書いた人フクロウ第一言語はPythonです。皆さんRustやりましょう。