Commit 91f93213a40c36f02b0d3b1825b5ad19d2c89eac

Authored by Rémi Emonet
1 parent 533d6c6149
Exists in master

CM4

Showing 3 changed files with 459 additions and 1 deletions

cours-04.html View file @ 91f9321
  1 +<!DOCTYPE html>
  2 +<html>
  3 + <head>
  4 + <meta charset="utf-8">
  5 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6 +
  7 + <title>Informatique 4   intro numpy, matplotlib</title>
  8 + <meta name="cours-n" content="4">
  9 +
  10 + <meta name="author" content="Rémi Emonet">
  11 + <meta name="venue" content="L2SPICHI">
  12 + <meta name="date" content="2018">
  13 + <meta name="affiliation" content="Université Jean Monnet − Laboratoire Hubert Curien">
  14 +
  15 + <style type="text/css">
  16 + .strik{text-decoration: line-through;}
  17 + </style>
  18 +
  19 + <!--
  20 + <script src="deck.js/extensions/includedeck/load.js"></script>
  21 + <script src="extensions/slides-dev.js"></script>
  22 + -->
  23 + <script src="extensions/deck-packed.js"></script>
  24 + <script src="extensions/slides.js"></script>
  25 + <script>go(function() {
  26 + });</script>
  27 + </head>
  28 +
  29 +<body>
  30 +
  31 +<div class="deck-container">
  32 +
  33 + <div class="deck-loading-splash" style="background: black; color: chartreuse;"><span class="vcenter" style="font-size: 30px; font-family: Arial; ">Please wait, while our marmots are preparing the hot chocolate…</span></div>
  34 +
  35 +<section class="smart">
  36 +
  37 +# @chunk: chunks/title.md
  38 +
  39 +# @chunk: chunks/objectives.md
  40 +
  41 +## Informatique <span>{var-cours-n}</span> : Plan {#plan overview}
  42 +- Démarche d'écriture d'algorithme {algo}
  43 +- Technique de la Fonction Principale (illustrée) {principale}
  44 +- Paramètres de programmes (et bonnes pratiques) {params}
  45 +- Plateforme {plateforme}
  46 +- « Liste en compréhension » {comprehension}
  47 +- Bibliothèque Numpy : premier contact {numpyintro}
  48 +- Bibliothèque Matplotlib : premier contact {matplotlibintro}
  49 +
  50 +
  51 +
  52 +
  53 +<!-- ######################################## -->
  54 +# @copy:#plan: %+class:inred: .algo
  55 +
  56 +## Étapes pour l'Écriture d'un Programme {libyli}
  57 +- Objectif pour vous : le programme (ou la fonction) {first}
  58 + - le programme n'est qu'une traduction de l'algorithme
  59 + - dans un langage que l'ordinateur comprend
  60 + - &rArr; sous objectif : écrire l'algorithme
  61 + - @anim: -.first | %attr:.first:height:0 +
  62 +- Conception d'un algorithme {libyli}
  63 + - décrire la tâche (sur papier)
  64 + - entrées reçues
  65 + - sortie voulue
  66 + - lister un/des exemples (sur papier)
  67 + - valeurs d'entrées, valeur de sortie attendue
  68 + - avoir des exemples variés : du plus simple au plus compliqué
  69 + - pour chaque exemple (sur papier)
  70 + - décrire les actions successives permettant d'arriver à la sortie attendue
  71 + - actions : lecture de valeurs, affectations (écriture)
  72 + - actions : opérateurs simples
  73 + - généraliser, rendre plus générique
  74 + - utiliser des variables/symboles
  75 + - faire apparaître des répétitions (boucles) et conditions
  76 + - exécuter à la main l'algorithme pour vérifier que ça fonctionne
  77 + - écrire le programme et le valider (par des tests)
  78 +
  79 +## Exemple : écriture et généralisation
  80 +- Étant donné un entier $n$, écrire un programme qui affiche
  81 + - $n=1$ <img src="media/disques/disques-1.png"/>
  82 + - $n=2$ <img src="media/disques/disques-2.png"/>
  83 + - $n=3$ <img src="media/disques/disques-3.png"/>
  84 + - $n=5$ <img src="media/disques/disques-5.png"/>
  85 + - $n=9$ <img src="media/disques/disques-9.png"/>
  86 +- Généralisez ensuite votre programme
  87 + - identifier des boucles, des cas particulier, ...
  88 +
  89 +
  90 +
  91 +<!-- ######################################## -->
  92 +# @copy:#plan: %+class:inred: .principale
  93 +
  94 +## Attention aux variables globales {libyli}
  95 +```python
  96 +def magic(O):
  97 + a = 1
  98 + for i in range(o):
  99 + a = a * 2
  100 + print("Magie :", a)
  101 +
  102 +o = int(input("Entrez o : "))
  103 +magic(o)
  104 +magic(5)
  105 +```
  106 +- Qu'affiche le programme ci dessus, si l'utilisateur entre `3` ? // 8 8
  107 +```python
  108 +def magic(O):
  109 + a = 1
  110 + for i in range(o):
  111 + a = a * 2
  112 + print("Magie :", a)
  113 +
  114 +def go():
  115 + o = int(input("Entrez o : "))
  116 + magic(o)
  117 + magic(5)
  118 +
  119 +go()
  120 +{slide second}
  121 +```
  122 +- @anim: .second>span:nth-of-type(12)
  123 +
  124 +
  125 +## Technique de la fonction « principale » {libyli}
  126 +- But : n'avoir aucune variable globale
  127 + - pas de risque de partager des variables sans le savoir
  128 + - moins de risque d'erreur
  129 + - programme plus sûr
  130 +- Technique {libyli}
  131 + - définir une fonction « principale »
  132 + - (dont le nom est au choix mais est souvent `principale` ou `main`)
  133 + - se limiter dans son fichier python à
  134 + - des définitions de fonctions
  135 + - un appel à la fonction « principale »
  136 +```python
  137 +def puissance(a, b):
  138 + print("notons que a vaut", a)
  139 + return a**b
  140 +
  141 +def principale():
  142 + v = puissance(2*21, 4)
  143 + v2 = puissance(v, 2)
  144 + print(v, v2)
  145 +
  146 +principale()
  147 +{slide}
  148 +```
  149 +
  150 +
  151 +
  152 +
  153 +
  154 +<!-- ######################################## -->
  155 +# @copy:#plan: %+class:inred: .params
  156 +
  157 +## Paramètres d'un Programme {libyli}
  158 +- But : l'utilisateur donne des paramètres au programme
  159 +- `python3 monprog.py poum tchak 5` {libyli}
  160 + - importation du « module » `sys`
  161 + - `sys.argv[0]` contient le nom du fichier .py
  162 + - `sys.argv[1]` contient le premier paramètre
  163 + - `sys.argv[2]` contient le second paramètre
  164 + - ...
  165 + - `len(sys.argv)` &rArr; nombre d'éléments dans `sys.argv`
  166 + - chaque paramètre est une chaîne de caractères
  167 +```python
  168 +import sys
  169 +
  170 +print("Le fichier python :", sys.argv[0])
  171 +# => Le fichier python monprog.py
  172 +print(len(sys.argv))
  173 +# vaut 4 ici (le nom du fichier + 3 paramètres)
  174 +
  175 +texte = sys.argv[1] + "-" + sys.argv[2] + " "
  176 +nb = int(sys.argv[3]) # conversion vers un entier
  177 +print(nb * texte)
  178 +{slide}
  179 +```
  180 +
  181 +## Bonnes Pratiques {libyli}
  182 +- Toujours {libyli}
  183 + - bien nommer les variables
  184 + - tester vos fonctions avec différentes entrées
  185 + - tester vos programmes avec différentes entrées
  186 + - ajouter des variables intermédiaires
  187 + - éviter les expressions trop longues
  188 + - éviter de répéter des expressions récurrentes
  189 + - lire les messages d'erreur
  190 +- Dans un programme {libyli}
  191 + - mettre les `import` au départ
  192 + - ne pas abuser de `from .... import *` (l'étoile)
  193 + - mettre les définitions de fonctions ensuite
  194 + - mettre le corps du programme à la fin
  195 +- Dans une fonction {libyli}
  196 + - bien nommer la fonction
  197 + - bien nommer les paramètres
  198 + - ne pas oublier le `return` (si besoin)
  199 + - éviter d'accéder à des variables globales
  200 +
  201 +
  202 +
  203 +
  204 +<!-- ######################################## -->
  205 +# @copy:#plan: %+class:inred: .plateforme
  206 +
  207 +## Plateformes {libyli}
  208 +- Claroline Connect
  209 + - lien vers les autres « sites du cours »
  210 + - si vous n'avez pas accès au cours ⇒
  211 + - vous inscrire (administrativement)
  212 + - m'envoyer un e-mail
  213 +- Plateforme d'exercice
  214 + - Objectif : vous permettre de pratiquer les bases
  215 + - Principe
  216 + - site web avec des exercices
  217 + - exercices générés automatiquement
  218 + - explications à chaque fois
  219 + - Incitation
  220 + - vous aide à réussir (TP et exam)
  221 + - points de participation, si
  222 + - participation régulière (chaque semaine)
  223 + - participation suffisante (~ min 20 questions)
  224 + - identifiant de la forme : `etu-ab12345z`
  225 + - mot de passe à 6 chiffres : voir « Résultat » sur claroline
  226 +
  227 +
  228 +
  229 +
  230 +
  231 +<!-- ######################################## -->
  232 +# @copy:#plan: %+class:inred: .comprehension
  233 +
  234 +## « Liste en compréhension » {libyli}
  235 +- Cas d'utilisation
  236 + - on veut parcourir une liste
  237 + - calculer une valeur pour chaque élément
  238 + - et remplir une nouvelle liste
  239 +- Version « classique » {anim-continue}
  240 +```python
  241 +premiers = [2, 3, 5, 7, 11]
  242 +carres = []
  243 +for n in premiers:
  244 + carres.append(n*n)
  245 +{slide}
  246 +```
  247 +- Compréhension de liste {anim-continue}
  248 +```python
  249 +premiers = [2, 3, 5, 7, 11, 13]
  250 +carres = [n*n for n in premiers]
  251 +{slide}
  252 +```
  253 +- Compréhension de liste avec condition, imbriquées, ... {anim-continue}
  254 +```python
  255 +carres_impairs = [n*n for n in range(15) if n%2==1]
  256 +{slide}
  257 +```
  258 +```python
  259 +matrice = <span style="border-bottom: 4px solid blue;">[</span> <span style="border-bottom: 4px solid green;">[ 10*i + j for j in range(5) ]</span> <span style="border-bottom: 4px solid blue;">for i in range(4) ] </span>
  260 +
  261 +matric2 = <span style="border-bottom: 4px solid blue;">[</span> [ 10*i + j for j in range(5) if j>i ]
  262 + <span style="border-bottom: 4px solid blue;">for i in range(4) ] </span>
  263 +{slide}
  264 +```
  265 +
  266 +# Retour sur .... {no-print}
  267 +
  268 +## ! IMPORTANT ! <br/> variable Python ⟺ post-it {image-full bottom-left darkened /black-bg /no-status no-print}
  269 +<div class="img" style="background-image: url('media/web/postits-smile.jpg')" data-attribution="https://www.flickr.com/photos/howardtj/15881942983/sizes/l" data-attribution-content="CC by Howard TJ (Flickr)" data-scale=""></div>
  270 +
  271 +## Différentes façons d'exécuter <br/> des instructions écrites en Python {libyli no-print}
  272 +- Créer un fichier `truc.py` contenant les instructions et <br/> lancer `python3 truc.py`
  273 + - exécute les instructions contenues dans le fichier, de haut en bas
  274 +- Lancer l'interpréteur Python avec `python3` (sans nom de fichier)
  275 + - lit les commandes ligne par ligne (au clavier)
  276 + - affiche automatiquement les résultats intermédiaires
  277 +- Lancer un interpréteur amélioré (comme `ipython` ou `ptpython`)
  278 +- Démarrer un environnement (par exemple `spyder3`)
  279 + - interface graphique avec un éditeur de fichier
  280 + - possibilité de mélanger inteprétation, exécution de (parties) de fichier, ...
  281 +- **Utiliser un « notebook Jupyter »**
  282 + - démarre un interpréteur caché
  283 + - donne une interface dans le navigateur
  284 + - permet de créer/modifier/supprimer et exécuter des cellules (blocs de code)
  285 +- Important
  286 + - vous avez le choix pour explorer Python
  287 + - par contre, les rendus (TP etc) sont imposé (par défaut sous forme d'un fichier `.py`)
  288 +
  289 +
  290 +# Illustration : $\pi$
  291 +- {comment}
  292 + - pi en générant une grille de nombres au hasards
  293 + - et en mappant vers une liste de distances
  294 + - et en mappant vers une liste de booléen (éventuellement `booleen_vers_int`)
  295 + - puis en sommant (sum())
  296 + - ENSUITE, avec des fonctions (pour pouvoir réutiliser)
  297 +
  298 +
  299 +
  300 +<!-- ######################################## -->
  301 +# @copy:#plan: %+class:inred: .numpyintro
  302 +
  303 +# Introduction : $\pi$ en numpy
  304 +
  305 +## Numpy {libyli}
  306 +- Motivation
  307 + - `les_carrés`, `les_logs`, ...
  308 + - `liste_zeros2d`, `grille`, ...
  309 + - simplifié grâce aux « listes en compréhension » &rArr; peut mieux faire
  310 + - \+ performances (vitesse de calcul)
  311 +- Bibliothèque Numpy (module `numpy`)
  312 + - structure de données pour des tableaux à 1, 2, n dimensions
  313 + - simplification des calculs
  314 + - fonctions utilitaire pour les opérations classiques
  315 + - bases de nombreuses autres bibliothèques
  316 +
  317 +## Numpy, ex. : création de tableaux de 0 {libyli}
  318 +- Exemple (atypique, préférer la version d'en bas)
  319 +```python
  320 +import numpy
  321 +a = numpy.zeros(6) # "vecteur" avec 6 zéros
  322 +print(a)
  323 +
  324 +b = numpy.zeros([5, 10]) # tableau de 5 lignes et 10 colonnes
  325 +print(b)
  326 +{slide}
  327 +```
  328 +- Version typique (`np` et utilisation de « tuple » (n-uplet))
  329 +```python
  330 +import numpy as np
  331 +a = np.zeros(6)
  332 +print(a)
  333 +
  334 +b = np.zeros((5, 10))
  335 +print(b)
  336 +{slide}
  337 +```
  338 +- NB: `(5, 10)` est un **n-uplet (ou *tuple*)** qui se comporte comme la liste `[5, 10]` mais n'est pas modifiable (erreur si on essaie de changer une valeur)
  339 +
  340 +## Numpy : quelques fonctions de création {libyli}
  341 +- `numpy.zeros(n)`
  342 +- `numpy.zeros(shape)` (*shape* ⇔ forme ⇔ dimensions du tableau)
  343 +- `np.eye(n)`
  344 +- `np.eye(n1, n2)`
  345 +- `np.arange(n)`
  346 +- `np.arange(a, b)`
  347 +- `np.arange(a, b, s)`
  348 +- `np.random.random(n)`
  349 +- `np.random.random(shape)`
  350 +- `np.random.uniform(a, b, shape)`
  351 +- `np.random.normal(moyenne, ecart_type, shape)`
  352 +- ...
  353 +
  354 +## Numpy : opérations {libyli}
  355 +- La plupart des opération (`+`, `-`, `*`, ...) sont effectuée élément par élément
  356 + - entre deux tableaux numpy `a + b`
  357 + - entre un tableaux et un nombre `a + 10` (ajoute 10 à chaque élément de `a`)
  358 +- La plupart des fonctions de `math` ont un équivalent dans numpy
  359 + - ex : `np.log(a)`
  360 +- Numpy propose des fonction d'agrégation
  361 + - ex : `np.sum(a)`, `np.mean(a)`, `np.median(a)`, etc.
  362 +```python
  363 +import numpy as np
  364 +
  365 +a = np.random.uniform(0.5, 1, (7, 4))
  366 +b = np.random.uniform(10, 20, (7, 4))
  367 +
  368 +print(a+b)
  369 +print(a+10)
  370 +print(a**b)
  371 +
  372 +print(np.sum(a))
  373 +print(np.sum(a, axis=0))
  374 +{slide}
  375 +```
  376 +
  377 +# Illustration : $\pi$
  378 +
  379 +<!-- ######################################## -->
  380 +# @copy:#plan: %+class:inred: .matplotlibintro
  381 +## Matplotlib {libyli}
  382 +- Motivation
  383 + - tracer des graphes (courbes, nuages de points, histogrammes, etc)
  384 + - gérer automatiquement l'affichage des axes, titres, graduations, etc.
  385 + - permettre éventuellement l'interaction l'utilisateur (zoom, etc.)
  386 + - permettre éventuellement de sauver des fichiers (jpg, pdf, etc.)
  387 +- Bibliothèque Matplotlib (module `matplotlib`)
  388 + - généralement `from matplotlib import pyplot as plt`
  389 + - tracé de différents types de graphes
  390 + - gestion des sous graphes
  391 + - <a href="http://matplotlib.org/" target="_blank">http://matplotlib.org/</a>
  392 + - <a href="http://matplotlib.org/gallery.html" target="_blank">http://matplotlib.org/gallery.html</a>
  393 +
  394 +## Matplotlib : exemple
  395 +```python
  396 +from matplotlib import pyplot as plt
  397 +
  398 +x = [1, 2, 3, 9, 10]
  399 +y = [ e**3 for e in x ]
  400 +z = [ (10+e)**2 for e in x ]
  401 +
  402 +plt.plot(x, y, label="courbe 1")
  403 +plt.plot(x, z, label="courbe 2")
  404 +plt.legend()
  405 +
  406 +plt.savefig('courbes.pdf')
  407 +plt.show()
  408 +```
  409 +
  410 +# Illustration : affichage des pas
  411 +- {comment}
  412 + - np.genfromtxt(..., separator=',')
  413 + - cf prep/steps
  414 +
  415 +# OK {no-print}
  416 +<!--
  417 +## Points Clés {key deck-status-fake-end}
  418 +-->
  419 +
  420 +</section>
  421 +
  422 + <!-- deck.status snippet -->
  423 + <p class="deck-status deck-progress-10"> <span class="deck-status-current"></span> / <span class="deck-status-total"></span> − <span class="var-author">will be replaced by the author</span> − <span class="var-title">will be replaced by the title</span></p>
  424 +
  425 + <a data-progress-size=": spe.top(15, 555); height: 45*designRatio; left: slide.right - 90*designRatio; width: 90*designRatio" class="ccby" href="http://en.wikipedia.org/wiki/Creative_Commons_license" title="This work is under CC-BY licence." target="_blank"></a>
  426 +
  427 + <a class="ujm" data-progress-size=": spe.top(15, 525); height: 65*designRatio; left: slide.left; width: 130*designRatio" target="_blank"></a>
  428 +
  429 +</div>
  430 +<!-- clicky -->
  431 +<script type="text/javascript">
  432 +var clicky_site_ids = clicky_site_ids || [];
  433 +clicky_site_ids.push(100779706);
  434 +(function() {
  435 + var s = document.createElement('script');
  436 + s.type = 'text/javascript';
  437 + s.async = true;
  438 + s.src = '//static.getclicky.com/js';
  439 + ( document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0] ).appendChild( s );
  440 +})();
  441 +</script>
  442 +<noscript><p><img alt="Clicky" width="1" height="1" src="//in.getclicky.com/100779706ns.gif" /></p></noscript>
  443 +
  444 +
  445 +<!-- Histats.com START (aync)-->
  446 +<script type="text/javascript">var _Hasync= _Hasync|| [];
  447 +_Hasync.push(['Histats.start', '1,2767123,4,0,0,0,00010000']);
  448 +_Hasync.push(['Histats.fasi', '1']);
  449 +_Hasync.push(['Histats.track_hits', '']);
  450 +(function() {
  451 +var hs = document.createElement('script'); hs.type = 'text/javascript'; hs.async = true;
  452 +hs.src = ('//s10.histats.com/js15_as.js');
  453 +(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(hs);
  454 +})();</script>
  455 +<noscript><a href="//www.histats.com" target="_blank"><img src="//sstatic1.histats.com/0.gif?2767123&101" alt="javascript hit counter" border="0"></a></noscript>
  456 +<!-- Histats.com END -->
  457 +</body>
  458 +</html>
... ... @@ -46,8 +46,8 @@
46 46 <div data-lesson="01">Intro.</div>
47 47 <div data-lesson="02" data-hascode="09-03">Rappels</div>
48 48 <div data-lesson="03" data-hascode="09-20">Autres bases</div>
  49 + <div data-lesson="04" data-hascode="09-27">π, intro Numpy</div>
49 50 <!--
50   - <div data-lesson="04" data-hascode="y">π, intro Numpy</div>
51 51 <div data-lesson="05" data-hascode="y">Numpy, indices, tranches</div>
52 52 <div data-lesson="06" data-hascode="y">Numpy, tranches, axes</div>
53 53 <div data-lesson="07" data-hascode="y">Matplotlib</div>
raw/cours-09-27.zip View file @ 91f9321

No preview for this file type