From f2a63d6309f7e5a734670ab0f5c31d53c2013822 Mon Sep 17 00:00:00 2001 From: Mathieu Schiess <mathieu.schiess@edu.ge.ch> Date: Thu, 3 Oct 2024 17:56:40 +0200 Subject: [PATCH] Ajout d'exercices au NB sur les fonctions simples de la banque de questions --- Notebooks/03_fonction_simple.ipynb | 2 +- Notebooks/imgs_chap3/croix.png | Bin 0 -> 2643 bytes Notebooks/imgs_chap3/maison.png | Bin 0 -> 10365 bytes Notebooks/imgs_chap3/triangles.png | Bin 0 -> 12836 bytes 4 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 Notebooks/imgs_chap3/croix.png create mode 100644 Notebooks/imgs_chap3/maison.png create mode 100644 Notebooks/imgs_chap3/triangles.png diff --git a/Notebooks/03_fonction_simple.ipynb b/Notebooks/03_fonction_simple.ipynb index b44f6d7..62ed921 100755 --- a/Notebooks/03_fonction_simple.ipynb +++ b/Notebooks/03_fonction_simple.ipynb @@ -1 +1 @@ -{"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 +{"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":true},"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":true},"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":true},"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":true},"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\nCompléter le programme ci-dessous en ajoutant des appels à 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\nforme_mystere()\n# à compléter \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\nTestez le programme ci-dessous, puis modifiez le en définissant au début une fonction `carre100()` qui dessine un carré de longueur 100 afin d'obtenir un programme structuré sans répétition inutile."},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\n\nfor _ in range(4):\n forward(100)\n left(90)\n\n\nleft(180)\n\n\nfor _ in range(4):\n forward(100)\n left(90)\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>\nDans le programme ci-dessous:\n\n1. Définissez une fonction `triangle100()` pour dessiner un triangle équilatéral de côté 100 comme dans l’illustration A.\n \n2. Utilisez `triangle100()` pour dessiner une forme comme dans l’illustration B.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\n# à compléter\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\nUtilisez les commandes `carre100()` et `triangle100()` définies dans les exercices 9 et 10 pour dessiner une figure semblable à celle représentée ci-dessous.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\n# à compléter\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 12 </h3>\n\nDans le programme ci-dessous:\n\n1. Définissez une fonction `carre_ouvert()` qui dessine un carré ouvert comme dans l’illustration A.\n\n \n2. Utilisez `triangle100()` pour dessiner une croix comme dans l’illustration B.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\n# à compléter\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\nCréez une fonction `paquebot()` et utilisez pour dessiner deux paquebots."},{"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 10 </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 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":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 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":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 13</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 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":true},"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/croix.png b/Notebooks/imgs_chap3/croix.png new file mode 100644 index 0000000000000000000000000000000000000000..4f935b6bb836f4d17266f4e46e03798468cf6231 GIT binary patch literal 2643 zcmeAS@N?(olHy`uVBq!ia0y~yV5(zaU}WTAVqjp%)U)5mz`(#+;1OBOz`%C|gc+x5 z^GP!>aIt#2IEGZrd3!fI=jvD4;~(#9rUuMlv&xn*7FPO{5W}Ofy)*dck~?R5jBkpS zS}iwz<uWbj^tKf7$wv*vMP+Vovb{Mcl12P`!k0E~i8(0}w~Z2=Sa^;!Dm@KaI!)w- zWp#l2ob4AsJ^y{ZIBvbW`f~M$ljkgZ|M_=uRg}h5FHVMzpsC*(7*^<9;$~R5M4Z9N zQ=g$_QXB(^>Rtu`uPR1`DPNczG+wec1Q1kkwUYnDnH`47pXU{%y}h$n`#tA@m7jz= z`5#>2W>|RY`IXztb>cgw{ym+p5niYCao!xL;VUlhdT{4&+V_X&4r?ymeBSQ&n$71< zWe5dCT3K0j?cKZgXwt@rH@gi>UR=0!>z1N(+Y?*fa~+qx-s?}(`+IqD|FS7!I#EA9 zbcss(GHIQD6S=v{|I5DL{~jK0KR?6r@vYbEW}Da7{n4^0W}9~}Y2%L+Z}0nWmtR|F zed}(laZZHW>V~f3hd(}U-MUqC>AZRK4!85m+7xV9y*m5ut<u-m)<y4mGViGOv?sO# zM#dk$Y_t0w<L-XErBitK{hH$I>teI7uZu1DdR0=7S?iST{kTuxF6XWc$;!_C{k2Qf ze|`M_51XC}tNYIT{L|9%Tr&^vpWHCtUSG|nH>aPS_jl*%ATQqf*ts_~7CaK=YV}?g z`)T(5zh!T3Y}8!()!%mNccl|&7%o?T$}0Z5=jUf}9S=?0y>)*lD!Xr*!xpkf(YdYW z+a>Q{um86;slL~pFq3iF_O)9}|Nr~D*u8&V&BZ6)%Y3b$&nfPcwf?qUeg2s;nFAmC z`TaFTy^ro`cSvKKac|kNV^f0u?y1yVx@y&`onOCdE<JXYS5lAJLo>IouGs6Pv9Q_` zTNWeZ317szkD8v<)m-}P|33Ake}`B#m!{AAS^fOsVaYybtvhY$W;VMElNSd3cw~D0 z$zE2Fj%{1Fy}iGG|GIT~uZ{-)emB!D`PhkD6ZfiDUEi|iWQknB!m6sOf1i#Bm*1<a zUKz6M=d|c$=Vwd=`PiXu=Zc*x4VRj1-?wkotF=Y^QYIOBwSQL~4>Ma6_xI`gI@QyS z4yh6UE^Km_|C#Ld^2f)=`FlPdySKNxzpVWFwQF^cw?)6-_50nP>yFcY&Ak`2^2(=c zSD#hp@2~&Y#JXB8`sbTty|S{hrKP1ad0Dg$_r1M+zxMe;=XSZDf8|%LV!K=TT()`D z>9_i812_KqyY|ktTigC`z3$c{WBIs#{r@wwOtX)42+o~5SJ(Hf`Mob&--t1ZK2-mH zullFx^yO2!j$Y~%KE8W*|F-R0P0dVlvhw4<J!oFPXVdq6OT9ne<GA^vyz2Klv-#C| zclF=z|1TRaWttU|o}Qk3IO`?ruhsAF?DC&q|L^wunKc)m%-&b`nScNPX8ZL~Uw@nm zy?(#oa7(A~=UMEMui~rx<8tr)d-UzC{=VZ^7fuO^&c3}b{Cn@OCo6caF-~0@pmAsW zm*@X)Y)Cvm&$fSkOzHdcOQsiH*#BkQ_N{xj<=<cM%JKfsci&g7;(GrhYvmNVst1kp z=FMAntSvfkuj%fI4o|g2xPtZfRh*w^YhCu{L^XHH;`*1ld0AeXXXjXc-gbNc&w2be zuH4(VZ0XX(uURiyHwFFfyfq~#JUslKvx4;BAA3Qee(BDfpj}z-?tHI4)8xt>>@|D- z{Xg%g$J_laWYAo??b@{|mtI_4{8^6a<_q^K^R3(8SC__nz2pwxn_u<(%uM5w7Z;`k zB{%a=Wii^YY-#Fi?&x5z@N*yCnKgy~dgK=;2YY2+dg3YnL2T8m#KY@m6sLZwJa^#b zOWVSv=Y6vL`qBG-tjquU?OU8h-Jh-3Yc<~oPUsE(yC3APJ9nnoeaI@F-^wk%)x<Ra z_O`c6r^oGj(8TRmt`Hzu_iM4d{g(sHD?_Zx{#1ltpLpFmUSI6~uWZ-L%lzZ_JqmAT z=Ra4jnDR8_^6&G$vwy8K`+xsSoZ<6Rvl0*Ym6e;X%Zu3aWZq?2jw!qQdH>zmSn}q< z!De<o8H>tvU*EIK&spc6nxc9Ae#PM<o|B8_u+Ox<`o(XiRq6A0vCBW5m^EvbZgjjw zuct%m%}u%4_j`j@Ub%fcT1Ra4>ec>rE;du-=XY||M2K*;X31aiVg0a6h?3HpU~x_x z1*@#yGdi?NnWyF46PDOvRQIdw-M!Lf|2sc<zMr;M{|b-vwC`QUN)LWBG#ETBKDaYx zH@Cw~&H2Il9|E5&I_K^uX`h-He)074E8Gn7oV0NvX_ek!bptq@U8TX{d~U(q-Q`bh z6|0~AopQ9`6>CF)-(Cm1Q=eQaf^N$5p8oyP`ZBCCCa$I*te&P})U7&K&ERkol5T$( w6oCS<HE89O?`#Y!6#Vv*+EhXhz_0RN8SDxtqSQ7qFfcH9y85}Sb4q9e0FKJBdH?_b literal 0 HcmV?d00001 diff --git a/Notebooks/imgs_chap3/maison.png b/Notebooks/imgs_chap3/maison.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a73d187dbd95baeee759b575219256364d9e7c GIT binary patch literal 10365 zcmeAS@N?(olHy`uVBq!ia0y~yU{YgXV2tKqVqjp%`*CS90|NtRfk$L90|Va?5N4dJ z%_q&kpuphi;uumf=k49f3el&3zkkf1rJ&OCL7+#V*Hn;WWkU;77zdYLgs#euEmyxK zPQ10~ZzuPHgxFi$g^b&k79?p$HFnuMupCl~h+ML0OP7*@Kw)EBLz-ekBg=`-%6}4b z_|&;4TN;1YdH#1--Szie#qX9iul$+v?)Q_=y(`zQ6=h(U^PPEnJ_Cb*Zifs*gOUp$ zgM*;bbCb}iQ~P~pg@lAW`PO^DalUBHw>MuTL#Iy7yU#HvNSI6a^!fN{^WT5#Rfw5$ z+x&s9`JX@HtgNj0>mqjM9k%|+$(eVb?@f3}h{=mv*{)Ak>+i2gJ65tipS>?)XVKHU z$;Y}*R6d`3eRH_}_I&pLM}yDR@7-Ki>*(0nF=g7ceI~C}K}vsop6s6~uM@xR&E}@_ zclJtJEL^oI=(M!p&d1v>nl7BM`#ZC;((@^^0$%*9{=eXV;V<L!8}^FX$mibMQ*+bk zZ~ylm+1HQG9#HhR|2pMgVP@vb?9Xw<AJYWdPFSWs`)us(?d_WKXo=^osqF7}pTBC| zbT-RrVQ2lH$sJ3UEXjy}+SJ6f?KktX6)Q5%X>WE_G1u4E*7kN$^PO{I=iG7uOC_bJ zPoG|%U+Lyj^y_JlMCIgfe_!nFeP6q!a`Wx&Y`53M><qeXvG;#JKcB2w$nQFnrx%ak zsNkIRU$V6O+rcNtm;ZUXH1gJQ{yXLStIJz1gUsu<DS37B*~a7Y;u9AhZd<lw35WDS z#-Pwh%cmEQyQpYuYv-SsaAU^~&we{4rKL-k8qc5q^4r~ma=!}STzPr<k+9IEOPAd4 z{gD=o+?ONy`-z<6lN0Hz^D}?{PCnM_?d>f*@y3oFn*Mf*Aidh*>q>t9OK4v{zsl>j z#oy0cGH*?tx3}u)v!|TT%N!TVA78d)36GSC$8L+dLo9EZ|Gs2@r&Q!OS8@50B|W=R zr_>c55Dm|e)-UguJngpOzU24s*6F3!*8hLGu=5uCuiG~s#IHYF?fZM>qn+Yu$BxbY z^|k*;OUug3%R4<B9S>T+zP`J%UO-SOJ+f}!zWwswx-EXWZTQG*@Im?ST!qQ<^ON?> zn={8I?T!W5C(q0Fg~i3$Wj=BdJo$3E@V9P@W;WhS-%h^Y|DFHM<lTC!l#lP&zuvy{ z^`%Rfw)9T7Tz@9*@zMQuxAy$p+xx!r#1YTQul`lNe{tJA`+mRLzmNVk_Mg^ocpS0# z#*Q7&<7Q~ixn1cT;(pG1bKIrx-@mFCD*tUyGHa?`r6#iL@wSUflO|0vD!FlC7kAR* zNALbWZdM8k2sp5FuK&y98<q3_^_Iy<FH2t^XZg3tCFPg#`6<(<uij@b;gbJEL{v00 zzlZPkee)#c8}Gx`#jN}rV)*o=`m4Vyom@V(@m#!baCYZh`IpBx{+iAD>eBqWFV7Ws zC{-!D+Z$dxKjHOJw+;0#kE%yTMl!G4v1sDdTeoj`d3#%K|2)^NFS+;9rAuFmt-JbS zM3zomEIz+S(p=Bda_7XU$9fZH8UJzp&+71Zt^)7NIag;ETidVVY?ZR?<28OYE$~)< zzliKk4Jqa05j94?zFka@S)b41Kg(ibZ^C{JEv>AYdi$QbJok$e`(N0GPL``(vamNe zw#KOmEEc`Uu&C##ditOFE8BV#?q9tB@#2Yp`vPm6m|WfeCE4_uS}shuu)uN7?VZ}M zl#cJ%Ki@p1<K+J-8!elA6W()c+Zq0xzv#t@_%DxdRKGL*8r<4(<k-=d&&zl;3SF<b z_SM<d9Q*s%;IX<-g7OXVSGsnFha*ak?3{aCvOoE3&YV{e{|d%VOxCf>y!79vwKw7a zitRs+sO){wajaTD`&D6%1SmjaCteQt*y(w!H^D4!&&r99gePb0`EJL3e4`u4=Uqz6 zKRyyR&e-#PpIeu|&!Ug_9v^xZ5b;|@M0TfYl+yE_qv~oGE8eG;J`ad+e!O@3)w#}z zjIQo^ozqTS{Qg~9)6TH7H{txMa=unp5!uQx=VA?=3*CJZ0gHk{T>L^)m+sqtzv5%3 zWDZO9<dcttCu>-JTE@|zeAr-t%ia|oGJj=meEL@>Vb-*F*+)weu?rRN9Vf~kZ%cIO ztUA~~XPMai83)}qTz^rlaYkhR4421ym)|Irk#1Y0e6&g4(pT5cu=7~;`wam#NkXpf z_Y%|iT3L@RQa<-qgrnlgi{HO}wZIDc4J_LaF-g6*J@iM0i~9>iLD7>JN1s7W&^NGe zKO`mfe(wR00u8Gm%@Y$Bi_ebM0Q;@nHKHbo&DDKf@gobfGY#77F0fD8;QwyL0XM(O z%AL-?f4iC7+pT>F9IWNjosVx!1V@aF=#3K>&sU!npB?S|cyIKYvkNyg9IF<OoDB}X zEEeOUH(GXvhj$2`kzN+M$p-Ag*u+Y{R#OpKO@RX^R&ut26nN(ES#Ie()8kn{g!9FT zRTIxF+;9M#3Y?iFERX%Ib)SEvH)BuunR}0fjWw)-bUs;%h`n%i=g}zixS(|W+aux0 zH#ovhf@qMxK(YZPPqr*@?Tf4V^gQ#jh)t*TM!_|0&PUbL0!o(joO*o2;25K-i0n<h z08qN>+;HO#lhpgG8w&YaSxxS(Uiibp?9cwczqjuUDoNSx;M!LVNggKEkmPas4J3J- z<MexC5nGeQCVkLvb1hh}wb%QVK{Ybc$0ACO^!J-_c|4K${#_OlMb9-rVZBKC`3u`n zvvV*n_A&`s@`-}O&-seT{27iHCpymog&(um9D$Y-g<EdiVKQr)yI{?aBPv~ea~}Kx zC-@xkmJ@-IHAzCf-@gUL)FiR>e&6=_5Jc+v?-POXV4-h82H+siU6KF}@|&l>Ph7n3 z#}O5&_iq=a@wJ+o+`H|1R)&jP!)nv?{mRehetjLQX=kWxrk8hVaX*LjLBU|N_Criv zeK`wr_*zY?E($&`oA|j9<R?+_`7=^-&OP`&(Ns@t{tTCkflt0Xj(EG{UbaL)lCr#e z-=n1B>>C_?6Lud}PrFbdulTrd&98Y{lO+O@#P_@PZTxX0`}c3R92WOOU%`p0za_mt z`EWo<3ip1uKJhMa9+leuEFi++;>6TEP`X;A9R0(nXiqTMXV-REfPJQ0P{`M6`m0#t zdD*m|5Luz#@4ipp$#7+7?8(<Ee;yFAKwQ>v!4aeXu6_IVzXz2JH#qWy){BCII&gAD zB3~<O)kQ&OuQeYdpHwUXhxXae2_HK>P43NpzW8y3^5dPduI^$-u3WpetCrvQ!<#RX zx9UzexvsDN*_-us)v7gb$^ykfRh04btKoO|$@Z_}Z2k51Wpq^3tVxqL6<+?m??%31 z)U^5Q|Asxj^769HkLX^xz>pA=1@}{xj6OZP|0i=%zFbPFay$R^dtW!yKIgmrJ?hyW zqw3q+*6!c)u+6Ua_qE#6$GhL_MeeDHf4J|+kt1{JEceS<ZAm>n?Q7k<W_JF4-(KzU z-<Gp-#flvt4sqxI`MSRD&gSKNw`aMot(UQ>*l?KjrL3NZeD(9#y!+j*#p&lS{^Oc$ z|L4Nn>W?e_EcM=6@AA`o`mS1iG2UM<x60~y?B5dp{#5euJNv}@FZ~lN-Jx)I`Tve@ zZ*M<8@_o^%Q>P5e@2sqScKz8|?&_~kPEIcGmtDPg)&KjZ;c=mV&YG9nUu~DKxnaD! zy)gCom!8P_+Kb0_Z$0KOogJqKDye=StK0)lfzr>nT8fBCboafn+J1X~{r}$mKc03y zJuMye;m4DcKfR}wy}6Qk@6Z3cd!9bNE_UYqoU1=i>+j!F{bt98sjjZBi}UvV{IJlu zyl-dr;c98~yjvyLZ){ZhbYzOA{GZ?Vx7}G=nwLH=a<=`SfYYxeFE86&t1lS2KX2|g z@tM}ueYd|qvgEh_GT|G4`u%;idH20tj@_#aH~6QtjXN|v{?_X4-$W!<tt<Oowq~_W zna^(_{$DS*PORVN`+ooZ)$aX#;!FP5ocOBT#<%+Sl+Q1}y_LOeY-C;Xqvm_w-$&Qk z_r3eIxZ5gb!oK3?evcnTyZ62-aQwAn_c00mtp7!K%U-`%-hbQU$79Xo5jpQ}g42F} zhdHQVxftlY2ULhlclSLzH_y1}NQZKJ|DCemZ@I<x#svolm!Eyj9lw6<T3NH2isOEB zzjVJ1zWw~!)2<VXTDiY=FI~Fy{hH|ei(I>_{pU}zdvz^3IVtJd+Suw34-R^~Gjsaa zA(Omur$4wPT|Yg(%m2)R7c1i8<~b)e7CLlpt^G7v-Tz<WpO$v{sui`nzkPmoet-I* zA3J^}?bx-e>gc9arJ(ZdJM;beI-cmCUB7PKwRJktyS6M_w(Ps=^ez6m`7twR&6+iF zq99l6G`+Z-hhc9YHJ>mPoByM{{(i@?-@EqMfGeNZTn7r*Oa$4tXz||aZ+dl)d++So zBf2{L>%JxB&Zqxv&Aj~ZaQkf2?6Sb=dWrg_@9)LB@X1?+L`1BJjr{sdOYr2oiLu{5 z$IQ7K>#{BPZW`R49ku$~7Jj^U;&-uz&VrA2J>Q=PL<l5a3`~1|#?^bejd60->aev^ zk=yoX?C&T!b;joPn$3setp2y#`}p{XOq}#6>Fue;zrS6VWM9uKwfCQ{7wfWQ$&wu_ zzh^41ckh$$_CI5g$8vej!`<NcGXL~XhAUf1$Lf+?u+;L_BRA9M$G%^kJ881(k|jG_ zT(YvVPMtdC^5o5wDzWXElXaAi9#s{4cUdp4U#7PHzWY&iwU@o$1Mkgwcp2POxb!0x zQl+<_d)w9B?YgA&^|i12W=)y0WW8lX*tfgo_d7j;YP+{i{q=c*wvDW1)yAFgL9zES z?lHswq4={4HynG(sOsJ)BRKI#%a5w~-u`?=rKwYof0?Q@Ng)3GBe9RVE>C`ZeEfBv zrXTNnx4w-xYQDT(e0QI$`-O`4>n%mDy~saM{o#xGS~vdsvkNyIc*&@`Rw%mjM5nO& ztJ<xrUhU{mQQ0Cg@yPr0Ew5s0_PpBBu_fc8l9}1HZ?jEK?w+{0=;<kkckkOfKOL*S ze|F&phx|SD`H!muEAqszJicM@t6`F6zg^nzow2Kzs0glHv0}ydtBc*WpZxYUe*52i z%Z@`EF6qkk$|QgE{P692@1mU_?=3IZ(CK(~tlIwE!VSlEE?V5fZS1n-gMDjh{Hm2J zEjRpc=vb1zq}${4G~KQLmtNgn5&zImaHoRp-FvsQh5Ft4>aMMtzmF}V#O&U0P?Ih2 zcE$VqmLg&$=U%OOKlyfb-t@bR+dJOe-MswW=gaqOtGC26y`3^MGiFcn@xER2)4#tv z@1nAK^X&7p;(F#Nh|ZrOIDdjb>*Q5mA5He`w-b8M8ytH+ZttSCFHYPD76ton@|?ZT z%Vy4;`S#X!{#GaHdp8BXUAkqO?Ybm;dtUDCZCBUD*e%%Ku_ku2T25+d>DS%T|1_2U zvh!^CcyHFJ?um=vzh__Y<A_Rfv71SaJy*oXPS1;BB`I%KcD2pda#69gjI`gr`6KV; zjT<*QxAO{5oSrs!+w0)i*u4b@YXmROx@K}czP@&K*jl^$dw<`p|95$ZMg7Z5U0q#f zCv&&R*WP)w^8}~E#+|Gi3kw6UR>*I7Bs_Ue#-8tM5<so2g^a4oZuh3ln)U1CG+lq6 znL*Lf+DcouZteG<x2OF4z2bA0=`TJ!{B`O_ON;fpUBNDLd*1)kxBDNn`^Qu9cpJ;7 zg@Tf`$7RpXHsAhwoz91_ClcNMO#AoCAKTfRu%0vJW2fgY>Cao@kMeI=Vby0^wBm(^ zre@}=FPUd&o6rAxU7Y>P?l<4J-}!WT^}2bVPrcc(W5>$N%a6|g7j3a$*7Vh>)$42u z9vql(aOeN`$E53xla74dS^4zo)9K&e*Izy{vFz?7(|cVqdw(2xfArZk7w5;dz8WG| z9tj)g<m~yrDZ{#t_i@0*!1vyIC*wE%Ic{5B_xY@O_WiieSHt5=&!3Ci@ZziY?=PIu zlET8D4|VJJ?S4M*$B!TU_CE?9@0Nc2=uut$?f-wiE{)Xt=XP#o_2qdN_bgboY13`j zSQnM$@#p4*$Cv&tyYms$7*IUk<hq{y(}d*6x_#U38<qarvf@_$#j7n&&TP-cL`0S> zS(0<-OPxaf7Aeb`9oM8c)jscgaZ}D*OG``Y!h0jZlV?v?ryVP)w*T2Fto}_@Ol^B^ z_A}px`1-$JJ0Gi`^R`|exjF6Iy*5+1s#Bb0A3Hq{=I!CXC&R_9l)vZujt8LZrf*f0 z<ly=F*;(tdS1F%-pRZiG@}=ZUxs%c#{hqw|{hLwG&QSSA@At+z&WVl<-F-}!?T4iP z@^0tRF#O~NQ=qw`_j_PaO;S)mcVClL`ynQ_DOXMlPZWNTRGiIpvqJuXrHGhD#-4Ef z8^szr2@amI@7(=DMCZ>C*>mi7!g){ubgcTTMIW#5R#*4l0{fyxYkwSBqF{Q@{jdxd z_nf>v;W|>!0wNN0thjFMoNKD*-d9*}KjA&+HXV=N?}0|`hnU=@--~v)fy$!uHH_BV zHy?X?;$r=C!&P1WK3r~(YrmXXxIs<A)%~Jz`=O>4T2@xd=E}z-a?VYzh&_0Nqwm%u z;mJ$^B}WS1NcPS*aFh>t^lk5sGh0t|9!e_a{&TNF{^?P5HOng%>v@iEOiz&s5PGmk z**K<qj)soe_G8z3zXyWalkHOPuXdaRwMy8h{3xGqQ}oV-@2L7SN%N+^TR$#3zp&%k zBjL$1S$o12tU&e4k44Ip?{v;tKEJB#k?`j)+ZleYuxx%bS?y!y#Xytu;0FGa_44w$ zPn<w4W=%W8!~MPA1MS)mG2IuHb^R&BmAxp@!SiuUhfJ5h&WG!68#exE`CI$>PiRSs zO<(HcD@&d{dGbJ1*0l50iHqI-YJRg^K6Y0AyT!5W#}O%cQQ1P7?8pyYeY0FLLD}xc z{d}$cCijfnm4xat_oVZ+rZQ?<Woa#)=={;MrRHMAd6_PcAB#TDvlJ2J3c45=ys}%S z%U|jF-(%I!0$k4h?*0DjqWSTS(_Xr|@3YvxdEzcm$5+#?^T>*5x5_f*8IOdcEB1g& zyrYF{QmZab{C@uJo242>8fM$OH(DOfmOdyl|HjeHz2DC)+z>c{ZOV-0V7ZCr=1rP* z8>gE~zqjn$3aa?czn`4DK&j}<BjK*IZyy~zR^8?Q=IOy>)qTmi&+ji%J}uKPll+nM z_wTZgQIBnlHRe3n3Uc6$a}gy^4i;OhTgX|8%(pmV4YH`9W4YA(na&Rd_P#i=oY`yE zshcM>_4SwkIHGtD900|8f=iCba6NzF-&-dWa4F=RTi?F@{vSJq_iPaK`PjMGCI}?$ z{<GYnla<en@8~nX&rV=FpH+b<kq?g>gtBFNWV+6Z7HkIvT-J`;73T}rFzwT@+SD36 z(fMPik)GK-<8~)raq0Inofr0e@9xWa2=4M#CU3cXCkqq}UU{Y<C6dV(Cw^z267kFf z)F&62zhdD&kda+GFIAkE;X3+dk#ax3MrX_4iOD)<&pl&!zk)(^#qxbGIxIzARc?N9 z!tI+o-_d950(OGj9vxzKuUO_a*W(7Eei7N5r=Oizc;k+)7RVJ3#Ztk6Gtq9r5oK5R zZ<~yZH0%neZ~S;~XRr9PfF0hxAkW1-S-D90_DxAkk@-9P?sJr_vuw5$c^7m6<e2M{ z-F-}9d(xsIskX5DGRVLWOv}6bW;j3Gbz_GGKcB|N*4&AU=cfnNJkom(js?L!P*5CF z-eb1lh~76)zPb1Cj+?<z^?MHk9@`$@IPX#3#fi>uI%WQ<Oin7+F90XSxW_IKxulB| zi*q_4Q6Klf1?0p%$G(B0zG6bOtNXc5lOhefk80ImANqbXyZ72QROWb9ySA%)UzbVI zm%p`L{(Ic&cLzR^K6qx~2Q}&Lz8<iOuDFsXry7KAyNXyIODgX2-*fE79Kn+ycg3ZJ zUlc6X*mLG6qw2P9P;&jg<AizBOy`G%+d%o~(BnH&0gqT-gW~zS>psCVGF<PwH+-D; zI3hkExMWGg*AokW91&LnC$)GNa5Tmnh{^t}3fg)UB;~GSe$Tl5kUoTR|FTFq-hb6L zAxn|@Kf1w*8b)<2c6C1$(J8a{#+*mO`!imF9Jeod;R_G@zO!dfKeo6g&K6VH+Qg{Z zmsRv6Am^RCZ|<JuKaTXzx>d1W{`jTfr^;MxQ!G}Uoanr9r~k}+P@?lUT?umN{7rjb zcx+te%6C-#U+Nu>yg$5`&n*0)Ke_k2%<*5d_PV-vnJN}#IVpDe*ZAh|$zK9W1a;}l zKnZhSnvT_{yGvfFx%3s*&sQ&;Z<P#+lt1r!K#75aVeg9*#~4+!X7tK*`8O^6*qiVy zfW`T-tNWRS91PK2eKCn<MLkEK*>wJnat5Vj7B^*AcbVgCZG{e<t&5bm&*+lrI@`Qt zAt;7fJe@%fV(a|3Es@*RJ<m|oQe-}h&t0&bKZNRex=2}ku4R#i9jDx5w++|k9F*yL zz?r>gJ!h*$AFo{U#fkd&+zZ-H7`}TSTqC4X_4x0SPT}&JUz)`lOeZ5smV6H}Y*+H= zadqD}BSbbhI{NmB)2Bau-Wu;R->Oz>e}|lbtE(&XuUIuDPfySLb-&kk<lNuc{C8Tz z&);))-kP>j&0PQeOv%f!d*m$=KWx1&Dgvt2*WCWlcl^I-o=(v!E$!X0S6qKbR6DsJ z_>+BE?X7yepr@zj&Mp4(<?q?IY3tjs*!wYd^3<tUHH|MH{oN>RcYklR^-^i$ygPG~ z-xd8Xle!%7<b^#eGsB+uyBzJSzx{lEcVG806EREEg#pj|=C-)cak%VP*s{K8L1z5Z zgFAN`8XD%^=bp2ucIy5cyN|z>&O9S|uE=UxddKtsd>t*{RK@n4YCN|8#Ki;R@u}U- zD;OCvw3OHx7H~{tW(a6G!N{QD^n`&yM6rm0p-aG$fx#7N253|nz5o$={*9M`;f~4k zsW)$L%l-S5*Zj-N+uPr*mcCzGe)7@L-(25S)zqGSIsNnNg@wA&+tz&lJjbTesQ%=n zudlC7pE6}j_VstW9POn|DhhmjdJ1_bGBX6OTD9uczv}-Rl71EmzP!4-JmN`6c=-MD z_j`YOPkR;qZ)f7+LqECy{kyfN_|{hL-yy0;kM7_7bNlYHcURW$*;@7W)Kl$w)ro02 zIcw@B_L?$uxc&bAe*Z`D{Z~FMi|hBFH)nrJ=5fEd&(8k8e>U2#F8AP{bCGlR|M_%! z_whdNXi2WtJlWFI>*iXom$UeAcKf|w4<7d~^P7KdSLy5R|3CK6Ja3yH<N1Wa;mXhJ z%Y3gtfA;Ry&dt?jW%uXI*~MK}^XuiEo5e|wljhI<`Nv;x@0b5uGK)|8*M0h=z4@`Q z5U4x9E_QcM_kX+ebIWgUUp}|~U(fUTr{Bz(IcLrs^OO@))aPG_<7##K<)y^Vu;}!i zo5gN@5`|AbOuU`9zxLpw>)BaZuhv!8K774(>(;|<{O@n9oLslDHtYADJu!ljTM8By zemum=?fT>&yS&BgHJiV5Gq2yNW~;n+&z_pQx3>Or1sQtu<Ye{#26cxH^V?q87yG;N z^Yi=0i8V1Xw(7sGUcIV4O;>p09!2LvahK#eKTUrY9v+?@Zg+Rz-_Lh<KNc2RCuebC zhmo4vGXMGeimL1cEg1xKzrDM;`$w;N(dSQLYvQi{o^+2__xJT>zU}<-dDqt5bdBBB zviHi~>T*HLnim0yi3`h8zs_FmvLyTZx?|fpGxW~A(^I;=E${OB4}GQ#9bz-*8jI`3 zE;{O_{7w9=_(Z>%GmrHeo&9P5Cow7M(Z$8?-d)|+B`*||et&;2K5^aMU046w#O^8) zoY>6H-{z$Fwy<lt3`2)f`Wb0KO-)U)iJQ;c?Y<X&TSdLw!?UpS+wn(_*u=B7v$L~L zd!62*?ZU_Kz$B_`OWxgG_rfPnn)Jo=Q?1?A-4W56N=H?fiwRpYG+dUkEOK#qB>d=g zt*PC<){c-cIqS!d#B`%F<U{1Fx6U}h$S`MFXp**|W#J>2z3an5WyL49v;=Q8@9bRb z@+76UyI<aZUG0PqweEZqnHem6QTqEwHe^n_^5N0q`|(%A!Iq`O%urNn{ja&^caX2| z*~Y)@E-JRlf3H01;Sv1lU)#;i{k_v8CnhH<YF1e*$Y!<O?)-u`cc=S@rl#KTuKxb! zVjbs};Iw6hAJ55Jzp9&ecelOp#GW4R*{0dcVnJow@{?!I<XqoZt08jh!@0H%)32?I z)K-e!U7CG++uE|HoBmDjK5@<8PE%W(J9<yv*(kx6_6ZGj5Ub40%3f?pRQhyjP2{oH zSFc{>7C$2{xHi-G@<QkKeU_H@Yro%pGyQ*B%%1e~^S+zqiA+4W^M9<*69$Guy%Lqd zSy`{tqqo@@rh4V(uI;#T?V6ok<)?eL)#ojr&sli5U0NKJ2y<fI+>fi98mAt`z`&vG z>Eakt`E^z3t*KpIUBA`tNOQHWle5@x`{;jNwFMv87zFenUFZFhg_qat-}mEL*VIVy zzZvJJ$Jc(n8eUjf7`)uSyWjrp_JUpM>HYHy-U|mWyJPw5+nP0Nu6#as_uI*9n>KB_ za^;G<ntfW#$zVQ)1#)}!cdFDM{UrbW&Cj#u_t(@`pAC<%y=rS+eQ?or{kNBwzk3v2 zSN}RbZSRb-e?NDZy^Y$Q_IBan_I1)<Hk*H%zHG@7iRni({C#*|&X}jD6#wRK^85QN z_ZHT6wyrN)@KL|Wq~P7^nny=EYg=1S=H6CQSD#<_aiX%jm$z5YdE4zzzwiH-dE}TB z!ve#zv(3%<va(}dUt24!l`d>{je+5m0KP(awDJ-pt~Q@I<JPTPZgKBs%v<;-jDbP$ zSJHdA?fDB0(<@F%8t2WK^_zjg<;3s%8_$23!pzVRYjK*Kmcfyowag3`SfDkaZPgcv zy34+$@qcT+zq|hI?Crld^8{a(6>fiMes{{WX<_f5TULHb`8P@R_4T#-nwpu{*WE2` zt~1N{@L<LaiS+k&uL56l9x#uaXZrf&@%bxOu9TcJ+xqQI$;9>lYR}zqm#^EgY?<5s zNi$~rm>#JgcWb%-jZ>2zJ-UDQ&+S<2aw&bjJ<n!6kDDPWE&ck!S?3!O%n!Ja_sj3E zK668}-`7m7>tgikaQ|5rhKh<0U#<-P|M%jvtNH&QFTWmF{pH0)>-_zHKRi5qZ0f>* z7uN!}zqz&Z^Q%VY`!%oE^4tB(c=aW7ZS?lK-}3)w{Jito>z~=h?h}j;O4<2jc6=1y zA2V(K{7I9F4zI5ZEk6jVbG{sCRw}yB%pddr^Z(o1a&Py|wK`kz?&i9?yJWTOr|eHz zS@`k(^D{q7et+BY`TYEke~M?$HJ&_q^5-_5nV+5r-|}7<;Bhuy%SzCa!RBpq{r}&; z4(_xrf3xG$tJPuqwpy8*ZhbeaH2d1L>C^weSk#^O<7)4(qc?W!m|g!pTClSAAk*VV zt=wW=C;sx=6<mu<e<{u$SL|EmR#jQ~bJy1FxxZ#NoM3#Ay8hf;>!ceSR;^mqE?@oS z==3-*KfiV5Hy@dcb)Hyo=b-(MgPHd)|9bYM1GIc&`R(nv>PDqa84sP*|0!J%uw<}V zwQJX})|vV#sedzGc0F}&=grQD3{8F7#w+cjVr^~xX6ckEB5zk_+}@UZYwFefbwU%@ z#qPdVJNv-Vn|EDPZePp&_Lo<n&)k#w!-}-Cv(8riTzcl*+{cfke*1m(EiCk1;pVcd z>~+}ptKGZGe*SvB-n*-NtNpwC`}Z%Lil`YE9{VqyDCuv>u;=w6z1VX<?#6ddes*@Y zx|-UxTGO4rn>s|qr)Sjb=;=YK%y*~EPM%Z>ijIyBixRsTyV%i%kD>l@5M&_!mX@aH zzJ66fP0h@L!l0l_EBzya-W;iQ>X2cm`~G&KvXanzf%x~UKYrA8S+eQVjBm%4dG+%y zE^7Ve_;h2k-yQXq6O0ea!PVoDPT{ZnqC!h!T!e(8q{Qd1$^ZEA@$s$vLQ&gF9@#0n z@G<PaY<5Iz-&)A<_>m2nWm$!;w%z@8^?~s`w*@U3{^<Ta#3N`~_9mjTvhr^DchPsk z6TkG7yzQ5ilvMgO|G&t!*vN<-{w_(6lccklT%UBvF#MY~apJ<gvI)=oWWiZ7Pw?cK zH*5YH?so5Q3ww9(@63*rl$aZ9B8{KFGdl&gLQU=2rqlZ36HW8ib5>`*zP2_sHFaa* z#@gRcGs5*=*YE7e`TJz@rcEEpoz_Qh4s-d%FY(|Due-4ld&B$8&BfF7;%YuTaD4nV z{P{W2iU0ooe*M1d-GznD_vg%czwdY6x6}2;>+Wn$KVL0v-gV-^ofubh*{K~e4EwIH zE?=*`e%GfL7Z)eL-{W1Mec+XOxNhto6*aZAGdl{89sTYjAulcdd;9eGxV>3Z%a$%$ z^k^UF_co`6tJ(S9loi?@W!b>Jl#ik5LFe*$`|QliFaLfYUwHHB-OZc#|NV9wG(Ea@ z?cVA?wz0d)OxL}cH`liA&|ZI^nMKcE+}^xtQ_y+q^4sdsr%#;<3J#W^`DaG-cX`!{ zQ;Y&Exsz_|R2Qe-o1l2SU;h4wbJo#z|9<TGe6IS_dH?=>kNb9Y=l}e>wtnW<q+36q zzrVFL`|hl*?R@gP@-CdecOrh)q)ChZom<S+yn>O%%h%U8F){J;v$Mg$!O2NUQt>rU zPE5QsY0{PA^SLM2*K0X~`ecd8yx99`f9fsn-xl0C-RBAe0|SGntDnm{r-UW|uvBYa literal 0 HcmV?d00001 diff --git a/Notebooks/imgs_chap3/triangles.png b/Notebooks/imgs_chap3/triangles.png new file mode 100644 index 0000000000000000000000000000000000000000..9e97d1359b33b7d2c625f8be7f8ff068c549ae9a GIT binary patch literal 12836 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 Axc~qF literal 0 HcmV?d00001 -- GitLab