- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte personDéfinir les fonctions au bon endroit
Dans cette vidéo, je vais vous apporter quelques précisions sur la façon dont Python va garder vos fonctions en mémoire, et ce que cela peut impliquer au niveau de l'agencement de votre code et des erreurs potentielles qui peuvent en découler.
Imaginons que j'essaie d'appeler au début de mon script, une fonction créée un peu plus bas qui s'appelle test()
, et qui va tout simplement afficher la chaîne de caractères "Bonjour".
test()
def test():
print("Bonjour")
Si je sauvegarde et que je lance le script, on a une erreur de type NameError
qui nous indique que le nom test
n'est pas défini.
C'est tout à fait normal puisque Python va lire notre script ligne par ligne. Il va commencer par essayer d'exécuter cette fonction test()
, alors qu'à ce moment-là, elle n'existe pas encore. On a cette erreur NameError
qui nous dit que ce nom n'est pas reconnu, et que le script ne peut donc pas être exécuté. En effet, c'est uniquement par la suite qu'on définit cette fonction et que Python sait donc à quoi correspond le nom test
.
Il faudrait que je mette ma fonction au tout début de mon script pour pouvoir ensuite l'appeler.
def test():
print("Bonjour")
test()
Si je sauvegarde et que je relance le script, ça fonctionne et on a bien "Bonjour" qui est affiché.
Je vais vous montrer un autre exemple, un peu plus avancé, qui va peut-être vous surprendre. Imaginons que dans cette fonction test()
, je n'affiche pas directement "Bonjour", mais j'appelle une autre fonction qui va s'appeler par exemple affiche_bonjour()
. Je peux très bien appeler une fonction à l'intérieur d'une autre fonction.
Mais je vais définir cette fonction affiche_bonjour()
plus bas dans le script.
def test():
affiche_bonjour()
def affiche_bonjour():
print("Bonjour")
test()
On pourrait penser que ça ne va pas fonctionner, parce qu'au moment où on arrive à la ligne affiche_bonjour()
, comme Python exécute notre script ligne par ligne, on a un nom qui n'est pas encore défini, tout comme on vient de le voir dans le premier exemple avec la fonction test()
.
On pourrait penser que Python va arriver sur cette ligne et se dire, affiche_bonjour()
je ne sais pas ce que c'est, et nous retourner donc une erreur de type 'NameError'. Pourtant, si je lance le script, on a quand même "Bonjour" qui est affiché et on n'a aucune erreur.
Alors pourquoi ?
Il faut comprendre que Python ne va pas exécuter la ligne affiche_bonjour()
.
Quand on arrive à la définition d'une fonction, Python va définir ce que la fonction doit faire et stocker cela dans sa mémoire, mais il ne va pas exécuter la fonction.
La fonction sera exécutée uniquement à la fin du script, lorsqu'on exécute notre fonction test()
en l'appelant avec les parenthèses pour exécuter son contenu. Et la fonction affiche_bonjour()
est déjà définie, elle est dans la mémoire de Python.
C'est vraiment ce qu'il faut retenir dans cette vidéo. L'ordre dans lequel on écrit les choses a une importance, mais il ne faut pas penser que Python va exécuter ce qui est contenu à l'intérieur de nos fonctions à chaque fois qu'on les définit.
Je pourrais très bien par exemple afficher une variable qui n'existe pas dans ma fonction, et tant que je ne l'appelle pas, ça ne posera aucun problème.
def test():
affiche_bonjour()
print(a)
def affiche_bonjour():
print("Bonjour")
Dans le script ci-dessus, on a potentiellement une erreur, mais tant que cette fonction n'est pas exécutée, l'erreur ne sera pas affichée. Si je lance mon script, Python va mettre en mémoire ces deux fonctions, mais il ne va pas les appeler. Il sait que si jamais on appelle test()
, il va appeler affiche_bonjour()
et printer a
, et que si on appelle affiche_bonjour()
, il va printer "Bonjour". C'est vraiment tout ce qu'il sait, et il n'a pas encore eu l'occasion de vérifier si ces fonctions marchent ou pas.
Par contre, si j'appelle la fonction test()
, je vais me retrouver avec une erreur de type NameError
puisque la variable a
n'est pas définie.
Donc avec cet exemple, vous voyez également la différence entre des langages qui vont être compilés et un langage comme Python qui est interprété. Si on n'appelle pas la fonction test()
, on a un script qui semble valide, mais qui potentiellement pourrait retourner des erreurs. Alors que dans le cas de langages compilés, ce genre d'erreurs serait détecté en amont, puisque le compilateur serait capable de se rendre compte que cette variable n'existe pas. Avec Python, tant qu'on n'a pas exécuté la fonction, Python ne peut pas savoir si l'objet existe ou non.
En règle générale, je vous conseillerais donc de toujours définir vos fonctions au début du fichier pour ne pas avoir ce genre de problème. Ainsi, vous pouvez appeler toutes les fonctions à la fin de votre fichier et vous pouvez être assuré de ne pas utiliser une fonction qui n'est pas encore définie dans la mémoire de Python.
Ce n'est pas fini...
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.