{ "cells": [ { "cell_type": "markdown", "id": "0", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "[](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.dsi.universite-paris-saclay.fr%2Fbruno.denis%2Fintro_jupyter/HEAD?labpath=notebooks%2Fenseignement.ipynb)\n", "[](https://nbviewer.org/urls/gitlab.dsi.universite-paris-saclay.fr/bruno.denis/intro_jupyter/-/raw/main/notebooks/enseignement.ipynb)\n", "\n", "# Enseigner avec Jupyter\n", "\n", "Les carnets Jupyter sont de bons outils d’enseignement." ] }, { "cell_type": "markdown", "id": "1", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Scénario 1\n", "\n", "L'alternance de cellules de code et de cellules de texte formaté pour **expliquer un langage informatique**." ] }, { "cell_type": "markdown", "id": "2", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Exemple\n", "\n", "Une liste Python est un conteneur d'objets Python de type différent." ] }, { "cell_type": "code", "execution_count": 1, "id": "3", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "[1, 2, ['a', 'b', 'c']]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[1, 2, 3] # liste de trois entiers\n", "[1, \"bonjour\", 3.2] # liste de trois éléments de type différent\n", "[1, 2, [\"a\", \"b\", \"c\"]] # Liste contenant une liste comme élément" ] }, { "cell_type": "markdown", "id": "4", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "La méthode `append()` permet d'ajouter un élément à une liste." ] }, { "cell_type": "code", "execution_count": 2, "id": "5", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "l1 = [1, 2, 3]\n", "l1.append(4)" ] }, { "cell_type": "markdown", "id": "6", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Scénario 2\n", "\n", "Utilisation des carnets Jupyter pour organiser des **exercices de programmation** en classe. Les instructions sont décrites dans des cellules de texte formaté et les étudiant(e)s sont invités à suivre ces instructions pour résoudre des problèmes dans des cellules de code vides ou partiellement remplies." ] }, { "cell_type": "markdown", "id": "7", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Exemple\n", "\n", "Coder une fonction qui retourne la somme des entiers positifs pairs inférieurs ou égale à $n$. Le paramètre d'entrée de la fonction est $n$. Si ce paramètre n'est pas une valeur numérique positive ou nulle, la fonction renvoie $-1$." ] }, { "cell_type": "code", "execution_count": 3, "id": "8", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "def volume_cylindre(rayon, hauteur):\n", " pass # placer le code ici à la placce de l'instruction pass\n", "\n" ] }, { "cell_type": "markdown", "id": "9", "metadata": { "editable": true, "jp-MarkdownHeadingCollapsed": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Pour tester votre code, exécuter les assertions suivantes, elles ne doivent pas lever d'exception si votre fonction répond au cahier des charges." ] }, { "cell_type": "code", "execution_count": null, "id": "10", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "assert somme_paire(0) == 0\n", "assert somme_paire(2) == 2\n", "assert somme_paire(10) == 30\n", "assert somme_paire(100) == 2550\n", "assert somme_paire(12.2) == 42\n", "assert somme_paire(\"8\") == -1" ] }, { "cell_type": "markdown", "id": "11", "metadata": { "editable": true, "jp-MarkdownHeadingCollapsed": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Proposition d'une solution" ] }, { "cell_type": "code", "execution_count": 5, "id": "12", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "def somme_paire(n):\n", " \"\"\"Renvoie la somme des entiers positifs paires inférieur a n.\"\"\"\n", " res = -1\n", " if isinstance(n, (float, int)):\n", " if n >= 0:\n", " res = sum([i for i in range(0, int(n)+1, 2)])\n", " return res" ] }, { "cell_type": "markdown", "id": "13", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Scénario 3\n", "\n", "L'interactivité d'un carnet Jupyter permet des **explorations de données** en ligne." ] }, { "cell_type": "markdown", "id": "14", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Exemple\n", "\n", "La base de toutes les adresses postales de France est disponible sur l'API http https://adresse.data.gouv.fr/api-doc/adresse\n", "\n", "Le code suivant envoie une requête et affiche les 5 premiers résultats. La requête paramétrable en adaptant le dictionnaire `params`." ] }, { "cell_type": "code", "execution_count": 6, "id": "15", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "34 réponses obtenues\n" ] } ], "source": [ "import requests\n", "import pandas\n", "\n", "api_url=\"https://api-adresse.data.gouv.fr/search/\"\n", "params = {\n", " \"q\": \"avenue\",\n", " \"limit\": 100,\n", " \"type\": \"street\", # housenumber, street, locality, municipality\n", " \"postcode\": 91190,\n", "}\n", "\n", "data_json = requests.get(api_url, params=params).json()\n", "data_frame = pandas.json_normalize(data_json[\"features\"])\n", "\n", "print(len(data_frame), \"réponses obtenues\")" ] }, { "cell_type": "code", "execution_count": 7, "id": "16", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
| \n", " | type | \n", "geometry.type | \n", "geometry.coordinates | \n", "properties.label | \n", "properties.score | \n", "properties.id | \n", "properties.name | \n", "properties.postcode | \n", "properties.citycode | \n", "properties.x | \n", "properties.y | \n", "properties.city | \n", "properties.context | \n", "properties.type | \n", "properties.importance | \n", "properties.street | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "Feature | \n", "Point | \n", "[2.116187, 48.704444] | \n", "Avenue du Génèral Leclerc 91190 Gif-sur-Yvette | \n", "0.882027 | \n", "91272_1260 | \n", "Avenue du Génèral Leclerc | \n", "91190 | \n", "91272 | \n", "634963.33 | \n", "6845286.41 | \n", "Gif-sur-Yvette | \n", "91, Essonne, Île-de-France | \n", "street | \n", "0.70230 | \n", "Avenue du Génèral Leclerc | \n", "
| 1 | \n", "Feature | \n", "Point | \n", "[2.115624, 48.694571] | \n", "Avenue du Panorama 91190 Gif-sur-Yvette | \n", "0.877754 | \n", "91272_1930 | \n", "Avenue du Panorama | \n", "91190 | \n", "91272 | \n", "634909.61 | \n", "6844189.27 | \n", "Gif-sur-Yvette | \n", "91, Essonne, Île-de-France | \n", "street | \n", "0.65529 | \n", "Avenue du Panorama | \n", "
| 2 | \n", "Feature | \n", "Point | \n", "[2.115367, 48.693057] | \n", "Avenue Centrale 91190 Gif-sur-Yvette | \n", "0.876670 | \n", "91272_0470 | \n", "Avenue Centrale | \n", "91190 | \n", "91272 | \n", "634888.81 | \n", "6844021.17 | \n", "Gif-sur-Yvette | \n", "91, Essonne, Île-de-France | \n", "street | \n", "0.64337 | \n", "Avenue Centrale | \n", "
| 3 | \n", "Feature | \n", "Point | \n", "[2.125022, 48.710608] | \n", "Avenue du Bois des Roches 91190 Gif-sur-Yvette | \n", "0.875477 | \n", "91272_0380 | \n", "Avenue du Bois des Roches | \n", "91190 | \n", "91272 | \n", "635621.04 | \n", "6845964.45 | \n", "Gif-sur-Yvette | \n", "91, Essonne, Île-de-France | \n", "street | \n", "0.63025 | \n", "Avenue du Bois des Roches | \n", "
| 4 | \n", "Feature | \n", "Point | \n", "[2.118026, 48.692642] | \n", "Avenue des Carrières 91190 Gif-sur-Yvette | \n", "0.875477 | \n", "91272_0450 | \n", "Avenue des Carrières | \n", "91190 | \n", "91272 | \n", "635084.00 | \n", "6843972.84 | \n", "Gif-sur-Yvette | \n", "91, Essonne, Île-de-France | \n", "street | \n", "0.63025 | \n", "Avenue des Carrières | \n", "