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 !
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 !
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'
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 contientprint(sum(prix)), elle va afficher le total -
la fonction se termine sans
return, Python renvoie alorsNone; c'est ce qui est assigné à la variabletotal -
print(total)affiche le contenu de la variable, c'est-à-direNone -
total * 0.9revient à écrireNone * 0.9, ce qui explique laTypeError
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
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]
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
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
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']
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
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
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
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 €
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
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).