ホームページ > バックエンド開発 > Python チュートリアル > 1 つの記事でフィルターの使用法を理解する

1 つの記事でフィルターの使用法を理解する

Tomorin
リリース: 2018-08-17 14:47:48
オリジナル
2585 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート