ホセ：こんにちは､ おかえりなさい｡
この講義では､ フィルターについて話しています｡
さて､ ジェネレータ､ イテレータ､
イテラブルができたので､ 次は楽しい組み込み関数を紹介しましょう｡
filter関数はPythonの組み込み関数で､
任意のファイルやプログラムから呼び出すことができます｡ これが組み込みの意味であり､ 2つの引数を取ります｡
filter関数の第一引数は別の関数で､
これもイテラブルを受け取ります｡
ロルフ､ ホセ､ ランディ､
アンナ､ メアリーのような友達リストを見つけよう､
そして私は1人見逃したことを知っている｡
そして､ 今度はフィルター機能を使って､
Rで始まる友達だけを取得するようにします｡
Rはfilterと呼ばれる関数で､
第一引数arg 1にtrueかfalseを返す関数を取ります｡
したがって､ このフィルター関数の最初の引数は､
何をフィルターしたいかに応じて真か偽を返す別の関数でなければならない｡
では､ ここで関数を定義してみましょう｡
Rで始まる｡
Rで始まるフレンドドットを返す｡
Friend dot starts with Rは､
この引数がRで始まっていれば真になり､ そうでなければ偽になる｡
filter関数の最初の引数はR関数で始まり､
2番目の引数はイテレート可能なものでなければなりません｡
Rolfはfriendsに移動し､
friendsはRで始まるのでtrueになり､ Rolfはフィルター関数によって保持されます｡
そしてまた､ 今度はJoseで､ JoseがRで始まるのは偽なので､
フィルターがそれを削除して無視し､ ここにいるすべての友人に対して同じことをします｡
興味深いのは､ filterは実際にはジェネレータを返すので､
もう少し効率的です｡
保持したい要素だけを含むリストをコピーする代わりに､
次の､ R要素で始まるリストを呼び出して､ 次に利用できる要素（この場合はRolfになります）を取得しなければなりません｡
そして､ 何度も何度もそれを繰り返すと､
Randyが現れ､ 最後に先ほど話した反復停止例外が現れます｡
forループがバックグラウンドでやっていることは､
nextを呼んで､ stop iterationに到達したらすぐにforループは停止して､ このエラーは出ません｡ stop iterationはそのように設計されていて､
forループはstop iterationを使って終わりに到達したことを知る構造になっているからです､
いいですね？
もちろん､ Rで始まるリストを実行すると､ ジェネレータのすべての要素のリストが表示され､
各要素を調べて新しいリストに入れることになります｡
さて､ もう一度やったら､ どうなると思いますか？
このリストオブジェクトはストップイテレーションを発生させませんが､
ストップイテレーションが発生したのを見て､
何も与えず､ ただ空のリストを返します｡
このフィルタ機能の説明に入る前に､ ジェネレータ､
イテレータ､ イテラブルの説明をしているのはこのためです､ いいですか？
もちろん､ ここでパラメータを受け取ってRで始まるパラメータを返す関数を定義する代わりに､
ラムダを使うこともできる｡
このラムダ関数も全く同じもので､
パラメータを1つ取り､
コロンの後に何を返すかを定義しています｡
そうすることで､ この関数はこの友人たちに対して操作するものであり､
この関数はもう必要ないのだということが少し明確になります｡
また､ このコメントの意味も分かったので､
もう必要ありません｡
このフィルター関数は､ この生成式と同じものです｡
この生成式は､ F for F in friends
という､ F dot が R で始まる場合､
F for F を生成する包括的なものです｡
つまり､ この2つは同じものなんですよ？
ここでは､ ジェネレータ式､ ジェネレータ理解で､
各フレンドを新しいジェネレータに入れますが､
FがRで始まる場合のみです､ つまりこの2つは同じです､ いいですか？
どちらが速いのでしょうか？
どちらが性能が良いのでしょうか？
この場合､ 少なくともジェネレータの理解度はこちらの方が高いです｡
そして､ その理由は､
このフィルタの中でこのラムダ関数を作る必要があり､
ジェネレータ式の中でラムダ関数を作る必要がないからです｡
すでにプログラムの別の場所で関数が定義されている場合は､
フィルタ関数の方がパフォーマンスが高く､
また､ 他の多くの場合はリスト内包の方が読みやすいと思いますが､ 場合によってはフィルタ関数の方が読みやすいと思います｡
どちらを使うかはあなた次第ですが､
私は通常､ 理解力を高めるために､ よりPythonicなものを使っています｡
ところで､ 何が起こっているのかはっきりさせるために､
この2つのフィルタとジェネレータの内包は､
これから定義する別の関数と同じものです｡
関数とイテラブルを受け取り､
イテラブルを繰り返し処理します｡
関数が真を返すかどうかをチェックし､ 関数が真の場合は最後にIを返します｡
そこで､ ここに私のカスタムフィルターを呼び出すことを想像してみましょう｡
Rで始まるLamda friendがこの関数で､
イテラブルは友人リストです｡
イテラブルを繰り返し､ 最初の要素がRolfであることを取得します｡
func I that is, friend starts with
R が真であれば､ I, that's
Rolfを返します｡
この関数で次を呼ぶと､ Rolfが表示され､
9行目で停止します｡
もう一度nextを呼ぶと､
一番上のIに戻ります｡
ところで､ これはJoseという文字列ですが､
関数がマッチするかどうかチェックします｡
次にnextを呼ぶと､ ここに行き､ それはAnnaで､
falseなので､ 降伏せず､ 続けます｡ I is Maryで､
falseなので､ 降伏せず､ 続けます｡ 最後に到達すると､
反復を停止するので､ ジェネレータオブジェクトの終わりに到達し､ これも反復を停止して､ 終わりに到達したことを知らせます｡
Pythonはデータを管理し､
ある場所から別の場所にデータを送信するもので､
yieldは非常に強力です｡
とにかく今回の動画はこれで終わりです｡
このフィルター機能とその使い方を紹介したいと思います｡
フィルター機能は他の多くのプログラミング言語にも存在するので､
プログラミングのスキルを身につけ､ プログラミングの旅を続けていると､ いたるところで目にすることになります｡
というわけで､ ええ､ これでおしまいです｡
また次のビデオでお会いしましょう｡