Contactez-nous

Valeurs par défaut des arguments

Découvrez comment définir des valeurs par défaut pour les arguments de vos fonctions Python. Simplifiez les appels de fonction et rendez votre code plus flexible.

Définir des valeurs par défaut : syntaxe et principe

En Python, vous pouvez spécifier des valeurs par défaut pour les paramètres d'une fonction. Cela signifie que si l'appelant ne fournit pas de valeur pour ce paramètre lors de l'appel de la fonction, la valeur par défaut sera utilisée.

Pour définir une valeur par défaut, vous utilisez l'opérateur d'affectation `=` après le nom du paramètre, dans la définition de la fonction.

Syntaxe :

def nom_de_la_fonction(parametre1, parametre2=valeur_par_defaut):
    # Corps de la fonction
    # ...

Exemple :

def saluer(nom, salutation="Bonjour"):
    print(salutation, nom)

saluer("Alice")           # Affiche Bonjour Alice (utilise la valeur par défaut de salutation)
saluer("Bob", "Salut")    # Affiche Salut Bob (utilise la valeur fournie pour salutation)

Dans cet exemple, le paramètre `salutation` a la valeur par défaut "Bonjour". Si l'appelant ne fournit pas de valeur pour `salutation`, c'est "Bonjour" qui sera utilisé. Sinon, la valeur fournie par l'appelant sera utilisée.

Les paramètres avec des valeurs par défaut doivent être placés *après* les paramètres sans valeur par défaut dans la définition de la fonction.

Avantages des valeurs par défaut

Les valeurs par défaut offrent plusieurs avantages :

  • Simplification des appels de fonction : Vous n'avez pas besoin de fournir de valeur pour les paramètres avec des valeurs par défaut si la valeur par défaut vous convient.
  • Flexibilité : Vous pouvez toujours fournir une valeur différente de la valeur par défaut si nécessaire.
  • Eviter les erreurs : Les valeurs par défaut peuvent empêcher les erreurs qui se produiraient si un paramètre n'était pas fourni sans valeur par défaut.
  • Documentation implicite : Les valeurs par défaut peuvent servir de documentation implicite, indiquant à l'utilisateur de la fonction quelles sont les valeurs typiques ou recommandées pour les paramètres.

Utilisation avec des arguments nommés

Les valeurs par défaut sont particulièrement utiles en combinaison avec les arguments nommés. Cela vous permet d'appeler une fonction en spécifiant uniquement les arguments pour lesquels vous voulez utiliser une valeur différente de la valeur par défaut, et de laisser les autres arguments à leur valeur par défaut.

Exemple :

def afficher_informations(nom, age=None, ville="Inconnue"):
    print("Nom :", nom)
    if age is not None:
        print("Age :", age)
    print("Ville :", ville)

# Appels avec différentes combinaisons d'arguments
afficher_informations("Dupont")
afficher_informations("Martin", age=40)
afficher_informations("Durand", ville="Lyon")
afficher_informations(age=25, nom="Petit")

Dans cet exemple, `age` et `ville` ont des valeurs par défaut. Vous pouvez appeler la fonction en spécifiant uniquement `nom`, ou en combinant `nom` avec `age`, `ville`, ou les deux, en utilisant des arguments nommés.

Piège à éviter : les valeurs par défaut mutables

Il y a un piège classique à éviter avec les valeurs par défaut en Python : **ne jamais utiliser un objet mutable (comme une liste ou un dictionnaire) comme valeur par défaut**. Cela peut entraîner des comportements inattendus, car la valeur par défaut est partagée entre tous les appels de la fonction.

Exemple (illustrant le problème) :

def ajouter_element(element, liste=[]):
    liste.append(element)
    return liste

print(ajouter_element(1))  # Affiche [1]
print(ajouter_element(2))  # Affiche [1, 2] (et non [2] comme on pourrait s'y attendre)

Dans cet exemple, la liste vide `[]` est créée *une seule fois*, lors de la définition de la fonction. Chaque appel à `ajouter_element` modifie cette même liste, au lieu de créer une nouvelle liste vide à chaque appel.

La solution recommandée est d'utiliser `None` comme valeur par défaut, et de créer une nouvelle liste (ou un nouvel objet mutable) à l'intérieur de la fonction si le paramètre n'est pas fourni :

def ajouter_element(element, liste=None):
    if liste is None:
        liste = []
    liste.append(element)
    return liste

print(ajouter_element(1))  # Affiche [1]
print(ajouter_element(2))  # Affiche [2] (maintenant correct)

En utilisant `None` comme valeur par défaut et en créant une nouvelle liste à l'intérieur de la fonction si nécessaire, vous évitez le problème de la valeur par défaut mutable partagée.