diff --git a/Notebooks/03_fonction_simple.ipynb b/Notebooks/03_fonction_simple.ipynb index 81431a6ebc8dd6486396209e047359b83905af3e..b44f6d74ebc7afb26a2766049def6981065ef0e0 100755 --- a/Notebooks/03_fonction_simple.ipynb +++ b/Notebooks/03_fonction_simple.ipynb @@ -1 +1 @@ -{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Fonctions EN COURS D'ECRITURE - BROUILLON - BROUILLON - BROUILLON !!!"},{"metadata":{},"cell_type":"markdown","source":"Rappel de quelques fonction de Turtle avec des exemples qui pourront vous servir\n\n| Fonction |Exemple|Commentaire|\n|:-------- |:------|:----------|\n|forward(x)|forward(150)|Trace un trait de 150 points|\n|backward(x)|backward(150)|Trace un trait “à reculons” de 150 points|\n|left(n)|left(60)|Tourne sur place la tortue de 60° à gauche|\n|right(n)|right(60)|Tourne sur place la tortue de 60° à droite|\n|width(x)|width(5)|Change l’épaisseur à 5 points|\n|color(\"c\")|color(\"yellow\")|Change la couleur du trait (mais aucun trait n’est tracé à ce moment). Notez les guillemets !|\n|penup()|penup()|Lève la tortue (permet de se déplacer sans dessiner)|\n|pendown()|pendown()|Baisse le stylo|\n|circle(R, A)|circle(100, 180)|Dessine un demi-cercle (angle de 180°) de rayon 100 points|\n"},{"metadata":{},"cell_type":"markdown","source":"# Définir - `def`\n\nDans ce chapitre, nous allons découvrir comment augmenter le vocabulaire de notre langage de programmation en définissant de nouvelles instructions, qu'on appelle aussi **fonction**. Ceci permet de rendre un code plus compact, mais surtout plus lisible. Nous allons voir que :\n\n- le mot-clé `def` permet de nommer (définir) une séquence,\n- le bloc qui suit doit être en **indentation** (décalé à droite),"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> Quizz </h3> \n \n```\nUne fonction permet de\n\nA) donner un nom à une séquence\nB) augmenter le vocabulaire du langage de programmation\nC) nous dire si ça fonctionne\nD) rendre un programme plus lisible\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary> \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nA) donner un nom à une séquence\n\nB) augmenter le vocabulaire du langage de programmation\n\nD) rendre un programme plus lisible\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Nommer une séquence\n\nDessiner un rectangle est assez utile. C'est une forme qu'on pourra réutiliser certainement souvent. Il serait pratique de définir un nom pour ces 8 lignes de code. Pouvons-nous définir de nouvelles commandes ?"},{"metadata":{"trusted":false},"cell_type":"code","source":"forward(160)\nleft(90)\nforward(100)\nleft(90)\nforward(160)\nleft(90)\nforward(100)\nleft(90)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Oui, c'est possible. Avec le mot-clé `def`, nous pouvons définir une nouvelle commande que nous pouvons par exemple appeler `rectangle()`.\nCette façon de créer un raccourci est appelée **définir** une fonction.\nLe code à exécuter suit l'expression `def rectangle():` et se trouve en **indentation** (décalé vers la droite).\n\nEnsuite, il suffit d'écrire `rectangle()` pour dessiner un rectangle. On appelle ceci **appeler** une fonction.\nRappelez-vous ceci :\n\n- on définit une fonction une seule fois,\n- on appelle une fonction autant de fois que l'on veut,\n- si on ne l'appelle pas, elle n'est pas exécutée et il ne se passe rien.\n\nDéfinir une fonction nous permet de réduire le nombre de lignes de code nécessaires.\nChaque fois que nous utilisons `rectangle()`,\nau lieu d'écrire 8 lignes, nous écrivons seulement une ligne de code."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 1 </h3>\n\nDessinez encore d'autres rectangles en appelant la nouvelle fonction `rectangle()`.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef rectangle():\n forward(160)\n left(90)\n forward(100)\n left(90)\n forward(160)\n left(90)\n forward(100)\n left(90)\n\nrectangle()\nleft(90)\nrectangle()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> Quizz </h3> \n \n```\nRappel: Une indentation de texte est\n\nA) un décalage vers la gauche\nB) un décalage vers la droite\nC) une mise en paragraphe\nD) une mise en sous-section\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary> \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nB) un décalage vers la droite\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Donner du sens\n\nUne fonction ne permet pas seulement d'économiser des lignes de code.\nElle permet aussi de structurer le code et de lui donner un sens. Considérez par exemple le code ci-dessous. Il est presque impossible de comprendre ce que fait le programme en regardant les 17 lignes de code.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(30)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Si nous observons la tortue, nous comprenons finalement qu'elle dessine deux fois un rectangle. Nous pouvons même interpréter cette image et donner le sens de bâtiment au premier rectangle, et de porte au second.\n\nEssayons maintenant de découper le code en **sous-programmes** en utilisant deux fonctions `batiment()` et `porte()`.\nEn regardant ces 3 lignes de code, on comprend immédiatement le sens du programme.\n\n``` python\nbatiment()\nforward(30) # repositionner la tortue\nporte()\n```\n\nLa définition d'une fonction permet d'ajouter de nouveaux mots à un langage de programmation. Contrairement aux commandes natives de Python qui sont toutes en anglais, nous sommes libres de les choisir en français.\n\n**Attention** : écrivez les fonctions sans accents et sans circonflexes : `batiment()`, `carre()`, `boite()`.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 2 </h3>Ajoutez une deuxième porte au bâtiment. Ensuite, faites-en une porte double.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef batiment():\n forward(200)\n left(90)\n forward(100)\n left(90)\n forward(200)\n left(90)\n forward(100)\n left(90)\n\ndef porte():\n forward(30)\n left(90)\n forward(50)\n left(90)\n forward(30)\n left(90)\n forward(50)\n left(90)\n\nbatiment()\nforward(30)\nporte()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> Quizz </h3> \n\nÀ combien de lignes de code la fonction `porte()` est-elle équivalente ?\n\n\n```\nA) 1 ligne\nB) 2 lignes\nC) 8 lignes\nD) 17 lignes\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary> \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nC) 8 lignes\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Définir une fonction\n\nLe fait de donner un nom à une séquence d'instructions est appelé **définir une fonction**. Une **définition de fonction** comporte :\n\n1. le mot-clé `def` (définir),\n1. le nom de la fonction (`batiment/porte`),\n1. les parenthèses `()`,\n1. le deux-points `:`,\n1. un bloc en indentation.\n\nQu'est-ce qu'un bloc en indentation ?\nC'est un bloc de texte qui comporte des espaces vides à gauche. En Python, ces espaces apparaissent en multiples de 4.\n\nL'indentation est très importante en Python. C'est l'indentation qui indique l'étendue des instructions qui font partie de la fonction.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> Quizz </h3> \n \n```\nParmi les 4 définitions de fonction ci-dessous, laquelle est correcte ?\n\nA) def() rectangle:\nB) def: rectangle\nC) def rectangle():\nD) def(rectangle):\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary> \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nC) def rectangle():\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Indenter avec un raccourci\n\nComme l'indentation est tellement importante en Python, il en existe un raccourci.\nIl faut d'abord sélectionner **les lignes** de code dont vous voulez changer l'indentation.\nEnsuite, vous appuyez sur :\n\n- la touche **tab** pour augmenter l'indentation\n- la touche **maj+tab** pour diminuer l'indentation\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 3 </h3>Essayez ces raccourcis dans le code ci-dessous. Transformez le code en deux fonctions `batiment()` et `porte()`, que vous appelez ensuite.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(30)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Voici encore un raccourci très utile : **maj(ou Shift)+Enter** pour exécuter le code.\n\n"},{"metadata":{},"cell_type":"markdown","source":"## Maison avec porte\n\nUne fois qu'une fonction est définie, elle peut être utilisée partout, même dans la définition d'une autre fonction.\n\nIci, nous avons une fonction `porte()`, qui est utilisée à l'intérieur d'une deuxième fonction `maison()`. Pour que ceci soit possible, la définition de porte doit être placée avant la définition de `maison()`.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 4 </h3>Déplacez la porte vers le milieu de la maison, et dessinez une deuxième maison à coté.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef porte():\n forward(20)\n left(90)\n forward(40)\n left(90)\n forward(20)\n left(90)\n forward(40)\n left(90)\n\ndef maison():\n forward(100)\n left(90)\n forward(60)\n left(45)\n forward(71)\n left(90)\n forward(71)\n left(45)\n forward(60)\n left(90)\n porte()\n\nmaison()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Plus sur \"La tortue\"\n"},{"metadata":{},"cell_type":"markdown","source":"### Le point `dot()`\n\nLa fonction `dot()` dessine un point à la position actuelle de la tortue."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 5 </h3>Ajoutez un point (`dot`) au sommet du triangle.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef triangle():\n dot()\n forward(100)\n left(120)\n dot()\n forward(100)\n left(120)\n forward(100)\n\ntriangle()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Lever le stylo\n\nLes deux commandes `up()` et `down()` permettent de lever et de baisser le stylo.\nCeci nous permet de dessiner des formes séparées, comme ici le petit i avec son point.\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 6 </h3>Transformez le i vers un i avec trema (deux points).\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef i():\n dot()\n pendown() # poser le stylo\n left(90)\n forward(50)\n penup() # lever le stylo\n forward(50)\n dot()\n backward(2*50)\n right(90)\n forward(50/2) # avancer à la prochaine lettre\n\ni()\ni()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exercices d'entraînement\n\n<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 7 </h3>\n\nCréez une fonction `paquebot()` et dessinez-en un deuxième.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(80)\nforward(60)\nleft(100)\nforward(220)\nleft(100)\nforward(60)\n\npenup()\nleft(125)\nforward(30)\nright(45)\n\nfor i in range(6):\n pendown()\n circle(10, 360)\n penup()\n forward(30)\n \n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 8 </h3>Coloriez la fleur.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef petale():\n for _ in range(2):\n circle(100, 120)\n left(60)\n\nfor _ in range(6):\n petale()\n left(60)\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 9 </h3>\n\nAjoutez une fonction `m()` pour écrire le mot `nom`. Ajoutez ensuite des fonctions qui dessinent les lettres pour écrire votre prénom.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\nwidth(5)\nr = 30\n\ndef n():\n down()\n left(90)\n forward(2*30) # montée\n backward(30) # retour au milieu\n circle(-30, 180) # demi-cercle\n forward(30) # descente\n left(90)\n up()\n forward(30) # avance vers la prochaine lettre\n\ndef o():\n forward(30) # avance vers milieu\n down()\n circle(30)\n up()\n forward(2*30) # avance vers prochaine lettre\n\nn()\no()\nn()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 10</h3>\n\nAvec des rails de chemin de fer, dessinez un circuit en forme d'un rond (deux rails avec les traverses).\n\n\nUtilisez une boucle `for` pour la répétition des traverses.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n# Prénom Nom, classe\n\ndef traverse():\n ...\n\nforward(200)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 11</h3>\n\nDessinez et coloriez un jardin. Définissez des fonctions pour des pétales, feuilles et fleurs.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n# Prénom Nom, classe\n\ndot(1000, 'lightgreen') # background\n\ndef petale():\n ...\ndef feuille():\n ...\ndef fleur():\n dot(50, 'red')\n\nfeuille()\nforward(200)\nfleur()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 11 (meubles) </h3>\n\nDéfinissez 3 fonctions pour dessiner une chaise, une table et un lit.\nEnsuite placez plusieurs meubles dans l'espace\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef chaise():\n # à compléter...\n\ndef table():\n # à compléter...\n\ndef lit():\n # à compléter...\n\nchaise()\ntable()\nlit()\n\ndone()\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"}},"nbformat":4,"nbformat_minor":2} \ No newline at end of file +{"cells":[{"metadata":{},"cell_type":"markdown","source":"<div class = \"alert alert-danger\"> \n \nAttention: **veillez à bien sauvegarder votre travail** dans le bon dossier du disque réseau (dossier document) avec le bon nom (et l'extension *.ipynb*), **sinon toutes les modifications seront perdues!**\n\nPour reprendre votre travail, il suffit d'ouvrir le fichier .ipynb en cliquant sur *Fichier ouvrir*\n</div>"},{"metadata":{},"cell_type":"markdown","source":"# Le fonctions simples (brouillon)"},{"metadata":{},"cell_type":"markdown","source":"Rappel de quelques fonction de Turtle avec des exemples qui pourront vous servir\n\n| Fonction |Exemple|Commentaire|\n|:-------- |:------|:----------|\n|forward(x)|forward(150)|Trace un trait de 150 points|\n|backward(x)|backward(150)|Trace un trait “à reculons” de 150 points|\n|left(n)|left(60)|Tourne sur place la tortue de 60° à gauche|\n|right(n)|right(60)|Tourne sur place la tortue de 60° à droite|\n|width(x)|width(5)|Change l’épaisseur à 5 points|\n|color(\"c\")|color(\"yellow\")|Change la couleur du trait (mais aucun trait n’est tracé à ce moment). Notez les guillemets !|\n|penup()|penup()|Lève la tortue (permet de se déplacer sans dessiner)|\n|pendown()|pendown()|Baisse le stylo|\n|circle(R, A)|circle(100, 180)|Dessine un demi-cercle (angle de 180°) de rayon 100 points|\n|stamp()|stamp()|Laisse une impression de la tortue à sa position actuelle|\n|shape(forme)|shape('circle')|Change la forme de la tortue|"},{"metadata":{},"cell_type":"markdown","source":"# Définir - `def`\n\nDans ce chapitre, nous allons découvrir comment augmenter le vocabulaire de notre langage de programmation en définissant de nouvelles instructions, qu'on appelle aussi **fonction**. Ceci permet de rendre un code plus compact, mais surtout plus lisible. Nous allons voir que :\n\n- le mot-clé `def` permet de nommer (définir) une séquence,\n- le bloc qui suit doit être en **indentation** (décalé à droite),"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> Quizz </h3> \n \n```\nUne fonction permet de\n\nA) donner un nom à une séquence\nB) augmenter le vocabulaire du langage de programmation\nC) nous dire si ça fonctionne\nD) rendre un programme plus lisible\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary> \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nA) donner un nom à une séquence\n\nB) augmenter le vocabulaire du langage de programmation\n\nD) rendre un programme plus lisible\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Nommer une séquence\n\nDessiner un rectangle est assez utile. C'est une forme qu'on pourra réutiliser certainement souvent. Il serait pratique de définir un nom pour ces 8 lignes de code. Pouvons-nous définir de nouvelles commandes ?"},{"metadata":{"trusted":false},"cell_type":"code","source":"forward(160)\nleft(90)\nforward(100)\nleft(90)\nforward(160)\nleft(90)\nforward(100)\nleft(90)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Oui, c'est possible. Avec le mot-clé `def`, nous pouvons définir une nouvelle commande que nous pouvons par exemple appeler `rectangle()`.\nCette façon de créer un raccourci est appelée **définir** une fonction.\nLe code à exécuter suit l'expression `def rectangle():` et se trouve en **indentation** (décalé vers la droite).\n\nEnsuite, il suffit d'écrire `rectangle()` pour dessiner un rectangle. On appelle ceci **appeler** une fonction.\nRappelez-vous ceci :\n\n- on définit une fonction une seule fois,\n- on appelle une fonction autant de fois que l'on veut,\n- si on ne l'appelle pas, elle n'est pas exécutée et il ne se passe rien.\n\nDéfinir une fonction nous permet de réduire le nombre de lignes de code nécessaires.\nChaque fois que nous utilisons `rectangle()`,\nau lieu d'écrire 8 lignes, nous écrivons seulement une ligne de code."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 1 </h3>\n\nDessinez encore d'autres rectangles en appelant la nouvelle fonction `rectangle()`.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef rectangle():\n forward(160)\n left(90)\n forward(100)\n left(90)\n forward(160)\n left(90)\n forward(100)\n left(90)\n\nrectangle()\nleft(90)\nrectangle()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> Quizz </h3> \n \n```\nRappel: Une indentation de texte est\n\nA) un décalage vers la gauche\nB) un décalage vers la droite\nC) une mise en paragraphe\nD) une mise en sous-section\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary> \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nB) un décalage vers la droite\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Donner du sens\n\nUne fonction ne permet pas seulement d'économiser des lignes de code.\nElle permet aussi de structurer le code et de lui donner un sens. Considérez par exemple le code ci-dessous. Il est presque impossible de comprendre ce que fait le programme en regardant les 17 lignes de code.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(30)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Si nous observons la tortue, nous comprenons finalement qu'elle dessine deux fois un rectangle. Nous pouvons même interpréter cette image et donner le sens de bâtiment au premier rectangle, et de porte au second.\n\nEssayons maintenant de découper le code en **sous-programmes** en utilisant deux fonctions `batiment()` et `porte()`.\nEn regardant ces 3 lignes de code, on comprend immédiatement le sens du programme.\n\n``` python\nbatiment()\nforward(30) # repositionner la tortue\nporte()\n```\n\nLa définition d'une fonction permet d'ajouter de nouveaux mots à un langage de programmation. Contrairement aux commandes natives de Python qui sont toutes en anglais, nous sommes libres de les choisir en français.\n\n**Attention** : écrivez les fonctions sans accents et sans circonflexes : `batiment()`, `carre()`, `boite()`.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 2 </h3>Ajoutez une deuxième porte au bâtiment. Ensuite, faites-en une porte double.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef batiment():\n forward(200)\n left(90)\n forward(100)\n left(90)\n forward(200)\n left(90)\n forward(100)\n left(90)\n\ndef porte():\n forward(30)\n left(90)\n forward(50)\n left(90)\n forward(30)\n left(90)\n forward(50)\n left(90)\n\nbatiment()\nforward(30)\nporte()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> Quizz </h3> \n\nÀ combien de lignes de code la fonction `porte()` est-elle équivalente ?\n\n\n```\nA) 1 ligne\nB) 2 lignes\nC) 8 lignes\nD) 17 lignes\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary> \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nC) 8 lignes\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Définir une fonction\n\nLe fait de donner un nom à une séquence d'instructions est appelé **définir une fonction**. Une **définition de fonction** comporte :\n\n1. le mot-clé `def` (définir),\n1. le nom de la fonction (`batiment/porte`),\n1. les parenthèses `()`,\n1. le deux-points `:`,\n1. un bloc en indentation.\n\nQu'est-ce qu'un bloc en indentation ?\nC'est un bloc de texte qui comporte des espaces vides à gauche. En Python, ces espaces apparaissent en multiples de 4.\n\nL'indentation est très importante en Python. C'est l'indentation qui indique l'étendue des instructions qui font partie de la fonction.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> Quizz </h3> \n \n```\nParmi les 4 définitions de fonction ci-dessous, laquelle est correcte ?\n\nA) def() rectangle:\nB) def: rectangle\nC) def rectangle():\nD) def(rectangle):\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary> \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nC) def rectangle():\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Indenter avec un raccourci\n\nComme l'indentation est tellement importante en Python, il en existe un raccourci.\nIl faut d'abord sélectionner **les lignes** de code dont vous voulez changer l'indentation.\nEnsuite, vous appuyez sur :\n\n- la touche **tab** pour augmenter l'indentation\n- la touche **maj+tab** pour diminuer l'indentation\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 3 </h3>Essayez ces raccourcis dans le code ci-dessous. Transformez le code en deux fonctions `batiment()` et `porte()`, que vous appelez ensuite.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(30)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Voici encore un raccourci très utile : **maj(ou Shift)+Enter** pour exécuter le code.\n\n"},{"metadata":{},"cell_type":"markdown","source":"## Maison avec porte\n\nUne fois qu'une fonction est définie, elle peut être utilisée partout, même dans la définition d'une autre fonction.\n\nIci, nous avons une fonction `porte()`, qui est utilisée à l'intérieur d'une deuxième fonction `maison()`. Pour que ceci soit possible, la définition de porte doit être placée avant la définition de `maison()`.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 4 </h3>Déplacez la porte vers le milieu de la maison, et dessinez une deuxième maison à coté.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef porte():\n forward(20)\n left(90)\n forward(40)\n left(90)\n forward(20)\n left(90)\n forward(40)\n left(90)\n\ndef maison():\n forward(100)\n left(90)\n forward(60)\n left(45)\n forward(71)\n left(90)\n forward(71)\n left(45)\n forward(60)\n left(90)\n porte()\n\nmaison()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Plus sur \"La tortue\"\n"},{"metadata":{},"cell_type":"markdown","source":"### Le point `dot()`\n\nLa fonction `dot()` dessine un point à la position actuelle de la tortue."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 5 </h3>Ajoutez un point (`dot`) au sommet du triangle.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef triangle():\n dot()\n forward(100)\n left(120)\n dot()\n forward(100)\n left(120)\n forward(100)\n\ntriangle()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Lever le stylo\n\nLes deux commandes `up()` et `down()` permettent de lever et de baisser le stylo.\nCeci nous permet de dessiner des formes séparées, comme ici le petit i avec son point.\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 6 </h3>Transformez le i vers un i avec trema (deux points).\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef i():\n dot()\n pendown() # poser le stylo\n left(90)\n forward(50)\n penup() # lever le stylo\n forward(50)\n dot()\n backward(2*50)\n right(90)\n forward(50/2) # avancer à la prochaine lettre\n\ni()\ni()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exercices d'entraînement\n\n<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 7 </h3>\n\nCompléter le programme ci-dessous en utilisant (en appelant) la fonction `forme_mystere()` pour pour créer le dessin suivant:\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"# permet d'utiliser les fonctions pour dessiner\nfrom turtle import *\n\n# Définition de la fonction mystère\ndef forme_mystere():\n for k in range(4):\n forward(100)\n right(90)\n\n### Écrivez votre code ci-dessous\n\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 8 </h3>\n\n1. Testez le programme suivant."},{"metadata":{"trusted":true},"cell_type":"code","source":"# permet d'utiliser les fonctions pour dessiner\nfrom turtle import *\n\n# Code à factoriser\nfor k in range(6):\n forward(200)\n right(60)\nright(60)\nfor k in range(6):\n forward(200)\n right(60)\nright(60)\nfor k in range(6):\n forward(200)\n right(60)\nright(60)\nfor k in range(6):\n forward(200)\n right(60)\nright(60)\nfor k in range(6):\n forward(200)\n right(60)\nright(60)\nfor k in range(6):\n forward(200)\n right(60)\nright(60)\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Définissez une fonction `hexagone()` qui permet de tracer des hexagones et utilisez-là pour réduire le nombre d’instructions du programme précédent."},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 9 </h3>\n\nCréez une fonction `paquebot()` et utilisez pour dessiner deux paquebots."},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(80)\nforward(60)\nleft(100)\nforward(220)\nleft(100)\nforward(60)\n\npenup()\nleft(125)\nforward(30)\nright(45)\n\nfor i in range(6):\n pendown()\n circle(10, 360)\n penup()\n forward(30)\n \n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 10 </h3>Coloriez la fleur.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef petale():\n for _ in range(2):\n circle(100, 120)\n left(60)\n\nfor _ in range(6):\n petale()\n left(60)\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 11 </h3>\n\nAjoutez une fonction `m()` pour écrire le mot `nom`. Ajoutez ensuite des fonctions qui dessinent les lettres pour écrire votre prénom.\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\nwidth(5)\nr = 30\n\ndef n():\n down()\n left(90)\n forward(2*30) # montée\n backward(30) # retour au milieu\n circle(-30, 180) # demi-cercle\n forward(30) # descente\n left(90)\n up()\n forward(30) # avance vers la prochaine lettre\n\ndef o():\n forward(30) # avance vers milieu\n down()\n circle(30)\n up()\n forward(2*30) # avance vers prochaine lettre\n\nn()\no()\nn()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 12</h3>\n\nAvec des rails de chemin de fer, dessinez un circuit en forme d'un rond (deux rails avec les traverses).\n\n\nUtilisez une boucle `for` pour la répétition des traverses.\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n# Prénom Nom, classe\n\ndef traverse():\n ...\n\nforward(200)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 13</h3>\n\nDessinez et coloriez un jardin. Définissez des fonctions pour des pétales, feuilles et fleurs.\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n# Prénom Nom, classe\n\ndot(1000, 'lightgreen') # background\n\ndef petale():\n ...\ndef feuille():\n ...\ndef fleur():\n dot(50, 'red')\n\nfeuille()\nforward(200)\nfleur()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 14 (meubles) </h3>\n\nDéfinissez 3 fonctions pour dessiner une chaise, une table et un lit.\nEnsuite placez plusieurs meubles dans l'espace\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef chaise():\n # à compléter...\n\ndef table():\n # à compléter...\n\ndef lit():\n # à compléter...\n\nchaise()\ntable()\nlit()\n\ndone()\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"}},"nbformat":4,"nbformat_minor":2} \ No newline at end of file diff --git a/Notebooks/imgs_chap3/quatre_carres.png b/Notebooks/imgs_chap3/quatre_carres.png new file mode 100644 index 0000000000000000000000000000000000000000..5751882ead683196a11b14ebde096b3aee9e77ee Binary files /dev/null and b/Notebooks/imgs_chap3/quatre_carres.png differ