ホームページ >バックエンド開発 >Python チュートリアル >1 つの記事でフィルターの使用法を理解する
Python組み込みの filter() 関数は、シーケンスをフィルタリングするために使用されます。
map() と同様に、filter() も関数とシーケンスを受け入れます。 map() とは異なり、filter() は、渡された関数を各要素に順番に適用し、戻り値が True かどうかに基づいて要素を保持するか破棄するかを決定します。間違い。
たとえば、リストで偶数を削除し、奇数のみを保持するには、次のように記述できます。
def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 结果: [1, 5, 9, 15]
シーケンス内の空の文字列を削除するには、次のように記述できます。
def not_empty(s): return s and s.strip() list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) # 结果: ['A', 'B', 'C']
高階関数 filter() を使用するための鍵は、「フィルタリング」関数を正しく実装することであることがわかります。
filter() 関数は、遅延シーケンスである Iterator を返すため、filter() を強制的に完了する必要があることに注意してください。計算結果として、list() 関数を使用してすべての結果を取得し、list を返す必要があります。
フィルターを使用して素数を見つける
素数を計算する 1 つの方法はエールリッヒふるい法であり、そのアルゴリズムは非常に理解しやすいです。
まず、2 から始まるすべての自然数をリストし、数列を作成します:
2、3、4、5、6、7、8、9、10、11、12、13、 14、15、16、17、18、19、20、...
シーケンスの最初の数値 2 (素数である必要があります) を取得し、2 を使用して 2 の倍数を除外します。シーケンス内:
3,4, 5,6, 7,8, 9,10, 11,12, 13,14, 15,16, 17,18, 19,20, ...
Get new シーケンスの最初の数値は 3 です。これは素数である必要があります。次に、3 を使用してシーケンス内の 3 の倍数を除外します:
5,6, 7,8 ,9,10, 11,12, 13,14 ,15,16, 17,18, 19,20, ...
新しいシーケンスの最初の数値 5 を取得し、5 を使用してフィルターします。シーケンス内の 5 の倍数を取り出します:
7,8,9,10, 11,12, 13,14,15,16, 17,18, 19,20, ...
ふるいにかけ続けると、すべての素数を取得できます。
このアルゴリズムを Python で実装するには、まず 3 から始まる奇数シーケンスを構築します。
def _odd_iter(): n = 1 while True: n = n + 2 yield n
これはジェネレーターであり、無限シーケンスであることに注意してください。
次に、フィルタリング関数を定義します:
def _not_divisible(n): return lambda x: x % n > 0
最後に、次の素数を継続的に返すジェネレーターを定義します:
def primes(): yield 2 it = _odd_iter() # 初始序列 while True: n = next(it) # 返回序列的第一个数 yield n it = filter(_not_divisible(n), it) # 构造新序列
このジェネレーターは最初に最初の素数 2 を返し、次に、filter() を使用して、新しいフィルター処理されたシーケンスを継続的に生成します。
primes() も無限シーケンスであるため、呼び出し時にループを終了するための条件を設定する必要があります。
# 打印1000以内的素数: for n in primes(): if n < 1000: print(n) else: break
Iterator は遅延計算のシーケンスであることに注意してください。 Python で「すべての自然数」、「すべての素数」、その他の数列を表現でき、コードは非常に簡潔です
以上が1 つの記事でフィルターの使用法を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。