return

Qu'est-ce que l'instruction return en Python ?

Qu'est-ce que l'instruction return ?

L'instruction return permet à une fonction de renvoyer une valeur quand elle est appelée. Sans cette instruction, le résultat de la fonction reste à l'intérieur de celle-ci.

def saluer(nom):
    return f"Bonjour {nom} !"

print(saluer("Patrick"))  # Bonjour Patrick !
PYTHON

Comment récupérer la valeur renvoyée par une fonction ?

Patrick est parti faire ses courses et aimerait avoir le total de son panier. Ça tombe bien, il a commencé à apprendre les fonctions en Python 😃.

def calculer_total(prix):
    return sum(prix)

prix_patrick = [3.5, 2.0, 4.5]

# On stocke la valeur renvoyée dans une variable
total = calculer_total(prix_patrick)
total_reduit = total * 0.9
print(total_reduit)  # 9.0

# On utilise directement l'appel dans une expression
print(calculer_total(prix_patrick) * 0.9)  # 9.0

# On passe la valeur renvoyée à une autre fonction
print(round(calculer_total(prix_patrick)))  # 10

# On l'utilise dans une condition
if calculer_total(prix_patrick) > 5:
    print("Livraison offerte !")  # Livraison offerte !
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

calculer_total(prix_patrick) peut être utilisé partout comme on le ferait avec une valeur classique. Il est possible d'assigner le résultat à une variable si vous en avez besoin à plusieurs endroits. Si on n'assigne rien, le résultat sera perdu.

Quelle différence entre print et return ?

La question et la confusion les plus courantes quand on débute (on y passe tous ☺️).

def afficher_total(prix):
    print(sum(prix))

prix_patrick = [3.5, 2.0, 4.5]

total = afficher_total(prix_patrick)  # 10.0
print(total)  # None
print(total * 0.9)  # TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'
PYTHON

Le total s'affiche bien dans le terminal, mais il faut bien savoir pourquoi, dans ce cas, il s'affiche :

  • total = afficher_total(prix_patrick) : à ce moment, la fonction s'exécute, et comme la fonction contient print(sum(prix)), elle va afficher le total

  • la fonction se termine sans return, Python renvoie alors None ; c'est ce qui est assigné à la variable total

  • print(total) affiche le contenu de la variable, c'est-à-dire None

  • total * 0.9 revient à écrire None * 0.9, ce qui explique la TypeError

Le 10.0 affiché vient donc du print() exécuté dans la fonction.

Que renvoie une fonction sans return ?

Nous venons de le voir à l'instant : une fonction sans return renvoie None. Un return seul aura le même effet, tout comme un return None.

def sans_return():
    pass

def return_seul():
    return

def return_none():
    return None

print(sans_return())  # None
print(return_seul())  # None
print(return_none())  # None
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Une fonction doit-elle toujours avoir un return ?

Autant être direct : non. Certaines fonctions servent à produire une valeur que l'on voudra récupérer, d'autres à effectuer une action sans rien renvoyer : envoyer un mail, écrire dans un fichier, etc.

def envoyer_confirmation(email):
    # On simule l'envoi d'un mail pour l'exemple
    print(f"Mail de confirmation envoyé à {email}")

envoyer_confirmation("[email protected]")  # Mail de confirmation envoyé à [email protected]
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Ce qui compte, c'est que le mail parte. Posez-vous la question suivante : mon code a-t-il besoin d'utiliser le résultat ? Si oui, utilisez un return.

Parfois, le code a besoin de savoir si tout s'est bien passé avec la fonction. Dans notre cas, on pourrait avoir besoin de savoir si le mail est bien parti. La fonction peut alors renvoyer True ou False :

def envoyer_confirmation(email):
    # On simule l'envoi : il échoue si l'adresse ne contient pas de @
    if "@" not in email:
        return False

    print(f"Mail de confirmation envoyé à {email}")
    return True

resultat_envoi = envoyer_confirmation("patrick.example.com")

if resultat_envoi:
    print("Commande confirmée")
else:
    print("Échec de l'envoi, vérifiez l'adresse mail")  # Échec de l'envoi, vérifiez l'adresse mail
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Notre script récupère le booléen envoyé par la fonction.

Attention

Certaines méthodes de Python modifient un objet en place et ne renvoient rien. Par exemple, c'est le cas de la méthode sort() des listes.

jeux = ["Halo", "Gears of War", "The Last of Us"]

jeux = jeux.sort()
print(jeux)  # None
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

La liste est triée, mais la variable jeux est écrasée par None. Il faut appeler .sort() sans assignation (la liste est triée sur place), ou utiliser la fonction sorted() qui renvoie une nouvelle liste :

jeux = ["Halo", "Gears of War", "The Last of Us"]

# sort() trie la liste sur place et renvoie None
jeux.sort()
print(jeux)  # ['Gears of War', 'Halo', 'The Last of Us']

# sorted() renvoie une nouvelle liste triée
jeux_tries = sorted(["Halo", "Gears of War", "The Last of Us"])
print(jeux_tries)  # ['Gears of War', 'Halo', 'The Last of Us']
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Que se passe-t-il après un return ?

Dès que Python arrive à un return, la fonction s'arrête. Tout ce qui se trouve après n'est jamais exécuté.

def calculer_total(prix):
    return sum(prix)
    print("Cette ligne ne sera jamais affichée")

print(calculer_total([3.5, 2.0, 4.5]))  # 10.0
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Un comportement qui peut être exploité, notamment avec une boucle :

def premier_article_en_promo(articles):
    for article in articles:
        print(f"Vérification : {article['nom']}")
        if article["promo"]:
            return article["nom"]
    return None

panier_patrick = [
    {"nom": "clavier mécanique silencieux", "promo": False},
    {"nom": "canard en plastique pour déboguer", "promo": True},
    {"nom": "café en perfusion", "promo": True},
]

print(premier_article_en_promo(panier_patrick))
# Vérification : clavier mécanique silencieux
# Vérification : canard en plastique pour déboguer
# canard en plastique pour déboguer
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Le café est aussi en promo, mais la fonction ne le vérifie pas, car le return fait sortir de la fonction. Le return est souvent utilisé aussi en tant que sortie anticipée quand les données ne permettent pas d'aller plus loin.

def calculer_moyenne(prix):
    # Retour anticipé : si le panier est vide, inutile d'aller plus loin
    if not prix:
        return 0

    return sum(prix) / len(prix)

print(calculer_moyenne([3.5, 2.0, 4.5]))  # 3.3333333333333335
print(calculer_moyenne([]))  # 0
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Comment renvoyer plusieurs valeurs ?

Patrick est devenu pointilleux : il veut connaître le total et le nombre d'articles en un seul appel. Il suffit de séparer les valeurs par une virgule :

def resumer_panier(prix):
    return sum(prix), len(prix)

prix_patrick = [3.5, 2.0, 4.5]

resume = resumer_panier(prix_patrick)
print(resume)        # (10.0, 3)
print(type(resume))  # <class 'tuple'>

# On déballe le tuple dans deux variables
total, nb_articles = resumer_panier(prix_patrick)
print(f"{nb_articles} articles pour {total} €")  # 3 articles pour 10.0 €
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

La fonction renvoie les valeurs dans un tuple que l'on peut facilement déballer si besoin.

Attention

Un return ne devrait jamais être dans un finally. Le bloc finally s'exécute toujours, même après un return, et son propre return prend le dessus.

def calculer_total(prix):
    try:
        return sum(prix)
    finally:
        return 0

print(calculer_total([3.5, 2.0, 4.5]))  # 0
print(calculer_total(["pommes"]))       # 0
PYTHON
Un instant

Créez un compte pour exécuter ce code

Inscrivez-vous gratuitement pour modifier et exécuter du code Python directement dans votre navigateur.

Les deux appels renvoient 0, même si le second lève une exception, elle disparait. D'ailleurs, depuis la version 3.14, Python émet un SyntaxWarning au lancement du script (PEP 765).

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.