Qu'est-ce que la fonction any() en Python ?

Découvrez la fonction any() en Python : définition, syntaxe, exemples pratiques et bonnes pratiques pour tester si au moins un élément d'un itérable est vrai.
10 min de lecture
Believemy logo

Définition de la fonction any() en Python

La fonction any() est une fonction native (built-in) de Python qui permet de vérifier si au moins un élément d'un itérable est évalué à True. Elle retourne True dès qu'elle trouve un élément véridique, et False si tous les éléments sont faux ou si l'itérable est vide.

Si vous souhaitez maîtriser les fonctions natives de Python comme any() et bien d'autres, notre formation complète sur Python vous guidera pas à pas dans votre apprentissage.

La fonction any() est l'un des outils fondamentaux de Python pour effectuer des vérifications logiques sur des collections de données. Elle fonctionne avec n'importe quel type d'itérable : list, tuple, sets, dict, générateurs, et bien d'autres.

Bon à savoir

Retenez cette règle simple : any() retourne True s'il existe au moins un élément véridique dans l'itérable. Si l'itérable est vide, elle retourne False.


Syntaxe et fonctionnement

La syntaxe de any() est extrêmement simple. Elle accepte un seul argument : un itérable.

PYTHON
any(iterable)

Voici comment elle fonctionne en détail :

  • Elle parcourt l'itérable élément par élément.
  • Dès qu'un élément est évalué à True (c'est-à-dire qu'il est truthy), elle retourne immédiatement True sans parcourir le reste.
  • Si aucun élément n'est véridique (tous sont falsy), elle retourne False.
  • Si l'itérable est vide, elle retourne False.

Ce comportement de court-circuit (short-circuit evaluation) est très important pour les performances : Python arrête l'évaluation dès que le résultat est déterminé.


Comprendre les valeurs truthy et falsy

Pour bien utiliser any(), vous devez comprendre quelles valeurs Python considère comme fausses (falsy). Voici un tableau récapitulatif :

ValeurÉvaluation booléenneType
FalseFalsybool
NoneFalsyNoneType
0Falsyint
0.0Falsyfloat
"" (chaîne vide)Falsystr
[] (liste vide)Falsylist
() (tuple vide)Falsytuple
{} (dict vide)Falsydict
set() (set vide)Falsyset
Tout le resteTruthyDivers

Toute valeur qui n'est pas dans cette liste de valeurs falsy est considérée comme truthy par Python. Cela inclut les nombres non nuls, les chaînes non vides, les collections non vides, les objets, etc.


Exemples pratiques

Utilisation basique avec des listes

Commençons par les cas les plus simples pour bien comprendre le comportement de any() :

PYTHON
# Au moins un élément est True
resultat = any([False, False, True, False])
print(resultat)  # True

# Tous les éléments sont False
resultat = any([False, False, False])
print(resultat)  # False

# Liste vide
resultat = any([])
print(resultat)  # False

# Avec des valeurs numériques
resultat = any([0, 0, 0, 1])
print(resultat)  # True (1 est truthy)

# Avec des chaînes de caractères
resultat = any(["", "", "bonjour"])
print(resultat)  # True ("bonjour" est truthy)


Utilisation avec des conditions et des compréhensions

L'une des utilisations les plus puissantes de any() est sa combinaison avec les expressions génératrices. Vous pouvez ainsi tester une condition sur chaque élément d'un itérable de manière concise et performante :

PYTHON
# Vérifier si au moins un nombre est pair
nombres = [1, 3, 5, 7, 8, 9]
resultat = any(n % 2 == 0 for n in nombres)
print(resultat)  # True (8 est pair)

# Vérifier si une liste contient au moins un nombre négatif
valeurs = [10, 25, -3, 42, 7]
a_negatif = any(v < 0 for v in valeurs)
print(a_negatif)  # True (-3 est négatif)

# Vérifier si un mot commence par une majuscule
mots = ["python", "java", "Ruby", "go"]
a_majuscule = any(mot[0].isupper() for mot in mots)
print(a_majuscule)  # True ("Ruby")
Bon à savoir

Privilégiez les expressions génératrices (sans crochets) plutôt que les compréhensions de liste (avec crochets) lorsque vous utilisez any(). L'expression génératrice bénéficie du court-circuit et ne crée pas toute la liste en mémoire.


Utilisation avec des dictionnaires

Lorsque vous utilisez any() avec un dict, elle parcourt par défaut les clés du dictionnaire :

PYTHON
# Par défaut, any() parcourt les clés
mon_dict = {0: "zéro", "": "vide", "clé": "valeur"}
resultat = any(mon_dict)
print(resultat)  # True ("clé" est truthy)

# Tester les valeurs du dictionnaire
notes = {"Alice": 0, "Bob": 0, "Charlie": 15}
quelquun_a_note = any(mon_dict.values())
print(quelquun_a_note)  # True

# Vérifier si au moins un étudiant a la moyenne
etudiants = {"Alice": 8, "Bob": 12, "Charlie": 6}
quelquun_a_moyenne = any(note >= 10 for note in etudiants.values())
print(quelquun_a_moyenne)  # True (Bob a 12)


Utilisation avec des chaînes de caractères

Puisque les chaînes sont des itérables en Python, any() peut les parcourir caractère par caractère :

PYTHON
# Vérifier si une chaîne contient au moins un chiffre
texte = "Bonjour le monde 2024"
contient_chiffre = any(c.isdigit() for c in texte)
print(contient_chiffre)  # True

# Vérifier si une chaîne contient au moins une lettre majuscule
mot_de_passe = "monmotdepasse"
a_majuscule = any(c.isupper() for c in mot_de_passe)
print(a_majuscule)  # False

# Validation de mot de passe
def valider_mot_de_passe(mdp):
    a_majuscule = any(c.isupper() for c in mdp)
    a_minuscule = any(c.islower() for c in mdp)
    a_chiffre = any(c.isdigit() for c in mdp)
    a_special = any(not c.isalnum() for c in mdp)
    assez_long = len(mdp) >= 8
    return all([a_majuscule, a_minuscule, a_chiffre, a_special, assez_long])

print(valider_mot_de_passe("MonP@ss1"))  # True
print(valider_mot_de_passe("faible"))    # False


Comparaison entre any() et all()

La fonction any() a une fonction sœur : all(). Il est essentiel de bien comprendre la différence entre les deux :

FonctionRetourne True si...Itérable videLogique
any()Au moins un élément est truthyFalseOU logique
all()Tous les éléments sont truthyTrueET logique
PYTHON
nombres = [1, 2, 0, 4, 5]

print(any(nombres))  # True (au moins un est truthy)
print(all(nombres))  # False (0 est falsy)

# Tous positifs vs au moins un positif
valeurs = [-1, -2, 3, -4]
print(any(v > 0 for v in valeurs))  # True (3 > 0)
print(all(v > 0 for v in valeurs))  # False (certains sont négatifs)

# Avec un itérable vide
print(any([]))  # False
print(all([]))  # True (convention logique)


Implémentation équivalente de any()

Pour bien comprendre le fonctionnement interne de any(), voici une implémentation équivalente en Python pur :

PYTHON
def mon_any(iterable):
    for element in iterable:
        if element:
            return True
    return False

# Test
print(mon_any([0, False, None, "", 42]))  # True
print(mon_any([0, False, None, ""]))      # False
print(mon_any([]))                         # False

Comme vous pouvez le constater, le fonctionnement est très simple : la boucle s'arrête dès qu'un élément véridique est trouvé grâce au return True.


Cas d'utilisation avancés

Vérification de fichiers et de données

La fonction any() est très utile dans le contexte de la validation de données :

PYTHON
# Vérifier si au moins un fichier a une extension autorisée
fichiers = ["rapport.pdf", "image.png", "script.exe", "notes.txt"]
extensions_dangereuses = [".exe", ".bat", ".cmd"]

a_fichier_dangereux = any(
    fichier.endswith(ext)
    for fichier in fichiers
    for ext in extensions_dangereuses
)
print(a_fichier_dangereux)  # True (script.exe)

# Vérifier si un utilisateur a les permissions requises
permissions_utilisateur = ["lecture", "commentaire"]
permissions_admin = ["écriture", "suppression", "admin"]

est_admin = any(p in permissions_admin for p in permissions_utilisateur)
print(est_admin)  # False


Utilisation avec des objets personnalisés

Vous pouvez utiliser any() avec vos propres class en définissant la méthode __bool__ :

PYTHON
class Produit:
    def __init__(self, nom, stock):
        self.nom = nom
        self.stock = stock

    def __bool__(self):
        return self.stock > 0

    def __repr__(self):
        return f"Produit('{self.nom}', stock={self.stock})"

produits = [
    Produit("Clavier", 0),
    Produit("Souris", 0),
    Produit("Écran", 5),
]

# Vérifier si au moins un produit est en stock
print(any(produits))  # True (Écran a du stock)

# Avec une condition explicite
print(any(p.stock > 10 for p in produits))  # False


Combinaison avec map() et filter()

La fonction any() se combine élégamment avec d'autres fonctions natives de Python :

PYTHON
# Avec map()
nombres = ["10", "abc", "20", "xyz"]

def est_numerique(s):
    try:
        int(s)
        return True
    except ValueError:
        return False

resultat = any(map(est_numerique, nombres))
print(resultat)  # True

# Avec une fonction lambda
liste = [1, 3, 5, 7, 9]
a_pair = any(map(lambda x: x % 2 == 0, liste))
print(a_pair)  # False (tous impairs)


Bonnes pratiques

Voici les bonnes pratiques à suivre lorsque vous utilisez any() en Python :

  • Utilisez des expressions génératrices plutôt que des compréhensions de liste avec any(). Écrivez any(x > 5 for x in liste) et non any([x > 5 for x in liste]). L'expression génératrice profite du court-circuit et consomme moins de mémoire.
  • Préférez any() aux boucles manuelles pour tester l'existence d'un élément satisfaisant une condition. C'est plus lisible, plus concis et plus idiomatique.
  • Ne confondez pas any() et all(). Rappelez-vous : any() = OU logique, all() = ET logique.
  • Attention aux itérables vides : any([]) retourne False. C'est logique (aucun élément ne peut être vrai), mais cela peut surprendre si vous ne l'anticipez pas.
  • Utilisez any() pour la validation : elle est parfaite pour vérifier qu'au moins une condition est remplie dans un ensemble de critères.
Attention

Attention : n'utilisez pas any() quand vous avez besoin de connaître quel élément est véridique. Dans ce cas, utilisez plutôt une boucle for avec une condition, ou la fonction next() avec une expression génératrice.

PYTHON
# ❌ any() ne vous dit pas QUEL élément est vrai
resultat = any(n > 100 for n in nombres)

# ✅ Si vous avez besoin de l'élément, utilisez next()
element = next((n for n in nombres if n > 100), None)

# ✅ Ou une boucle for
for n in nombres:
    if n > 100:
        print(f"Trouvé : {n}")
        break


Performance et optimisation

La fonction any() est optimisée en C dans l'implémentation CPython, ce qui la rend très rapide. Voici quelques points à connaître :

PYTHON
import time

# Comparaison de performance : boucle vs any()
nombres = list(range(1_000_000))

# Avec any() - court-circuit dès le premier élément truthy
debut = time.time()
resultat = any(n > 0 for n in nombres)
fin = time.time()
print(f"any() : {fin - debut:.6f}s")  # Très rapide (court-circuit)

# Avec une boucle manuelle
debut = time.time()
trouve = False
for n in nombres:
    if n > 0:
        trouve = True
        break
fin = time.time()
print(f"Boucle : {fin - debut:.6f}s")  # Similaire mais moins lisible

Dans cet exemple, any() s'arrête dès le deuxième élément (1 > 0), peu importe la taille de la liste. C'est l'avantage majeur du court-circuit.


Questions fréquentes

Question

Quelle est la différence entre any() et all() en Python ?

La fonction any() retourne True si au moins un élément de l'itérable est véridique (OU logique). La fonction all() retourne True si tous les éléments sont véridiques (ET logique). De plus, any([]) retourne False tandis que all([]) retourne True. Les deux fonctions utilisent le mécanisme de court-circuit pour optimiser les performances.


Question

La fonction any() modifie-t-elle l'itérable d'origine ?

Non, any() ne modifie jamais l'itérable qu'elle reçoit. C'est une fonction non destructive qui se contente de parcourir les éléments pour évaluer leur valeur de vérité. Toutefois, si vous lui passez un générateur, celui-ci sera partiellement ou totalement consommé après l'appel (le générateur avancera jusqu'à l'élément truthy ou jusqu'à la fin).


Question

Peut-on utiliser any() avec des fonctions lambda ?

Oui, vous pouvez combiner any() avec lambda via la fonction map(). Par exemple : any(map(lambda x: x > 10, ma_liste)). Cependant, dans la plupart des cas, une expression génératrice est plus lisible : any(x > 10 for x in ma_liste). Les deux approches sont équivalentes en termes de fonctionnalité et de performance.


Question

Comment apprendre à bien utiliser any() et les fonctions natives de Python ?

Pour maîtriser any() ainsi que l'ensemble des fonctions natives de Python, la pratique régulière est essentielle. Vous pouvez suivre notre formation dédiée à Python sur Believemy qui couvre en profondeur les fonctions built-in, les itérables, les générateurs et les bonnes pratiques de programmation Python. Combinez cela avec des projets personnels pour consolider vos acquis.

Termes connexes

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.