Kodokon kodokon.com

Fonctions : def, paramètres, return et portée

Structurez votre code en fonctions réutilisables, maîtrisez les valeurs par défaut et comprenez la portée des variables.

10 min · 3 questions

Ouvrir cette leçon dans Kodokon

Vous savez déjà écrire des boucles et des conditions ; il est temps de structurer votre code. Une fonction isole une tâche précise derrière un nom clair : vous l'écrivez une fois, vous la testez une fois, vous l'appelez partout. def déclare la fonction, les paramètres reçoivent les valeurs d'entrée et return renvoie le résultat à l'appelant. Retenez un point souvent oublié : une fonction sans return renvoie None.

PYTHON
def net_price(price, tax_rate):
    total = price * (1 + tax_rate)
    return round(total, 2)

result = net_price(100, 0.2)
print(result)  # 120.0
La fonction reçoit deux paramètres et renvoie une valeur avec return.

Les valeurs par défaut rendent une fonction flexible sans multiplier les variantes : déclarez-les après les paramètres obligatoires. À l'appel, les arguments nommés (currency="USD") documentent l'intention. Dans du code professionnel, on les utilise dès qu'une fonction dépasse deux paramètres : l'appel se lit sans ouvrir la définition.

PYTHON
def format_price(amount, currency="EUR", digits=2):
    return f"{amount:.{digits}f} {currency}"

print(format_price(19.9))                  # 19.90 EUR
print(format_price(19.9, currency="USD"))  # 19.90 USD
print(format_price(19.9, digits=0))        # 20 EUR
Les arguments nommés permettent de ne préciser que ce qui change.
PYTHON
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

print(add_item("pen"))   # ['pen']
print(add_item("book"))  # ['book']
Avec le motif None, chaque appel repart d'une liste neuve.

La portée détermine où une variable existe. Une variable créée dans une fonction est locale : elle disparaît à la fin de l'appel. Une fonction peut lire une variable globale, mais toute affectation crée une nouvelle variable locale - la globale reste intacte. Bonne habitude : plutôt que de modifier des globales, passez des paramètres et renvoyez des résultats ; votre code devient prévisible et testable.

PYTHON
rate = 0.2

def apply_tax(price):
    return round(price * (1 + rate), 2)

def set_rate(new_rate):
    rate = new_rate  # variable locale, sans effet

print(apply_tax(100))  # 120.0
set_rate(0.1)
print(apply_tax(100))  # 120.0, la globale est intacte
Lire une globale fonctionne ; l'affecter crée une locale.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Que renvoie une fonction Python qui ne contient aucun return ?
    • 0
    • None
    • Une chaîne vide
    • Une erreur est levée
  2. Pourquoi faut-il éviter def add_item(item, items=[]) ?
    • La liste par défaut est créée une seule fois et partagée entre les appels
    • Une liste ne peut pas servir de valeur par défaut
    • Cela lève une SyntaxError à la définition
  3. Que se passe-t-il quand vous affectez une variable dans une fonction alors qu'une globale porte le même nom ?
    • Python modifie la variable globale
    • Python crée une variable locale, la globale reste intacte
    • Python lève une erreur de conflit de noms