python高次関数-filter

3982 ワード

pythonには、シーケンスをフィルタするfilter関数が内蔵されています.map関数と同様にfilter()関数も1つの関数と1つのシーケンスを受け入れます.ただし、filter関数ではシーケンス内の各要素に関数を順次作用させ、Trueであればこの要素を保持し、Falseであればこの要素を破棄します.たとえば、listを指定して偶数を削除し、奇数を保持します.
>>> def is_odd(n):
...     return n % 2 ==1
...
>>> list(filter(is_odd,[1,2,3,4,5,6]))
[1, 3, 5]

filterは、Iterator、通称不活性シーケンスを返すので、list()関数を使用してすべての要素を取得してlistを返します.
フィルタで素数を求める:
素数の定義:素数とも呼ばれ、1より大きい自然数では、1とそれ自体を除いて他の因数はありません.
素数を計算する方法の1つは、エーストふるい法です.
まず2から始まるすべての自然数の中で:
2,3,4,5,6,7,8,9……
シーケンスの最初の数2を取って、彼はきっと素数で、それから2でシーケンスの倍数を取り除きます:
3,5,7,9……
新しいシーケンスの最初の数3を除いて、彼はきっと素数で、それから3でシーケンスの3の倍数を取り除きます:
5,7……:
5は必ず素数で、それから5でシーケンスの5の倍数を取り除きます:
7,11……
手順は次のとおりです.
>>> def odd_iter():#     3       
...     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)#    
...
>>> for n in primes():
...     if n < 1000:
...             print(n)
...     else:
...             break
...

結果:
2
3
5
7
11
13
17
19
23
……
953
967
971
977
983
991
997

練習:
filter関数を用いて1~1000の回数(回数とは左から右へも右から左へも同じ数、例えば122176)をフィルタリングする.
>>> def is_palindrome(n):
...     return n == int(str(n)[::-1])
...
>>> list(filter(is_palindrome,range(1,1000)))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88,
……
39, 949, 959, 969, 979, 989, 999]