Comprendre l'utilisation des filtres dans un seul article

Tomorin
Libérer: 2018-08-17 14:47:48
original
2545 Les gens l'ont consulté

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]
Copier après la connexion

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']
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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) # 构造新序列
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!