La fonction
Python intégrée filter() est utilisée pour filtrer les séquences.
Semblable à map(), filter() accepte également une fonction et une séquence. Différent de map(), filter() applique tour à tour la fonction transmise à chaque élément, puis décide de conserver ou de supprimer l'élément selon que la valeur de retour est True ou FAUX.
Par exemple, dans une liste, pour supprimer les nombres pairs et ne conserver que les nombres impairs, vous pouvez écrire :
def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 结果: [1, 5, 9, 15]
Pour supprimer les chaînes vides dans une séquence, vous pouvez écrire :
def not_empty(s): return s and s.strip() list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) # 结果: ['A', 'B', 'C']
On peut voir que la clé pour utiliser la fonction d'ordre supérieur filter() est d'implémenter correctement une fonction de "filtrage".
Notez que la fonction filter() renvoie un Iterator, qui est une séquence paresseuse, nous devons donc forcer filter() à terminer le calcul Par conséquent, vous devez utiliser la fonction list() pour obtenir tous les résultats et renvoyer list.
Utiliser un filtre pour trouver des nombres premiers
Une façon de calculer les nombres premiers est la méthode du tamis d'Ehrlich. Son algorithme est très simple à comprendre :
Tout d'abord, listez tous les nombres naturels à partir de 2 et construisez une séquence :
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 , 14, 15, 16, 17, 18, 19, 20, ...
Prenez le premier nombre 2 de la séquence, qui doit être un nombre premier, puis utilisez 2 pour filtrer les multiples de 2 dans la séquence :
3,4, 5,6, 7,8, 9,10, 11,12, 13,14, 15,16, 17,18, 19,20, ...
Obtenir nouveau Le premier nombre de la séquence est 3, qui doit être un nombre premier. Utilisez ensuite 3 pour filtrer les multiples de 3 dans la séquence :
5,6, 7, 8,9,10, 11,12, 13,14 ,15,16, 17,18, 19,20, ...
Prenez le premier chiffre 5 de la nouvelle séquence, puis utilisez 5 pour filtrer les multiples de 5 dans la séquence :
7,8,9,10, 11,12, 13,14,15,16, 17,18, 19,20, ...
Tamisez continuellement et vous pourrez obtenir tous les nombres premiers.
Pour implémenter cet algorithme en Python, vous pouvez d'abord construire une séquence impaire à partir de 3 :
def _odd_iter(): n = 1 while True: n = n + 2 yield n
Notez qu'il s'agit d'un générateur et d'une séquence infinie.
Définissez ensuite une fonction de filtrage :
def _not_divisible(n): return lambda x: x % n > 0
Enfin, définissez un générateur qui renvoie en continu le nombre premier suivant :
def primes(): yield 2 it = _odd_iter() # 初始序列 while True: n = next(it) # 返回序列的第一个数 yield n it = filter(_not_divisible(n), it) # 构造新序列
Ce générateur renvoie le premier en premier nombre premier 2, puis utilisez filter() pour générer en continu de nouvelles séquences filtrées.
Puisque primes() est également une séquence infinie, vous devez définir une condition pour quitter la boucle lors de l'appel :
# 打印1000以内的素数: for n in primes(): if n < 1000: print(n) else: break
Notez qu'Iterator est une séquence de calculs paresseux, donc nous peut l'exprimer dans des séquences Python comme "tous les nombres naturels" et "tous les nombres premiers", et le code est très concis
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!