python高次関数-filter
3982 ワード
pythonには、シーケンスをフィルタするfilter関数が内蔵されています.map関数と同様にfilter()関数も1つの関数と1つのシーケンスを受け入れます.ただし、filter関数ではシーケンス内の各要素に関数を順次作用させ、Trueであればこの要素を保持し、Falseであればこの要素を破棄します.たとえば、listを指定して偶数を削除し、奇数を保持します.
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……
手順は次のとおりです.
結果:
練習:
filter関数を用いて1~1000の回数(回数とは左から右へも右から左へも同じ数、例えば122176)をフィルタリングする.
>>> 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]