
Dans cette leçon vidéo en français, le formateur explique en détail le concept des fonctions en Python, en partant du problème de code redondant et en montrant comment les fonctions permettent de factoriser le code. Il décrit la syntaxe de base d’une fonction personnalisée (mot‑clé def, nom, parenthèses, deux‑points et indentation) ainsi que les conventions de nommage. Il introduit les paramètres et arguments, y compris les valeurs par défaut et les arguments nommés, et montre comment les utiliser pour rendre le message affiché dynamique. Un exemple concret crée une bordure autour d’un texte, où la longueur de la bordure s’ajuste automatiquement grâce à une boucle qui compte la longueur du message + 4 caractères. Le cours aborde ensuite la portée des variables, distinguant les variables locales et globales et expliquant l’usage du mot‑clé global pour rendre une variable locale accessible à l’extérieur. Le formateur montre comment transformer une fonction qui imprime directement en une fonction qui retourne une chaîne, en détaillant le rôle du mot‑clé return, le fait que return interrompt immédiatement l’exécution, et comment retourner plusieurs valeurs via une liste ou un tuple et les concaténer avec join. Il explique que l’on peut appeler une fonction depuis une autre, et introduit la récursivité à travers l’exemple de la fonction factorielle, en présentant le cas de base (n=0) et l’appel récursif (n‑1). Enfin, il fait la distinction entre procédure (pas de valeur de retour) et fonction (retourne une valeur) et renvoie les spectateurs vers d’autres vidéos pour approfondir les procédures, les fonctions et la récursivité.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon sur le langage de programmation Python. Aujourd'hui, nous allons voir les fonctions. Dans les programmes que nous avons écrits jusqu'ici, nous nous sommes servis de nombreuses fonctions comme print, input, len, etc. Ces fonctions sont dites prédéfinies car elles sont déjà disponibles dans le langage de programmation et nous pouvons les invoquer au besoin quand nous voulons. Il se trouve parfois qu'on a un bout de code qui se répète à plusieurs endroits dans notre programme, on parle dans ce cas de code redondant. Bien que la redondance ne soit pas forcément une mauvaise chose, car elle n'empêche pas le programme de s'exécuter correctement, il fait quand même partie des pratiques à éviter en programmation. En effet, un code redondant rend le programme plus lent car il y a les mêmes suites d'instructions qui se répètent plusieurs fois à des endroits différents. En plus, si un jour on veut modifier le comportement de ce code redondant, alors il faut appliquer cette modification à plusieurs endroits, ce qui pourrait être source d'erreurs ou d'oublis, sans oublier le temps qu'il faut consacrer à toutes ces modifications-là. La solution consiste à factoriser le code redondant, c'est-à-dire l'écrire une seule fois dans un seul endroit, et en cas de besoin, on va juste l'invoquer dans d'autres endroits sans recoder les mêmes instructions. Pour factoriser le code, on utilise les fonctions. Notez qu'on ne parle pas cette fois de fonctions prédéfinies comme Print ou Input, mais de fonctions personnalisées que nous créons nous-mêmes selon notre besoin. Imaginez que l'on souhaite afficher le message Question entouré par une sorte de bordure. C'est comme si l'on s'apprête à poser une question à l'utilisateur. On peut par exemple faire ceci: On commence par imprimer la bordure supérieure constituée de tirets. Ensuite, on affiche le message voulu mais entre 2 barres verticales. Et enfin, on imprime la bordure inférieure exactement comme la bordure supérieure. Si on exécute, on aura le résultat suivant. Maintenant, imaginez que l'on souhaite afficher ce même message plus loin dans le programme. Alors il est clair qu'on va réécrire le même code une fois de plus, ou juste le copier pour aller plus vite. Mais si on veut réécrire ce message 20 fois, comme par exemple lors de l'élaboration d'un questionnaire, alors on imagine que la redondance sera plus flagrante. Bien sûr, vous avez compris qu'avec un copier-coller c'est facile comme opération, mais si un jour on veut changer la forme de la bordure ou même le message affiché à l'intérieur, alors il faut retoucher tous ces codes qui se répètent. La solution consiste à créer une fonction où on va factoriser ce code redondant. En Python, la forme la plus simple d'une fonction ressemble à ceci. En effet, pour créer notre fonction, on ne dit plus définir une fonction, on fait appel au mot-clé def suivi du nom de la fonction. Veuillez opter pour des noms significatifs qui reflètent la nature du traitement à mener. J'appellerai ma fonction message par exemple. Notez que le nom d'une fonction obéit aux mêmes règles que le nom d'une variable, c'est-à-dire: qu'il peut être constitué de caractères alphabétiques, numériques et de symboles soulignés et ne doit pas commencer par un chiffre. Notez également qu'on préfère nommer les fonctions en minuscule. Il ne s'agit pas d'une obligation mais juste une sorte de convention. On place les parenthèses après le nom de la fonction. Dans un premier temps, nous allons laisser les parenthèses vides. Ensuite, on met 2 points comme pour les structures de contrôle. Cela signifie que les instructions qui vont suivre seront indentées pour dire qu'elles appartiennent à la fonction. On parle dans ce cas du corps de la fonction et il s'agit du traitement censé être mené quand celle-ci sera invoquée. Nous allons juste réécrire les mêmes instructions qu'avant, indentées bien entendu. Désormais, nous disposons de notre fonction personnalisée nommée message. Pour l'invoquer, on dit aussi appeler la fonction, alors on va juste écrire son nom comme ceci. Cela signifie que le corps de la fonction sera exécuté aussitôt. Et on aura donc le message écrit comme on le souhaite. À chaque fois qu'on appelle la fonction message, on aura le même résultat, c'est-à-dire la chaîne Question entourée par une bordure. Cependant, il est possible que la fonction donne un résultat différent selon nos préférences. À titre d'exemple, imaginez que l'on veut personnaliser le message affiché, c'est-à-dire, au lieu d'avoir la chaîne de caractères Question à chaque fois, on souhaite que cette chaîne soit renseignée au moment même de l'appel de la fonction. Ce qui signifie qu'on aura un affichage différent selon la convenance de l'utilisateur. À cette fin, nous allons nous servir des parenthèses situées après le nom de la fonction. En effet, ces parenthèses permettent d'accueillir les arguments. Les arguments sont des variables dont les valeurs sont renseignées au moment de l'appel. Par exemple, au moment de la définition de la fonction message, on renseigne un argument identifié par msg. Ensuite, nous allons remplacer la chaîne de caractères Question par cet argument. N'oubliez pas de procéder à la concaténation car l'argument msg est une variable qui sera évaluée par l'interpréteur et remplacée par la valeur prévue. Tout ce qui reste maintenant, c'est renseigner la valeur de l'argument msg au moment de l'appel. Nous avons spécifié le même message, c'est-à-dire la chaîne Question. Désormais, on peut spécifier n'importe quelle chaîne au moment de l'appel, ce qui produira un affichage différent sans toucher au corps de la fonction. Imaginez maintenant qu'au moment de l'appel, on a spécifié la chaîne Quel est votre langage préféré? Vous remarquez que la bordure ne convient pas à ce message, car il est plus long que prévu. Nous allons donc faire en sorte d'adapter notre bordure selon la longueur de la chaîne de caractères. Donc, nous allons générer les tirets des bordures supérieure et inférieure à l'aide d'une boucle dont le nombre d'itérations dépend de la longueur du message à afficher. Notez que le nombre de tirets à générer sera égal à la longueur du message+ 4. En effet, il ne faut pas oublier qu'en plus du message, il y a aussi les 2 espaces de début et de fin, sans oublier les 2 barres verticales. Donc nous avons 4 caractères supplémentaires à considérer. À l'intérieur de la fonction, nous allons initialiser la variable identifiée par bordure avec une chaîne vide. Ensuite, nous allons programmer une boucle qui s'exécute autant de fois qu'il y a de caractères dans le message à afficher. Sans oublier les 4 caractères supplémentaires. À chaque itération de la boucle, nous allons ajouter un tiret à la variable bordure à l'aide de l'opérateur d'affectation avec concaténation comme on l'a vu avant. À la fin de la boucle, la valeur de la variable bordure sera constituée du nombre de tirets voulus. Nous allons juste afficher la bordure supérieure suivie du message passé en argument de la fonction, puis la bordure inférieure. Remarquez que nous avons concaténé le message avec la barre verticale et l'espace des deux côtés. Si on appelle la fonction message en lui passant n'importe quelle chaîne de caractères en guise d'argument, alors la bordure s'adapte parfaitement. Au passage, essayons d'afficher la variable bordure à l'extérieur de la fonction. Une erreur survient en disant que la variable bordure n'est pas définie. En effet, cette erreur est due à la portée des variables. La portée d'une variable signifie son champ de visibilité. En général, on distingue 2 types de portée pour les variables, à savoir locale et globale. On parle donc de variable locale et variable globale. Une variable locale est une variable qui est reconnue seulement à l'intérieur d'une fonction, comme c'est le cas pour la variable bordure, alors qu'une variable globale est une variable reconnue partout dans le programme. Par exemple, imaginez qu'on a initialisé une variable nommée symbole avec un tiret à l'extérieur de la fonction. Dans cette dernière, on remplace le caractère tiret par la variable symbole. Quand on exécute, on obtient le résultat espéré. En effet, symbole est une variable globale reconnue partout dans le programme, donc à l'extérieur comme à l'intérieur de la fonction. Il est possible de transformer une variable locale en variable globale. Il suffit de faire appel au mot-clé global comme ceci. Dans ce cas, bien que la variable bordure soit créée à l'intérieur de la fonction, elle reste quand même accessible depuis l'extérieur de celle-ci, car elle est désormais globale. Maintenant, rétablissons notre code initial. Imaginez cette fois qu'on veut aussi renseigner le caractère qui constitue la bordure au moment de l'appel. Pour cela, il suffit d'ajouter un deuxième argument à notre fonction que l'on appellera symbole et qui remplacera le caractère tiret dans le corps de la fonction. Au moment de l'appel de celle-ci, on doit renseigner les 2 arguments, à savoir le message et le symbole qui fait office de bordure comme ceci. Notez qu'il faut respecter l'ordre dans ce cas. Il est possible de fixer une valeur par défaut d'un argument comme ceci. Dans ce cas, si au moment de l'appel de la fonction nous n'avons pas renseigné le deuxième argument, alors il sera automatiquement initialisé avec la valeur par défaut, sinon il sera initialisé avec la valeur explicite passée lors de l'appel. On peut changer l'ordre des arguments au moment de l'appel, mais pour ça on va renseigner leur nom ainsi que leur valeur. J'aimerais souligner que la fonction message que nous avons créée est plutôt perçue comme étant une procédure. En effet, certains langages de programmation différencient bien les procédures des fonctions. En réalité, il s'agit de la même chose et la seule différence entre les deux c'est qu'une procédure exécute un traitement et ne renvoie aucune valeur alors qu'une fonction en renvoie une. On dit qu'elle retourne une valeur. Par exemple, la fonction prédéfinie len retourne une valeur qui correspond à la longueur de la liste ou la chaîne de caractères qui lui est passée en argument. Cette longueur n'est pas affichée, mais elle est juste retournée au moment de l'appel de la fonction len, et c'est à nous d'en faire ce qu'on veut, donc on peut l'afficher, l'affecter à une variable ou l'inclure dans une expression selon nos besoins. Pour plus d'informations sur le sujet, je vous invite à regarder ma vidéo sur les fonctions et procédures dans la série consacrée à l'algorithmique. Reprenons l'exemple du message affiché avec une bordure. La fonction que nous avons créée affiche directement à l'écran le message souhaité avec une bordure de notre choix. Cette fois, nous allons la transformer de telle sorte à ce qu'elle n'affiche pas le message, mais elle va plutôt nous retourner ce message-là. Ensuite, c'est à nous de l'afficher si on veut. Rappelez-vous que notre affichage est constitué de 3 éléments: la bordure supérieure représentée par la variable bordure, le message entouré par une barre verticale et un espace des deux côtés, et enfin, la bordure inférieure représentée par la même variable bordure. Notez également qu'il faut inclure un saut de ligne entre ces éléments-là. Je vais opter pour une variable nommée message et qui contiendra ces 3 éléments que l'on va juste concaténer, sans oublier le retour à la ligne que l'on va expliciter à l'aide du mot-clé \n. Il suffit ensuite de retourner la valeur de cette variable-là à l'aide du mot-clé return. Donc, à l'appel de la fonction message, la valeur stockée dans la variable bordure est retournée, mais elle n'est pas affichée. Donc, on va placer l'appel de notre fonction dans la fonction print pour dire à l'interpréteur que l'on souhaite afficher la valeur retournée par celle-ci. Il est possible que la fonction retourne plus qu'une valeur, il suffit pour cela d'utiliser une séquence comme un tuple ou une liste. Si on opte pour une liste, alors on va par exemple placer chaque élément de l'affichage dans une liste et qui sera retournée comme ceci. Au lieu d'afficher chaque élément de la liste en utilisant un indice, ce qui représentera beaucoup de code, on va juste utiliser la méthode join en utilisant \n comme séparateur comme ceci. J'aimerais souligner que le fait de retourner une valeur par une fonction met aussitôt fin à celle-ci. C'est-à-dire que le traitement de la fonction s'arrête immédiatement. C'est pour cette raison que l'on place souvent le return comme dernière instruction de la fonction pour être sûr que toutes les instructions précédentes ont été exécutées avant d'arrêter la fonction. Néanmoins, il arrive parfois que l'on place le return un peu en avant, ce qui signifie que son exécution empêchera les instructions qui la suivent de s'exécuter. Nous allons voir un exemple dans quelques instants. Notez également que l'on peut appeler une fonction dans une autre. Le principe de fonctionnement reste le même. Cependant, il arrive parfois que l'on appelle une fonction depuis son corps. On parle alors de récursivité ou fonction récursive. La récursivité donne lieu à un traitement itératif exactement comme le font les boucles While et For. À titre d'exemple, imaginez que l'on souhaite calculer la factorielle d'un entier positif. Avec une boucle, il s'agit d'un classique, mais avec une fonction récursive on va procéder ainsi: On définit la fonction nommée fact qui accueille la variable n comme argument. Bien entendu, n est le nombre dont on veut calculer la factorielle. On sait que la factorielle de 0 vaut 1, donc on va placer une condition comme ceci. Autrement dit, si n vaut 0 alors on retourne 1. Notez que l'instruction return arrête aussitôt la fonction. Maintenant, si n n'est pas nul alors sa factorielle vaut n fois fois etc. Mais nous allons plutôt calculer ce produit par récursivité comme ceci En effet, nous avons retourné n multiplié par fact , c'est-à-dire qu'on arrête la fonction puisqu'on a un return, mais on la rappelle juste après en lui passant comme argument n- 1. Cet appel s'enchaînera jusqu'à ce que la valeur passée en argument soit égale à 0, ce qui rend notre condition vraie, donc 1 sera retourné comme dernière valeur. Si on affiche la factorielle de 5 on obtient 120, et la factorielle de 0 vaut 1. Je n'ai pas trop détaillé la logique derrière les fonctions récursives par souci de temps, mais en cas de besoin, je vous recommande ma vidéo sur la récursivité dans la série consacrée à l'algorithmique où j'ai traité le même exemple mais avec plus de détails. Merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









