Commit 993ce4ce8d8d79295675e572777bb62f5519dac9

Authored by Rémi Emonet
1 parent 99569f0b1c
Exists in master

slides

Showing 1 changed file with 542 additions and 0 deletions

cours-03.html View file @ 993ce4c
  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 3   autres bases</title>
  8 + <meta name="cours-n" content="3">
  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 +## RAPPEL: Pour la semaine "prochaine" (lundi 17) {libyli}
  42 +- Inversion de classe : réviser les bases
  43 + - [https://learn.heeere.com/python/](https://learn.heeere.com/python/)
  44 + - Revoir : variables, listes, boucles, ...
  45 + - Prendre des notes : questions, points importants, surprenant
  46 + - Installer Python et les outils (si vous utilisez un ordinateur personnel)
  47 + - *Possiblitité d'examen court*
  48 +- Faire une carte conceptuelle (elle sera *ramassée*)
  49 + - choisir un thème (quelques « épisodes »)
  50 + - lister les concepts (4 à 10)
  51 + - tracer les relations
  52 + - (re)mettre en forme
  53 + - vérifier que les relations forment des propositions
  54 +- Rendu des cartes conceptuelles
  55 +- Des questions suites à vos révisions/installation ?
  56 +
  57 +# ...
  58 +
  59 +# Test rapide
  60 +
  61 +## Informatique <span>{var-cours-n}</span> : Plan {#plan overview}
  62 +- Logistique TP et autre {tp}
  63 +- Bibliothèques en Python {biblio}
  64 +- Fonctions en Python {fonctions}
  65 +- Démarche d'écriture d'algorithme {algo}
  66 +- Un programme complet ? {moreprog}
  67 +
  68 +
  69 +<!-- TP -->
  70 +# @copy:#plan: %+class:inred: .tp
  71 +
  72 +## Rendu Classique (à partir du TP2) {libyli}
  73 +- Typiquement 2 rendus
  74 + - premier rendu en fin de séance
  75 + - second rendu libre, avant le lundi suivant 5h00 (matin)
  76 +- Comment rendre
  77 + - créez un fichier .zip
  78 + - aller sur claroline connect
  79 + - aller dans ressource « Rendu TP... »
  80 + - envoyez votre fichier zip
  81 + - (ne pas supprimer l'ancien s'il y en a déjà un)
  82 +- Que rendre ?
  83 + - fichier zip avec le code python, le compte rendu, etc (voir énoncé de TP)
  84 + - bien penser à vos noms (les 2 pour un binôme) dans le compte rendu
  85 + - ⚠ fichiers absents, nom manquant, ... &rArr; comme si pas rendu
  86 +- NB: si le « rendu TP... » n'existe pas encore, me le dire
  87 +- RAPPEL: examen de TP personnel (pas de binôme)
  88 +
  89 +
  90 +## Semaine prochaine : « seconde chance » {libyli}
  91 +- TD de lundi
  92 + - aide au sujet du TD1 et TP1
  93 + - réponse aux questions (sur Python, etc)
  94 + - sur la base du volontariat
  95 + - besoin de soutient
  96 + - envie de servir de tuteurs/tutrices
  97 +- TP de mercredi
  98 + - fin du TP2 (l'avoir avancé avant si nécessaire)
  99 + - renforcement avec TP1
  100 + - prise d'avance sur le TP3
  101 +- CM de jeudi
  102 + - suite
  103 +
  104 +# Autre Logistique
  105 +
  106 +## À venir {libyli}
  107 +- Changement d'emploi du temps probable <br/> dans la semaine du (jeudi) 4 octobre
  108 +- Contrôle intermédiaire possible
  109 + - Semaine du 4 octobre ou la suivante
  110 + - Contenu parmi
  111 + - **tableaux numpy (une dimension) et matplotlib élémentaire**
  112 + - bases de Python (variables, boucles, listes, conversion)
  113 + - démarche d'écriture d'algorithme
  114 +
  115 +
  116 +## Plateformes {libyli}
  117 +- Claroline Connect
  118 + - lien vers les autres « sites du cours »
  119 + - si vous n'avez pas accès au cours ⇒
  120 + - vous inscrire (administrativement)
  121 + - m'envoyer un e-mail
  122 +- Plateforme d'exercice
  123 + - Objectif : vous permettre de pratiquer les bases
  124 + - Principe
  125 + - site web avec des exercices
  126 + - exercices générés automatiquement
  127 + - explications à chaque fois
  128 + - Incitation
  129 + - vous aide à réussir (TP et exam)
  130 + - participation régulière (chaque semaine)
  131 + - participation suffisante (min. 20 questions)
  132 + - identifiant de la forme : `etu-ab12345z`
  133 + - mot de passe à 6 chiffres : voir « Résultat » sur claroline
  134 +
  135 +
  136 +
  137 +
  138 +
  139 +
  140 +<!-- ######################################## -->
  141 +# @copy:#plan: %+class:inred: .biblio
  142 +
  143 +## Qu'est ce qu'une Bibliothèque ? {libyli}
  144 +- Une collection de fonctions réutilisables, prêtes à l'usage
  145 +- Un ou des fichiers Python (`.py`)
  146 +- Bibliothèques interne, standards et externes {libyli}
  147 + - fonctions accessibles par défaut : `print`, `len`, `sum`, …
  148 + - bibliothèques standards
  149 + - accessibles du moment que Python est installé
  150 + - ex : `sys`, `math`, `random`, ...
  151 + - bibliothèques supplémentaires
  152 + - besoin d'être installées en plus de Python
  153 + - parfois disponibles par défaut (ex : anaconda) // cf infos pour l'install
  154 + - ex : `numpy`, `qtido`, ...
  155 +- En Python, aussi appelées « modules »
  156 +- But :
  157 + - ne pas réinventer la roue
  158 + - s'abstraire des détails
  159 +
  160 +
  161 +## Importer des Fonctions d'un Module {libyli}
  162 +- Il y a 3 façon pour utiliser les fonctions d'un module
  163 +- importation du module {anim-continue no}
  164 +```python
  165 +import math
  166 +print( math.sqrt(100) )
  167 +{slide}
  168 +```
  169 +- importation d'une fonction en particulier {anim-continue no}
  170 +```python
  171 +from math import sqrt
  172 +print( sqrt(100) )
  173 +{slide}
  174 +```
  175 +- importation de toutes les fonctions d'un module <br/>(ne pas en abuser, risque de conflicts) {anim-continue no}
  176 +```python
  177 +from math import *
  178 +print( sqrt(100) )
  179 +{slide}
  180 +```
  181 +- Aide d'un module avec `help`
  182 +```python
  183 +import math
  184 +help(math)
  185 +{slide}
  186 +```
  187 +
  188 +
  189 +## Exemple d'utilisation de fonction {libyli}
  190 +- Autre figure géométrique
  191 +```python
  192 +from qtido import *
  193 +
  194 +f = creer(400, 200) # créer une fenêtre
  195 +
  196 +couleur(f, 1, 1, 1) # Blanc
  197 +disque(f, 50, 50, 20) # centreX, centreY, rayon
  198 +couleur(f, 1, 0, 0) # Rouge
  199 +disque(f, 60, 30, 9)
  200 +disque(f, 40, 30, 9)
  201 +
  202 +attendre_pendant(f, 1000) # en millisecondes
  203 +{slide}
  204 +```
  205 +- Illustration <img class="floatright" src="media/qtido/mickey-1.png"/>
  206 +
  207 +
  208 +
  209 +
  210 +
  211 +
  212 +
  213 +<!-- ######################################## -->
  214 +# @copy:#plan: %+class:inred: .fonctions
  215 +
  216 +# Mais avant… Quizz
  217 +# @chunk: chunks/q/py-accsum-sumif.md
  218 +# @chunk: chunks/q/py-fordizaine-2.md
  219 +
  220 +# @copy:#plan: %+class:inred: .fonctions
  221 +
  222 +
  223 +## Fonctions en Python {libyli}
  224 +- Les bibliothèques fournissent des fonctions
  225 +- Il est possible d'écrire ses propres fonctions
  226 + - ne pas réinventer la roue (pas plus d'une fois)
  227 + - éviter de se répéter
  228 + - éviter le copier/coller
  229 +- Qu'est ce qu'une fonction
  230 + - un nom
  231 + - une liste de noms de paramètres
  232 + - un corps (suite d'instructions)
  233 + - possiblement une valeur retournée
  234 +
  235 +
  236 +## Définition de Fonctions en Python {libyli}
  237 +```python
  238 +import math
  239 +
  240 +# les fonctions courtes peuvent être sur une ligne
  241 +def puissance(a, b): return a**b
  242 +
  243 +def info(message): print("INFO :", message)
  244 +
  245 +def distance_origine(x, y):
  246 + "renvoie la distance du point (x,y) à l'origine)"
  247 + d = x*x + y*y
  248 + return math.sqrt(d)
  249 +
  250 +{slide}
  251 +```
  252 +- Suivant le modèle
  253 +```python
  254 +def «nom» ( «liste-param» ):
  255 + "documentation de la fonction, optionnelle"
  256 + «instr» # dans le corps de la fonction
  257 + «instr» # dans le corps de la fonction
  258 + … # dans le corps de la fonction
  259 +{slide}
  260 +```
  261 +- `def`, `(`, `)`, `:` et l'indentation sont **obligatoires**
  262 +- dans «liste-param», les noms sont séparés par des `,`
  263 +
  264 +## Appel de Fonction et Valeur de Retour {libyli}
  265 +```python
  266 +def puissance(a, b):
  267 + print("notons que a vaut", a)
  268 + return a**b
  269 +
  270 +v = puissance(2*21, 4)
  271 +v2 = puissance(v, 2)
  272 +print(v, v2)
  273 +{}
  274 +```
  275 +- À chaque fois qu'une fonction est appelée <br/> (ex, `puissance(2*21, 4)`) {libyli}
  276 + - les valeurs de paramètres sont calculées (ex, 42 et 4)
  277 + - ... et affectées à des variables (ex, a=42 et b=4)
  278 + - le corps de la fonction est exécuté (le print, puis le return)
  279 + - ... jusque la fin ou jusque `return`
  280 + - la valeur de l'appel est la valeur retournée <br/> (ex, `puissance(2*21, 4)` vaut `3111696`)
  281 +- `return` renvoie la valeur et **interrompt** la fonction
  282 +- si la fin arrive sans `return`, la fonction renvoie `None`
  283 +
  284 +
  285 +
  286 +## Définition et appel de fonction
  287 +
  288 +<div class="c6 floatleft">
  289 +```python
  290 +def norme(x, y):
  291 + d = x**2 + y**2
  292 + return d ** 0.5
  293 +
  294 +# Appel 1
  295 +print(norme(3, 4))
  296 +
  297 +
  298 +
  299 +
  300 +
  301 +
  302 +# Appel 2
  303 +print(norme(40, 30))
  304 +
  305 +
  306 +
  307
  308 +{a}
  309 +```
  310 +</div>
  311 +
  312 +<div class="c6 floatright">
  313 +```python
  314 +# Juste se rappeler
  315 +# ... que norme existe
  316 +
  317 +
  318 +a1_x = 3
  319 +a1_y = 4
  320 +a1_d = a1_x**2 + a1_y**2
  321 +a1 = a1_d ** 0.5
  322 +
  323 +print(a1)
  324 +
  325 +
  326 +a2_x = 40
  327 +a2_y = 30
  328 +a2_d = a2_x**2 + a2_y**2
  329 +a2 = a2_d ** 0.5
  330 +
  331 +print(a2)
  332 +{b}
  333 +```
  334 +</div>
  335 +
  336 +- @anim: .a>span:nth-of-type(1), .a>span:nth-of-type(2), .a>span:nth-of-type(3)
  337 +- @anim: .b>span:nth-of-type(1), .b>span:nth-of-type(2)
  338 +- @anim: .b>span:nth-of-type(5), .b>span:nth-of-type(6) | .b>span:nth-of-type(7) | .b>span:nth-of-type(8)
  339 +- @anim: .b>span:nth-of-type(10)
  340 +- @anim: .b>span:nth-of-type(13), .b>span:nth-of-type(14), .b>span:nth-of-type(15), .b>span:nth-of-type(16)
  341 +- @anim: .b>span:nth-of-type(18)
  342 +- NB {slide}
  343 + - chaque appel a ses propres paramètres (x et y)
  344 + - chaque appel a ses propres variables locales (d)
  345 + - `return` donne la valeur par laquelle sera remplacée l’appel
  346 +
  347 +
  348 +## Fonctions : plus...
  349 +- Référence Python
  350 +- Site de L1 pour les détails (cours-06)
  351 +- TP L1
  352 +- Technique de la fonction principale
  353 +- Important : pile d'appel
  354 + - voir « python tutor » (cours précédent)
  355 + - voir « cours-06 » (L1)
  356 +
  357 +
  358 +<!-- ######################################## -->
  359 +# @copy:#plan: %+class:inred: .algo
  360 +
  361 +## Algorithme d'Écriture d'Algorithme {libyli}
  362 +- But 1 : résoudre le problème ci dessous
  363 +- But 2 : **introspection**
  364 + - réfléchissez/étudiez ce que vous faites
  365 + - quelles étapes suivez vous pour résoudre le problème ?
  366 +- Problème : <br/>Écrivez une fonction `somme(l)` qui
  367 + - retourne la somme des valeurs de la liste `l`
  368 + - n'utilise pas la fonction `sum()` prédéfinie
  369 +
  370 +## Étapes pour l'Écriture d'un Programme {libyli}
  371 +- Objectif pour vous : le programme (ou la fonction) {first}
  372 + - le programme n'est qu'une traduction de l'algorithme
  373 + - dans un langage que l'ordinateur comprend
  374 + - &rArr; sous objectif : écrire l'algorithme
  375 + - @anim: -.first | %attr:.first:height:0 +
  376 +- Conception d'un algorithme {libyli}
  377 + - décrire la tâche (sur papier)
  378 + - entrées reçues
  379 + - sortie voulue
  380 + - lister un/des exemples (sur papier)
  381 + - valeurs d'entrées, valeur de sortie attendue
  382 + - avoir des exemples variés : du plus simple au plus compliqué
  383 + - pour chaque exemple (sur papier)
  384 + - décrire les actions successives permettant d'arriver à la sortie attendue
  385 + - actions : lecture de valeurs, affectations (écriture)
  386 + - actions : opérateurs simples
  387 + - généraliser, rendre plus générique
  388 + - utiliser des variables/symboles
  389 + - faire apparaître des répétitions (boucles) et conditions
  390 + - exécuter à la main l'algorithme pour vérifier que ça fonctionne
  391 + - écrire le programme et le valider (par des tests)
  392 +
  393 +
  394 +## Avant de faire un exemple : <br/> processus inverse (lecture et réécriture)
  395 +```python
  396 +n = ...
  397 +
  398 +f = creer(500, 500)
  399 +for i in range(20, 200, 4):
  400 + rectangle(f, i*4, 0, i*4+4, i*2)
  401 +
  402 +attendre_fermeture(f)
  403 +```
  404 +
  405 +## Exemple : écriture et généralisation
  406 +- Étant donné un entier $n$, écrire un programme qui affiche
  407 + - $n=1$ <img src="media/disques/disques-1.png"/>
  408 + - $n=2$ <img src="media/disques/disques-2.png"/>
  409 + - $n=3$ <img src="media/disques/disques-3.png"/>
  410 + - $n=5$ <img src="media/disques/disques-5.png"/>
  411 + - $n=9$ <img src="media/disques/disques-9.png"/>
  412 +
  413 +
  414 +## Pour pratiquer plus {libyli}
  415 +- Notes sur la conception d'algorithmes
  416 + - on va se tromper
  417 + - nos tests et exemples vont nous le montrer
  418 + - on va étudier les cas où ça ne fonctionne pas
  419 + - on va faire plusieurs itérations jusqu'à trouver une solution
  420 +- Exo : Tracer une diagonale de carrées (50 carrés de taille 10)
  421 +- Exo : Tracer une diagonale de carrées (tailles données par l'utilisateur)
  422 +- Exo : Soustraire 42 à tous les éléments d'une liste
  423 +- Exo : Compter les occurrences d'un élément dans une liste (ex: le nombre d'élément "poum")
  424 +- Exo : Remplacer toutes les occurrences d'un élément donné par un autre (ex: transformer les "poum" en "tchak")
  425 +- Exo : Inverser une liste, retourner une nouvelle liste avec le résultat
  426 +- Exo : Calculer la factorielle d'un nombre ($n!$)
  427 +
  428 +
  429 +
  430 +
  431 +
  432 +
  433 +<!-- Programme complet -->
  434 +# @copy:#plan: %+class:inred: .moreprog
  435 +
  436 +## Que faire aujourd'hui ?
  437 +- Listes et tout
  438 +- Estimation de π par simulation ?
  439 +- Snake ??
  440 +
  441 +## « Liste en compréhension » {libyli}
  442 +- Cas d'utilisation
  443 + - on veut parcourir une liste
  444 + - calculer une valeur pour chaque élément
  445 + - et remplir une nouvelle liste
  446 +- Version « classique » {anim-continue}
  447 +```python
  448 +premiers = [2, 3, 5, 7, 11]
  449 +carres = []
  450 +for n in premiers:
  451 + carres.append(n*n)
  452 +{slide}
  453 +```
  454 +- Compréhension de liste {anim-continue}
  455 +```python
  456 +premiers = [2, 3, 5, 7, 11, 13]
  457 +carres = [n*n for n in premiers]
  458 +{slide}
  459 +```
  460 +- Compréhension de liste avec condition {anim-continue}
  461 +```python
  462 +def premier(n):
  463 + ...
  464 + return ... # True ssi le nombre est premier
  465 +
  466 +carres = [n*n for n in range(15) if premier(n)]
  467 +{slide}
  468 +```
  469 +
  470 +# listes
  471 +```python
  472 +"na" * 10
  473 +[20, 30] * 10
  474 +[0] * 100
  475 +list(range(10))
  476 +
  477 +[0 for i in range(10)]
  478 +[i for i in range(100)]
  479 +
  480 +a[0]
  481 +a[-1]
  482 +a[2:4]
  483 +a[2:3]
  484 +a[2:]
  485 +a[:4]
  486 +a[:-1]
  487 +{comment}
  488 +```
  489 +
  490 +
  491 +
  492 +# $\pi$
  493 +- {comment}
  494 + - pi en générant une grille de nombres au hasards
  495 + - et en mappant vers une liste de distances
  496 + - et en mappant vers une liste de booléen (éventuellement `booleen_vers_int`)
  497 + - puis en sommant (sum())
  498 +
  499 +# OK
  500 +<!--
  501 +## Points Clés {key deck-status-fake-end}
  502 +-->
  503 +
  504 +</section>
  505 +
  506 + <!-- deck.status snippet -->
  507 + <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>
  508 +
  509 + <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>
  510 +
  511 + <a class="ujm" data-progress-size=": spe.top(15, 525); height: 65*designRatio; left: slide.left; width: 130*designRatio" target="_blank"></a>
  512 +
  513 +</div>
  514 +<!-- clicky -->
  515 +<script type="text/javascript">
  516 +var clicky_site_ids = clicky_site_ids || [];
  517 +clicky_site_ids.push(100779706);
  518 +(function() {
  519 + var s = document.createElement('script');
  520 + s.type = 'text/javascript';
  521 + s.async = true;
  522 + s.src = '//static.getclicky.com/js';
  523 + ( document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0] ).appendChild( s );
  524 +})();
  525 +</script>
  526 +<noscript><p><img alt="Clicky" width="1" height="1" src="//in.getclicky.com/100779706ns.gif" /></p></noscript>
  527 +
  528 +
  529 +<!-- Histats.com START (aync)-->
  530 +<script type="text/javascript">var _Hasync= _Hasync|| [];
  531 +_Hasync.push(['Histats.start', '1,2767123,4,0,0,0,00010000']);
  532 +_Hasync.push(['Histats.fasi', '1']);
  533 +_Hasync.push(['Histats.track_hits', '']);
  534 +(function() {
  535 +var hs = document.createElement('script'); hs.type = 'text/javascript'; hs.async = true;
  536 +hs.src = ('//s10.histats.com/js15_as.js');
  537 +(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(hs);
  538 +})();</script>
  539 +<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>
  540 +<!-- Histats.com END -->
  541 +</body>
  542 +</html>