"
93 | ]
94 | },
95 | "execution_count": 5,
96 | "metadata": {},
97 | "output_type": "execute_result"
98 | }
99 | ],
100 | "source": [
101 | "# Exécutez cette cellule !\n",
102 | "from IPython.core.display import HTML\n",
103 | "\n",
104 | "styles = \"\"\n",
105 | "HTML(styles)"
106 | ]
107 | },
108 | {
109 | "cell_type": "markdown",
110 | "metadata": {},
111 | "source": [
112 | "Dans les séquences de travail, vous rencontrerez certains logos :\n",
113 | "\n",
114 | " indique un exercice à réaliser
\n",
115 | "\n",
116 | "\n",
117 | " indique un point important qui nécessite une réponse de votre part et sera ensuite demandé lors du bilan de la séquence
"
118 | ]
119 | },
120 | {
121 | "cell_type": "markdown",
122 | "metadata": {},
123 | "source": [
124 | "## Valeurs, objets, identifiants\n",
125 | "Un **identifiant** est un lien vers un espace de stockage de données. \n",
126 | "Lorsqu'on écrit `a = 2` python crée automatiquement un espace de stockage pour la **valeur** `2`, qu'on peut atteindre avec l'identifiant `a`. Dans les langages de programmation plus anciens, on parlait de **variable**...et comme nous avons pris de mauvaises habitudes on risque de continuer à utiliser ce terme. ;)\n",
127 | "\n",
128 | "Un **objet** est une valeur qui possède des super-pouvoirs, et dont nous expliquerons le fonctionnement plus tard. \n",
129 | "Retenez juste que depuis la version 3 de python, **tout est objet**."
130 | ]
131 | },
132 | {
133 | "cell_type": "markdown",
134 | "metadata": {},
135 | "source": [
136 | "## Règles pour les identifiants\n",
137 | "Un identifiant permet donc d'accéder à une variable/objet. Cet identifiant doit respecter:\n",
138 | " * des contraintes grammaticales (obligatoires)\n",
139 | " * des conventions d'écriture (facultatives)\n",
140 | "\n",
141 | "Les règles de bon usage de python sont décrites dans des documents officiels nommés PEP. Vous trouverez les contraintes et conventions d'écriture dans la [PEP8](https://openclassrooms.com/fr/courses/4425111-perfectionnez-vous-en-python/4464230-assimilez-les-bonnes-pratiques-de-la-pep-8).\n",
142 | "\n",
143 | "Les principales **contraintes grammaticales** pour les identifiants sont :\n",
144 | " * pas de chiffre en début d'identifiant\n",
145 | " * pas de symboles de ponctuation, d'espace, d'apostrophe, de guillements, de slash; seul underscore _ est autorisé\n",
146 | "\n",
147 | "Et les principales **conventions d'écriture** sont :\n",
148 | " * variables/objets en minuscules : truc, et pas Truc ni TRUC\n",
149 | " * constantes (qui n'existent pas formellement en python) en majuscules : TRUC\n",
150 | " * des séparations de mots par majuscules ([Camel case](https://fr.wikipedia.org/wiki/Camel_case)) : nbBilles, distVilleDepart\n",
151 | " * des espaces de séparation afin d'alléger la lecture: `a = 2`\n",
152 | " "
153 | ]
154 | },
155 | {
156 | "cell_type": "markdown",
157 | "metadata": {},
158 | "source": [
159 | "### Exercice 1 - identifiants\n",
160 | "\n",
161 | "Corrigez les problèmes ci-dessous
\n"
162 | ]
163 | },
164 | {
165 | "cell_type": "code",
166 | "execution_count": null,
167 | "metadata": {
168 | "scrolled": true
169 | },
170 | "outputs": [],
171 | "source": [
172 | "l'avion = \"rafale\"\n",
173 | "tire-bouchon = True\n",
174 | "7ici = \"Vélizy\""
175 | ]
176 | },
177 | {
178 | "cell_type": "markdown",
179 | "metadata": {},
180 | "source": [
181 | "## Types/classes\n",
182 | "\n",
183 | "Chaque valeur/objet possède un type/classe, qui indique ses capacités.\n",
184 | "Les principaux types/classes natives sont :\n",
185 | " * `int` : type entier relatif, pas de valeur maximale depuis python3\n",
186 | " * `float` : nombres décimaux\n",
187 | " * `str` : chaînes de caractères (lettres, mots, phrases, délimités par des \\' ou des \\\" )\n",
188 | " * `bool` : booléens (`True` ou `False`)\n",
189 | " * `list` : listes, ou tableaux (symbolisés par des \\[ \\] )\n",
190 | " * `dict` : dictionnaires (symbolisés par des \\{ \\} )\n",
191 | " * `set` : ensembles au sens mathématique\n",
192 | " * `tuples` : couples, triplets, n-uplets (ex: (5, 2) ou (3, 9, 2) )"
193 | ]
194 | },
195 | {
196 | "cell_type": "markdown",
197 | "metadata": {},
198 | "source": [
199 | "\n",
200 | " \n",
201 | "**TRES IMPORTANT** : [la documentation officielle de python](https://docs.python.org/fr/3/) en français vous aidera énormément, prenez l'habitude de la consulter afin d'avoir les informations exactes ! \n",
202 | " \n",
203 | "**ATTENTION**, veillez bien à ce que la version de la doc python (en haut à gauche) corresponde à celle que vous utilisez.\n",
204 | "\n",
205 | "
"
206 | ]
207 | },
208 | {
209 | "cell_type": "markdown",
210 | "metadata": {},
211 | "source": [
212 | "### Exercice 2 - Types\n",
213 | "\n",
214 | "\n",
215 | " \n",
216 | "**Ex2.0** Dans l'exemple ci-dessous, modifiez la valeur de `a` afin d'obtenir un type `float`.\n",
217 | "\n",
218 | "
"
219 | ]
220 | },
221 | {
222 | "cell_type": "code",
223 | "execution_count": null,
224 | "metadata": {},
225 | "outputs": [],
226 | "source": [
227 | "a = 12\n",
228 | "print(type(a))"
229 | ]
230 | },
231 | {
232 | "cell_type": "markdown",
233 | "metadata": {},
234 | "source": [
235 | "\n",
236 | " \n",
237 | "**Ex2.1** Faites de même afin d'obtenir un type `str` contenant `réseaux`.\n",
238 | "\n",
239 | "
"
240 | ]
241 | },
242 | {
243 | "cell_type": "code",
244 | "execution_count": null,
245 | "metadata": {},
246 | "outputs": [],
247 | "source": []
248 | },
249 | {
250 | "cell_type": "markdown",
251 | "metadata": {},
252 | "source": [
253 | "\n",
254 | " \n",
255 | "**Ex2.2** Faites de même afin d'obtenir un type `bool`.\n",
256 | " \n",
257 | "
"
258 | ]
259 | },
260 | {
261 | "cell_type": "code",
262 | "execution_count": null,
263 | "metadata": {},
264 | "outputs": [],
265 | "source": []
266 | },
267 | {
268 | "cell_type": "markdown",
269 | "metadata": {},
270 | "source": [
271 | "Pour les autres types, nous verrons ultérieurement comment procéder."
272 | ]
273 | },
274 | {
275 | "cell_type": "markdown",
276 | "metadata": {},
277 | "source": [
278 | "## Specificité des entiers\n",
279 | "\n",
280 | "Pour faciliter la lisibilité des grands nombres entiers, il est possible d'utiliser le underscore _ pour faire des séparations.\n",
281 | "\n",
282 | "Par exemple `123_456_789 = 123456789`.\n",
283 | "\n",
284 | "### Valeur maximale représentable\n",
285 | "\n",
286 | "En Python 2, la taille des `int` était limité à 32 bits, il était donc possible possible de stocker des nombres entiers de –2 147 483 648 to 2 147 483 647.\n",
287 | "\n",
288 | "Avec les entiers longs, il est possible d'étendre la taille à 63 bits, soit de –9 223 372 036 854 775 808 to 9 223 372 036 854 775 807. En Python 3, toutes ces limitations sont finies et les entiers peuvent être plus grands que 64 bits. Il est ainsi possible de représenter des nombres arbitrairement grands, par exemple un googol (un suivi de 100 zeros), qui était le nom prévu initialement de Google, avant de trouver un nom plus simple à épeler : "
289 | ]
290 | },
291 | {
292 | "cell_type": "code",
293 | "execution_count": null,
294 | "metadata": {},
295 | "outputs": [],
296 | "source": [
297 | "googol = 10_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000\n",
298 | "\n",
299 | "print(googol)"
300 | ]
301 | },
302 | {
303 | "cell_type": "markdown",
304 | "metadata": {},
305 | "source": [
306 | "### Base et numération\n",
307 | "\n",
308 | "Les entiers peuvent être rentrés directement dans différentes bases usuelles en utilisant un préfixe :\n",
309 | "- `0b` : système binaire, par exemple `0b0110` en base 2 vaut 6 en base 10\n",
310 | "- `0o` : système octal, par exemple `0o42` en base 8 vaut 34 en base 10\n",
311 | "- rien : système décimal, c'est celui utilisé habituellement. 42 vaut 42 en base 10\n",
312 | "- `0x` : système hexadécimal, par exemple `0x1313C` en base 16 vaut 78140\n",
313 | "\n",
314 | "On peut mentionner qu'il est possible d'utiliser la notation scientifique ($a \\times 10^n$), par exemple `1.5e3 = 1500.0` et `5e-2 = 0.005`, mais attention ce sont des `float` et pas des `int`.\n",
315 | "\n",
316 | "\n",
317 | "### Les conversions vers les entiers\n",
318 | "On peut convertir un nombre en `int` (entier décimal) à partir de n'importe quelle base avec `int(\"nombre\", base)` où le nombre est à indiquer sous forme de `str`. Par exemple :"
319 | ]
320 | },
321 | {
322 | "cell_type": "code",
323 | "execution_count": null,
324 | "metadata": {},
325 | "outputs": [],
326 | "source": [
327 | "# depuis du binaire\n",
328 | "a = int(\"0101_1111_0101\", 2)\n",
329 | "print(a)"
330 | ]
331 | },
332 | {
333 | "cell_type": "code",
334 | "execution_count": null,
335 | "metadata": {},
336 | "outputs": [],
337 | "source": [
338 | "# depuis la base 7\n",
339 | "a = int(\"263\", 7)\n",
340 | "print(a)"
341 | ]
342 | },
343 | {
344 | "cell_type": "markdown",
345 | "metadata": {},
346 | "source": [
347 | "\n",
348 | " \n",
349 | "**Ex3.0** Combien vaut le nombre `\"BAD\"` de base 16 en décimal ?\n",
350 | " \n",
351 | "
"
352 | ]
353 | },
354 | {
355 | "cell_type": "code",
356 | "execution_count": null,
357 | "metadata": {},
358 | "outputs": [],
359 | "source": []
360 | },
361 | {
362 | "cell_type": "markdown",
363 | "metadata": {},
364 | "source": [
365 | "Il est aussi possible de convertir des octets (de type `bytes`) en entiers, en spécifiant l'ordre de lecture (`big` ou `little` indian) et si les entiers sont signés ou non. C'est particulièrement utile pour lire des trames réseaux ou des fichiers binaires. Par exemple"
366 | ]
367 | },
368 | {
369 | "cell_type": "code",
370 | "execution_count": null,
371 | "metadata": {},
372 | "outputs": [],
373 | "source": [
374 | "octet = bytes.fromhex('20')\n",
375 | "a = int.from_bytes(octet, byteorder='little', signed=False)\n",
376 | "print(a)"
377 | ]
378 | },
379 | {
380 | "cell_type": "markdown",
381 | "metadata": {},
382 | "source": [
383 | "\n",
384 | " \n",
385 | "**Ex3.1** Combien vaut l'octet `'9E'` encodé en big indian et signé en décimal ?\n",
386 | " \n",
387 | "
"
388 | ]
389 | },
390 | {
391 | "cell_type": "code",
392 | "execution_count": null,
393 | "metadata": {},
394 | "outputs": [],
395 | "source": []
396 | },
397 | {
398 | "cell_type": "markdown",
399 | "metadata": {},
400 | "source": [
401 | "### Les conversions depuis les entiers\n",
402 | "\n",
403 | "Il est possible de faire l'inverse et de convertir un nombre décimal en binaire avec `bin()` en octal avec `oct()` et en hexadécimal avec `hex()`. Par exemple :"
404 | ]
405 | },
406 | {
407 | "cell_type": "code",
408 | "execution_count": null,
409 | "metadata": {},
410 | "outputs": [],
411 | "source": [
412 | "a = 42\n",
413 | "print(\"En binaire, 42 = \", bin(a))\n",
414 | "print(\"En octal, 42 = \", oct(a))\n",
415 | "print(\"En hexadécimal, 42 = \", hex(a))"
416 | ]
417 | },
418 | {
419 | "cell_type": "markdown",
420 | "metadata": {},
421 | "source": [
422 | "## Opérateurs numériques\n",
423 | "Les opérateurs permettent de réaliser des opérations sur les valeurs/objets. \n",
424 | "Les **opérateurs numériques** usuels sont : `+ - * / // % **` \n",
425 | "Leur comportement dépend des types concernés."
426 | ]
427 | },
428 | {
429 | "cell_type": "markdown",
430 | "metadata": {},
431 | "source": [
432 | "### Exercices 4 - Opérateurs standards\n",
433 | " \n",
434 | " \n",
435 | "\n",
436 | " \n",
437 | "**Ex4.0 - `+` entre `int`** \n",
438 | "Utilisez l'opérateur `+` entre deux `int` et affichez le type du résultat obtenu.\n",
439 | "\n",
440 | "
"
441 | ]
442 | },
443 | {
444 | "cell_type": "code",
445 | "execution_count": null,
446 | "metadata": {},
447 | "outputs": [],
448 | "source": []
449 | },
450 | {
451 | "cell_type": "markdown",
452 | "metadata": {},
453 | "source": [
454 | "\n",
455 | " \n",
456 | "**Ex4.1 - `+` entre `float` et `int`** \n",
457 | "Utilisez l'opérateur `+` entre un `float`et un `int` et affichez le résultat obtenu, et son type.\n",
458 | "\n",
459 | "
"
460 | ]
461 | },
462 | {
463 | "cell_type": "code",
464 | "execution_count": null,
465 | "metadata": {
466 | "scrolled": true
467 | },
468 | "outputs": [],
469 | "source": []
470 | },
471 | {
472 | "cell_type": "markdown",
473 | "metadata": {},
474 | "source": [
475 | "\n",
476 | " \n",
477 | "**IMPORTANT** : lorsqu'on utilise des opérateurs, il existe un mécanisme de conversion implicite qui...\n",
478 | "\n",
479 | "
"
480 | ]
481 | },
482 | {
483 | "cell_type": "markdown",
484 | "metadata": {},
485 | "source": [
486 | "\n",
487 | " \n",
488 | "**Ex4.2 - `+` entre `str`** \n",
489 | "Utilisez l'opérateur `+` entre deux `str` et affichez le résultat obtenu, et son type.\n",
490 | "\n",
491 | "
"
492 | ]
493 | },
494 | {
495 | "cell_type": "code",
496 | "execution_count": null,
497 | "metadata": {},
498 | "outputs": [],
499 | "source": [
500 | "a = 'réseaux' + 'télécom'"
501 | ]
502 | },
503 | {
504 | "cell_type": "markdown",
505 | "metadata": {},
506 | "source": [
507 | "\n",
508 | " \n",
509 | "**Ex4.3 - `+` entre `int` et`str`** \n",
510 | "Utilisez l'opérateur `+` entre un `int`et un `str` et affichez le résultat obtenu, et son type.\n",
511 | "\n",
512 | "
"
513 | ]
514 | },
515 | {
516 | "cell_type": "code",
517 | "execution_count": null,
518 | "metadata": {},
519 | "outputs": [],
520 | "source": [
521 | "a = 1 + \"fini\""
522 | ]
523 | },
524 | {
525 | "cell_type": "markdown",
526 | "metadata": {},
527 | "source": [
528 | "\n",
529 | " \n",
530 | "**IMPORTANT** : Pour l'opérateur `+`, nous pouvons en conclure que...
"
531 | ]
532 | },
533 | {
534 | "cell_type": "markdown",
535 | "metadata": {},
536 | "source": [
537 | "\n",
538 | " \n",
539 | "**Ex4.4 - `*` entre`str` et `int`** \n",
540 | "Utilisez maintenant l'opérateur `*` entre un `str`et un `int` et affichez le résultat obtenu, et son type.\n",
541 | "\n",
542 | "
"
543 | ]
544 | },
545 | {
546 | "cell_type": "code",
547 | "execution_count": null,
548 | "metadata": {},
549 | "outputs": [],
550 | "source": [
551 | "a = 8 * \"simple,basique,\""
552 | ]
553 | },
554 | {
555 | "cell_type": "markdown",
556 | "metadata": {},
557 | "source": [
558 | "\n",
559 | " \n",
560 | "**Ex4.5 - Que font `/` et `//` ?** \n",
561 | "Essayez de distinguer les comportements de `/` et `//` :\n",
562 | " * quelles opérations réalisent-ils ?\n",
563 | " * à quel(s) type(s) peuvent-ils être associés?\n",
564 | "
"
565 | ]
566 | },
567 | {
568 | "cell_type": "code",
569 | "execution_count": null,
570 | "metadata": {},
571 | "outputs": [],
572 | "source": []
573 | },
574 | {
575 | "cell_type": "markdown",
576 | "metadata": {},
577 | "source": [
578 | "\n",
579 | " \n",
580 | "**IMPORTANT** : les opérateurs `/` et `//` réalisent respectivement des opérations de... \n",
581 | " \n",
582 | "Ils s'appliquent aux valeurs de type...
"
583 | ]
584 | },
585 | {
586 | "cell_type": "markdown",
587 | "metadata": {},
588 | "source": [
589 | "\n",
590 | " \n",
591 | "**Ex4.6 - Que fait l'opérateur** `**` **?**\n",
592 | "\n",
593 | "
"
594 | ]
595 | },
596 | {
597 | "cell_type": "code",
598 | "execution_count": null,
599 | "metadata": {},
600 | "outputs": [],
601 | "source": []
602 | },
603 | {
604 | "cell_type": "markdown",
605 | "metadata": {},
606 | "source": [
607 | "\n",
608 | " \n",
609 | "**IMPORTANT** : l'opérateur `**` permet de...
"
610 | ]
611 | },
612 | {
613 | "cell_type": "markdown",
614 | "metadata": {},
615 | "source": [
616 | "### Exercice 5 - modulo\n",
617 | "\n",
618 | "L'**opérateur modulo %** permet d'obtenir le reste de la division entière. \n",
619 | "\n",
620 | "\n",
621 | " \n",
622 | "**Ex5.0 - Pair ?** \n",
623 | "Quel calcul effectuer afin de savoir si `n` est pair ?
"
624 | ]
625 | },
626 | {
627 | "cell_type": "code",
628 | "execution_count": null,
629 | "metadata": {},
630 | "outputs": [],
631 | "source": [
632 | "n = 35"
633 | ]
634 | },
635 | {
636 | "cell_type": "markdown",
637 | "metadata": {},
638 | "source": [
639 | "\n",
640 | " \n",
641 | "**Ex5.1 - Multiple de ?** \n",
642 | "8751212 est-il un multiple de 3 ?
"
643 | ]
644 | },
645 | {
646 | "cell_type": "code",
647 | "execution_count": null,
648 | "metadata": {},
649 | "outputs": [],
650 | "source": []
651 | },
652 | {
653 | "cell_type": "markdown",
654 | "metadata": {},
655 | "source": [
656 | "\n",
657 | " \n",
658 | "**Ex5.2 - Modulogâteau** 🍰🍰🍰🍰🍰 \n",
659 | "20 parts de gâteaux, 7 convives, combien de parts de gâteau par personne et combien de parts restantes ?
"
660 | ]
661 | },
662 | {
663 | "cell_type": "code",
664 | "execution_count": null,
665 | "metadata": {
666 | "scrolled": true
667 | },
668 | "outputs": [],
669 | "source": []
670 | },
671 | {
672 | "cell_type": "markdown",
673 | "metadata": {},
674 | "source": [
675 | "## Opérateurs d'affectation\n",
676 | "Les **opérateurs d'affectation** sont : `= += -+ *+ /= //* %=`. \n",
677 | "\n",
678 | "Le `=` permet évidemment d'associer une valeur/objet à un identificateur. \n",
679 | "Les autres opérateurs d'affectation sont en fait du sucre syntaxique: ils ne sont pas indispensables mais simplifient les écritures.\n",
680 | "\n",
681 | "### Exercice 5 - Modifier une valeur\n",
682 | "\n",
683 | "\n",
684 | " \n",
685 | "**Ex6.0 - La classique** \n",
686 | "Dans le code suivant, en utilisant les opérateurs standards `-` et `/`, effectuez des opérations diminuant `a` de 4 puis réduisant de moitié sa valeur.
"
687 | ]
688 | },
689 | {
690 | "cell_type": "code",
691 | "execution_count": null,
692 | "metadata": {},
693 | "outputs": [],
694 | "source": [
695 | "a = 18"
696 | ]
697 | },
698 | {
699 | "cell_type": "markdown",
700 | "metadata": {},
701 | "source": [
702 | "\n",
703 | " \n",
704 | "**Ex6.1 - La sucre syntaxique** \n",
705 | "Effectuez les mêmes opérations en utilisant les opérateurs `-=` et `/=`.
"
706 | ]
707 | },
708 | {
709 | "cell_type": "code",
710 | "execution_count": null,
711 | "metadata": {},
712 | "outputs": [],
713 | "source": [
714 | "a = 18"
715 | ]
716 | },
717 | {
718 | "cell_type": "markdown",
719 | "metadata": {},
720 | "source": [
721 | "\n",
722 | " \n",
723 | "**IMPORTANT :** l'opérateur `+=` permet de remplacer...
"
724 | ]
725 | },
726 | {
727 | "cell_type": "markdown",
728 | "metadata": {},
729 | "source": [
730 | "## Opérateurs de comparaison et opérateurs logiques\n",
731 | "Les **opérateurs de comparaison** sont : `==, <, <=, >=, >, !=`. \n",
732 | "\n",
733 | "Associés à des **expressions** (comme `2 * a + 1` ou ` 5.2`), ils permettent d'obtenir **une valeur de vérité** (`True` ou `False`). Par exemple:"
734 | ]
735 | },
736 | {
737 | "cell_type": "code",
738 | "execution_count": null,
739 | "metadata": {},
740 | "outputs": [],
741 | "source": [
742 | "a = 18\n",
743 | "print(a == 12)"
744 | ]
745 | },
746 | {
747 | "cell_type": "markdown",
748 | "metadata": {},
749 | "source": [
750 | "Les **opérateurs logiques** usuels sont `and, or, not`. \n",
751 | "Ils permettent d'associer une ou plusieurs valeurs de vérité et d'obtenir une valeur de vérité. \n",
752 | "Par exemple:"
753 | ]
754 | },
755 | {
756 | "cell_type": "code",
757 | "execution_count": null,
758 | "metadata": {},
759 | "outputs": [],
760 | "source": [
761 | "a = 18\n",
762 | "b = 12\n",
763 | "print(a >= 18 and b != 5)"
764 | ]
765 | },
766 | {
767 | "cell_type": "markdown",
768 | "metadata": {},
769 | "source": [
770 | "### Exercice 6 - Quête de vérité\n",
771 | "\n",
772 | "\n",
773 | "\n",
774 | " \n",
775 | "**Ex7.0 - Minority report** \n",
776 | "Ecrivez une expression utilisant opérateurs de comparaison et/ou opérateurs logiques, et permettant d'afficher si `bob` est mineur (`True`) ou majeur (`False`). **Attention, votre programme doit renvoyer `False` en cas de valeur négative**. \n",
777 | "**MERCI DE BIEN LIRE CET ENONCE!** \n",
778 | "Exemple: \n",
779 | " 12 : `True` \n",
780 | " -2 : `False`
"
781 | ]
782 | },
783 | {
784 | "cell_type": "code",
785 | "execution_count": null,
786 | "metadata": {},
787 | "outputs": [],
788 | "source": [
789 | "bob = 17"
790 | ]
791 | },
792 | {
793 | "cell_type": "markdown",
794 | "metadata": {},
795 | "source": [
796 | "\n",
797 | " \n",
798 | "**Ex7.1 - Minority report 2** \n",
799 | "Même exercice, mais vous n'avez le droit d'utiliser que des opérateurs de comparaison (pas d'opérateurs logiques).
"
800 | ]
801 | },
802 | {
803 | "cell_type": "code",
804 | "execution_count": null,
805 | "metadata": {},
806 | "outputs": [],
807 | "source": []
808 | },
809 | {
810 | "cell_type": "markdown",
811 | "metadata": {},
812 | "source": [
813 | "\n",
814 | " \n",
815 | "**IMPORTANT** : en python, on peut écrire des égalités, des inégalités, mais également des...
"
816 | ]
817 | },
818 | {
819 | "cell_type": "markdown",
820 | "metadata": {},
821 | "source": [
822 | "\n",
823 | " \n",
824 | "**Ex7.2 - Chiffre pair** \n",
825 | "Ecrivez une expression permettant d'afficher si `n` est bien un __chiffre__ pair. \n",
826 | "Exemple: 12 est pair mais n'est pas un chiffre donc `False` , 3 est un chiffre impair donc `False`
"
827 | ]
828 | },
829 | {
830 | "cell_type": "code",
831 | "execution_count": null,
832 | "metadata": {},
833 | "outputs": [],
834 | "source": [
835 | "n = 12"
836 | ]
837 | },
838 | {
839 | "cell_type": "markdown",
840 | "metadata": {},
841 | "source": [
842 | "\n",
843 | " \n",
844 | "**Ex7.3 - Même signe** \n",
845 | "Ecrivez une expression permettant d'afficher si `n` et `m` sont bien de même signe.
"
846 | ]
847 | },
848 | {
849 | "cell_type": "code",
850 | "execution_count": null,
851 | "metadata": {},
852 | "outputs": [],
853 | "source": [
854 | "n = 12\n",
855 | "m = -2"
856 | ]
857 | },
858 | {
859 | "cell_type": "markdown",
860 | "metadata": {},
861 | "source": [
862 | "\n",
863 | " \n",
864 | "**Ex7.4 - Table de vérité du OU** \n",
865 | "Complétez l'affichage de la table de vérité (toutes les possibilités d'association de booléens) de l'opérateur OU.
"
866 | ]
867 | },
868 | {
869 | "cell_type": "code",
870 | "execution_count": null,
871 | "metadata": {},
872 | "outputs": [],
873 | "source": [
874 | "print(True, \"or\", True, \"=\", True or True)\n",
875 | "# etc..."
876 | ]
877 | },
878 | {
879 | "cell_type": "markdown",
880 | "metadata": {},
881 | "source": [
882 | "
\n",
883 | "\n",
884 | "# Bilan\n",
885 | "\n",
886 | "\n",
887 | " \n",
888 | "**Petit bilan sur les types et opérateurs vus** \n",
889 | "Vous devez maintenant être capables d'évaluer la valeur obtenue et de reconnaître son type une fois que les expressions suivantes sont évaluées. Essayez de deviner, puis vérifiez.
"
890 | ]
891 | },
892 | {
893 | "cell_type": "code",
894 | "execution_count": null,
895 | "metadata": {},
896 | "outputs": [],
897 | "source": [
898 | "# 6 - 2\n",
899 | "# 6 - 3.2\n",
900 | "# 6 * 4.3\n",
901 | "# 5 // 2\n",
902 | "# 5 / 2\n",
903 | "# 6 / 2\n",
904 | "# 6 % 2\n",
905 | "# \"hello\" + \"ça va ?\"\n",
906 | "# \"hello\" * 3\n",
907 | "# 2 < 4\n",
908 | "# (2 < 4) or (x == 2) # donnez une valeur à x\n",
909 | "# not (2 < 4 and False)\n",
910 | "# 2 <= x < 34 # donnez une valeur à x"
911 | ]
912 | },
913 | {
914 | "cell_type": "markdown",
915 | "metadata": {},
916 | "source": [
917 | "\n",
918 | "\n",
919 | "## __Récapitulatif__\n",
920 | "En python, les **identifiants** doivent respecter... \n",
921 | "La **valeur/objet** associée à un identifiant permet de déterminer automatiquement... \n",
922 | "Les **opérateurs** se comportent différemment en fonction... \n",
923 | "Lorsqu'on utilise des opérateurs, il existe un mécanisme de **conversion implicite** qui... \n",
924 | "Les principaux **opérateurs numériques** sont... \n",
925 | "Parmi ces opérateurs numériques, certains sont un peu particuliers:\n",
926 | " * `//` qui...\n",
927 | " * `%` qui...\n",
928 | " * `**` qui... \n",
929 | " \n",
930 | "Les **opérateurs d'affectation** sont... \n",
931 | "Les **opérateurs de comparaison** sont... \n",
932 | "Les **opérateurs logiques** sont... \n",
933 | "Une **expression**, c'est...\n",
934 | "
"
935 | ]
936 | },
937 | {
938 | "cell_type": "code",
939 | "execution_count": null,
940 | "metadata": {},
941 | "outputs": [],
942 | "source": []
943 | }
944 | ],
945 | "metadata": {
946 | "kernelspec": {
947 | "display_name": "Python 3 (ipykernel)",
948 | "language": "python",
949 | "name": "python3"
950 | },
951 | "language_info": {
952 | "codemirror_mode": {
953 | "name": "ipython",
954 | "version": 3
955 | },
956 | "file_extension": ".py",
957 | "mimetype": "text/x-python",
958 | "name": "python",
959 | "nbconvert_exporter": "python",
960 | "pygments_lexer": "ipython3",
961 | "version": "3.7.10"
962 | },
963 | "toc": {
964 | "base_numbering": 1,
965 | "nav_menu": {},
966 | "number_sections": true,
967 | "sideBar": true,
968 | "skip_h1_title": false,
969 | "title_cell": "Table of Contents",
970 | "title_sidebar": "Contents",
971 | "toc_cell": false,
972 | "toc_position": {},
973 | "toc_section_display": true,
974 | "toc_window_display": false
975 | }
976 | },
977 | "nbformat": 4,
978 | "nbformat_minor": 2
979 | }
980 |
--------------------------------------------------------------------------------
/tp/SAE03-TP2_io_if_while.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "
\n",
8 | "\n",
9 | "# SAÉ 03 - TP1 - Entrées/sorties, structures conditionnelles, boucles\n",
10 | "\n",
11 | "Bienvenue sur le Jupyter pour préparer la **SAÉ Traitement numérique du signal du département RT de Vélizy**. Les notebooks sont une adaptation de ceux proposés par le département info et de leur profs d'info géniaux.\n",
12 | "\n",
13 | "Dans ce TP, nous allons aborder:\n",
14 | " * les entrées-sorties en python: jouer avec le chaînes de caractères et découvrir `input`\n",
15 | " * les structures conditionnelles: `if`, `else`, `elif` \n",
16 | " * un certain type de boucles: `while`"
17 | ]
18 | },
19 | {
20 | "cell_type": "code",
21 | "execution_count": 1,
22 | "metadata": {},
23 | "outputs": [
24 | {
25 | "data": {
26 | "text/html": [
27 | ""
44 | ],
45 | "text/plain": [
46 | ""
47 | ]
48 | },
49 | "execution_count": 1,
50 | "metadata": {},
51 | "output_type": "execute_result"
52 | }
53 | ],
54 | "source": [
55 | "# Exécutez cette cellule !\n",
56 | "from IPython.core.display import HTML\n",
57 | "\n",
58 | "styles = \"\"\n",
59 | "HTML(styles)"
60 | ]
61 | },
62 | {
63 | "cell_type": "markdown",
64 | "metadata": {},
65 | "source": [
66 | "Dans les séquences de travail, vous rencontrerez certains logos :\n",
67 | "\n",
68 | " indique un exercice à réaliser
\n",
69 | "\n",
70 | "\n",
71 | " indique un point important qui nécessite une réponse de votre part et sera ensuite demandé lors du bilan de la séquence
"
72 | ]
73 | },
74 | {
75 | "cell_type": "markdown",
76 | "metadata": {},
77 | "source": [
78 | "## Entrées/sorties\n",
79 | "On appelle entrées/sorties l'ensemble des flux qui transitent vers l'écran (sorties) ou depuis le clavier (entrées). Ces entrées/sorties (**input/output** ou **io** en anglais) vous permettent de communiquer avec votre machine. \n",
80 | "\n",
81 | "Dans la séquence précédente, nous avons manipulé `print` sans en expliquer le fonctionnement en détail.\n",
82 | "\n",
83 | "### `print`, la base\n",
84 | "Dans sa version de base, `print` permet d'afficher du texte, des valeurs de variables."
85 | ]
86 | },
87 | {
88 | "cell_type": "code",
89 | "execution_count": null,
90 | "metadata": {
91 | "scrolled": true
92 | },
93 | "outputs": [],
94 | "source": [
95 | "print(\"du texte\")\n",
96 | "a, b = \"variables\", \"des\" # saviez-vous qu'on peut affecter simultanément plusieurs variables ?\n",
97 | "print(b, a)"
98 | ]
99 | },
100 | {
101 | "cell_type": "markdown",
102 | "metadata": {},
103 | "source": [
104 | "On peut aussi mêler texte et variables, de la façon suivante :"
105 | ]
106 | },
107 | {
108 | "cell_type": "code",
109 | "execution_count": null,
110 | "metadata": {
111 | "scrolled": true
112 | },
113 | "outputs": [],
114 | "source": [
115 | "h = 12\n",
116 | "m = 8\n",
117 | "print(\"il est exactement\", h, \"heures et\", m, \"minutes\")"
118 | ]
119 | },
120 | {
121 | "cell_type": "markdown",
122 | "metadata": {},
123 | "source": [
124 | "On peut aussi specifier le caractère de fin de ligne. Ce sera utile pour écrire sur la même ligne avec plusieurs print différents :"
125 | ]
126 | },
127 | {
128 | "cell_type": "code",
129 | "execution_count": null,
130 | "metadata": {},
131 | "outputs": [],
132 | "source": [
133 | "print(\"Cette ligne \", end=\"\")\n",
134 | "print(\"est écrite dans \", end=\"\")\n",
135 | "print(\"plusieurs prints\")"
136 | ]
137 | },
138 | {
139 | "cell_type": "markdown",
140 | "metadata": {},
141 | "source": [
142 | "\n",
143 | " \n",
144 | "**Ex1 - Restez zen** \n",
145 | "Initialisez 3 variables `x`, `y` et `z` avec des valeurs quelconques et affichez quelque chose comme `coordonnées du point A(12, 17, -5)` en utilisant les valeurs des trois variables comme coordonnées.
"
146 | ]
147 | },
148 | {
149 | "cell_type": "code",
150 | "execution_count": null,
151 | "metadata": {
152 | "scrolled": true
153 | },
154 | "outputs": [],
155 | "source": []
156 | },
157 | {
158 | "cell_type": "markdown",
159 | "metadata": {
160 | "scrolled": true
161 | },
162 | "source": [
163 | "Après cet exercice, vous devez avoir compris que cette notation qui mélange texte et variables est extrêmement pénible et met parfois des espaces là où on n'en voudrait pas.\n",
164 | "Il nous faut un autre moyen de réaliser ce genre d'affichages... \n",
165 | "\n",
166 | "### Formatage des chaînes de caractères\n",
167 | "Pour se simplifier la vie lors de l'affichage, on va utiliser le **formatage des chaînes de caractères**, qui permet de mêler facilement texte et variables, et de modifier le format des variables. "
168 | ]
169 | },
170 | {
171 | "cell_type": "markdown",
172 | "metadata": {},
173 | "source": [
174 | "\n",
175 | " \n",
176 | "**IMPORTANT** : Le **format**, c'est la façon de représenter une valeur. \n",
177 | " Par exemple, l'entier `12` peut être affiché sous forme de flottant `12.0` ou d'hexadécimal `0xC`.
"
178 | ]
179 | },
180 | {
181 | "cell_type": "markdown",
182 | "metadata": {},
183 | "source": [
184 | "Voici la façon de procéder pour mêler texte et variables :"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": null,
190 | "metadata": {
191 | "scrolled": true
192 | },
193 | "outputs": [],
194 | "source": [
195 | "b = 2\n",
196 | "s = f\"il a mangé {b} beignets\"\n",
197 | "print(s)"
198 | ]
199 | },
200 | {
201 | "cell_type": "code",
202 | "execution_count": null,
203 | "metadata": {
204 | "scrolled": true
205 | },
206 | "outputs": [],
207 | "source": [
208 | "easy = \"simple\"\n",
209 | "read = \"lire\"\n",
210 | "write = \"écrire\"\n",
211 | "print(f\"{easy} à {read}, {easy} à {write}\")"
212 | ]
213 | },
214 | {
215 | "cell_type": "markdown",
216 | "metadata": {},
217 | "source": [
218 | "Le préfixe `f` en amont d'une chaîne indique qu'on va formater la chaîne. \n",
219 | "On peut ajouter des instructions de formatage dans les accolades et à côté de l'identifiant de la variable utilisée :"
220 | ]
221 | },
222 | {
223 | "cell_type": "code",
224 | "execution_count": null,
225 | "metadata": {
226 | "scrolled": true
227 | },
228 | "outputs": [],
229 | "source": [
230 | "pr = 12\n",
231 | "print(f\"Ce truc coûte {pr}€ mais on va plutôt afficher {pr:.2f}€.\")"
232 | ]
233 | },
234 | {
235 | "cell_type": "code",
236 | "execution_count": null,
237 | "metadata": {
238 | "scrolled": true
239 | },
240 | "outputs": [],
241 | "source": [
242 | "print(f\"On peut aussi faire des calculs, comme {345 + 54 * 7}\")"
243 | ]
244 | },
245 | {
246 | "cell_type": "markdown",
247 | "metadata": {},
248 | "source": [
249 | "\n",
250 | " \n",
251 | "**IMPORTANT** : on peut **formater** (modifier le format) d'une chaîne de caractères en utilisant `f` en amont de la chaîne, associé à des `{}`. \n",
252 | "Dans ces accolades, on précise la variable dont on souhaite afficher la valeur, et éventuellement le format qu'on souhaite lui appliquer. \n",
253 | "Exemples: pour une variable `a`\n",
254 | " * `{a:f}` la convertit en **flottant**\n",
255 | " * `{a:s}` la convertit en **string**\n",
256 | " * `{a:x}` convertit en **hexadécimal**\n",
257 | " * `{a:3f}` indique, pour une variable numérique, qu'on souhaite afficher sa valeur sur au moins 3 caractères\n",
258 | " * `{a:.2f}` indique, pour une variable décimale, qu'on souhaite une précision de 2 chiffres après la virgule\n",
259 | " \n",
260 | "Pour davantage de détails voir [le mini-langage de spécification de format](https://docs.python.org/fr/3/library/string.html#format-specification-mini-language).
"
261 | ]
262 | },
263 | {
264 | "cell_type": "markdown",
265 | "metadata": {},
266 | "source": [
267 | "\n",
268 | "\n",
269 | "**Ex2.0 - Mon beau tableau** \n",
270 | "Dans le code suivant, réalisez un bel affichage de chaque nom et score sous forme de tableau, comme suit :\n",
271 | "```.\n",
272 | "jack 5\n",
273 | "jo\t 17\n",
274 | "averell\t 0```
"
275 | ]
276 | },
277 | {
278 | "cell_type": "code",
279 | "execution_count": null,
280 | "metadata": {
281 | "scrolled": false
282 | },
283 | "outputs": [],
284 | "source": [
285 | "nom1, score1 = \"jack\", 5\n",
286 | "nom2, score2 = \"jo\", 17\n",
287 | "nom3, score3 = \"averell\", 0"
288 | ]
289 | },
290 | {
291 | "cell_type": "markdown",
292 | "metadata": {},
293 | "source": [
294 | "\n",
295 | " \n",
296 | "**Ex2.1 - Mon très beau tableau** \n",
297 | "Améliorez encore le formatage afin d'aligner les noms à droite (à vous de chercher dans la doc comment procéder) :``` . \n",
298 | " jack\t 5\n",
299 | " jo\t 17\n",
300 | " averell\t 0```
"
301 | ]
302 | },
303 | {
304 | "cell_type": "code",
305 | "execution_count": null,
306 | "metadata": {
307 | "scrolled": true
308 | },
309 | "outputs": [],
310 | "source": []
311 | },
312 | {
313 | "cell_type": "markdown",
314 | "metadata": {},
315 | "source": [
316 | "\n",
317 | " \n",
318 | "**Ex2.2 - Dou-bi-dou-bi-dou-waaa** \n",
319 | "Êtes-vous capable d'afficher 5 lignes contenant chacune :\n",
320 | " * la valeur de la variable `a` affichée 10 fois de suite\n",
321 | " * suivie de la valeur de la variable `b` ? \n",
322 | " \n",
323 | "**ATTENTION** : vous n'avez le droit d'écrire que __deux instructions__ au plus !
"
324 | ]
325 | },
326 | {
327 | "cell_type": "code",
328 | "execution_count": null,
329 | "metadata": {
330 | "scrolled": true
331 | },
332 | "outputs": [],
333 | "source": [
334 | "a = \"doubi\"\n",
335 | "b = \"douwaaaa \\n\""
336 | ]
337 | },
338 | {
339 | "cell_type": "markdown",
340 | "metadata": {},
341 | "source": [
342 | "\n",
343 | " \n",
344 | "**TRES IMPORTANT** : ce procédé de formatage des *strings* se nomme *f-strings*. Il a été introduit à partir de python 3.7. Si vous disposez d'une version antérieure, vous devez utiliser le procédé qui prévalait alors et qui différe sensiblement, voir [ici](https://docs.python.org/fr/3.5/tutorial/inputoutput.html#).
"
345 | ]
346 | },
347 | {
348 | "cell_type": "markdown",
349 | "metadata": {},
350 | "source": [
351 | "### `input`\n",
352 | "Lors de vos interactions avec votre programme, vous pouvez avoir besoin de demander à l'utilisateur de saisir une donnée ou une réponse. La fonction qui permet cela s'appelle `input` et s'utilise ainsi :"
353 | ]
354 | },
355 | {
356 | "cell_type": "code",
357 | "execution_count": null,
358 | "metadata": {
359 | "scrolled": true
360 | },
361 | "outputs": [],
362 | "source": [
363 | "a = input(\"tape un truc: \")\n",
364 | "print(f\"tu as tapé '{a}' !\")"
365 | ]
366 | },
367 | {
368 | "cell_type": "markdown",
369 | "metadata": {},
370 | "source": [
371 | "\n",
372 | " \n",
373 | "**Ex2.3 - Quel est son type?** \n",
374 | "Pouvez-vous afficher le type de la variable `a`, et vérifier ce qu'il advient quand on saisit des données entières, décimales, texte... ?
"
375 | ]
376 | },
377 | {
378 | "cell_type": "code",
379 | "execution_count": null,
380 | "metadata": {
381 | "scrolled": true
382 | },
383 | "outputs": [],
384 | "source": []
385 | },
386 | {
387 | "cell_type": "markdown",
388 | "metadata": {},
389 | "source": [
390 | "\n",
391 | " \n",
392 | "**IMPORTANT** : Depuis la version 3 de python, `input` renvoie toujours la valeur qui a été saisie en la convertissant sous forme de ...\n",
393 | "
"
394 | ]
395 | },
396 | {
397 | "cell_type": "markdown",
398 | "metadata": {},
399 | "source": [
400 | "Par conséquent, lorsqu'on souhaite récupérer une valeur numérique, il est nécessaire de la convertir. Dans le TP précédent, nous avons vu le mécanisme de **conversion implicite**, lorsque qu'on additionne deux valeurs ayant des types différents, par exemple. Nous avons également vu quelque cas de **conversion explicite** avec les changements de base.\n",
401 | "\n",
402 | "Voici comment procéder pour déclencher une **conversion explicite**, déclenchée délibérément :"
403 | ]
404 | },
405 | {
406 | "cell_type": "code",
407 | "execution_count": null,
408 | "metadata": {
409 | "scrolled": true
410 | },
411 | "outputs": [],
412 | "source": [
413 | "n = int(input(\"Un nombre ?\"))\n",
414 | "print(f\"votre nombre est {n} et le suivant est {n+1}\") # si n est converti en entier, l'addition doit fonctionner"
415 | ]
416 | },
417 | {
418 | "cell_type": "markdown",
419 | "metadata": {},
420 | "source": [
421 | "\n",
422 | " \n",
423 | "**IMPORTANT** : Pour déclencher une **conversion explicite**, il suffit d'appeler le **constructeur** de la classe concernée: `int`, `float`, `str`... \n",
424 | "Exemple : pour convertir l'entier 12 en flottant, on écrit ...\n",
425 | "\n",
426 | "
"
427 | ]
428 | },
429 | {
430 | "cell_type": "markdown",
431 | "metadata": {},
432 | "source": [
433 | "\n",
434 | " \n",
435 | "**Ex2.4 - Moyenne** \n",
436 | "Ecrivez un programme qui demande trois nombres et affiche leur moyenne. \n",
437 | "La saisie de `1`, `1` et `2` produit bien `1.33333` ?
"
438 | ]
439 | },
440 | {
441 | "cell_type": "code",
442 | "execution_count": null,
443 | "metadata": {
444 | "scrolled": true
445 | },
446 | "outputs": [],
447 | "source": [
448 | "a = int(input(\"\"))\n",
449 | "b = int(input(\"\"))\n",
450 | "c = int(input(\"\"))"
451 | ]
452 | },
453 | {
454 | "cell_type": "markdown",
455 | "metadata": {},
456 | "source": [
457 | "## Structures conditionnelles\n",
458 | "Jusqu'ici, nous avons écrit des petits programmes qui se déroulent systématiquement de la même manière. L'introduction d'un mécanisme **conditionnel** est indispensable en programmation, afin de pouvoir faire bifurquer son programme en fonction des situations rencontrées. \n",
459 | "En python, la structure conditionnelle utilise les mots-clés `if`, `elif` et `else`.\n",
460 | "### Condition unique\n",
461 | "On peut utiliser `if` seul afin de n'exécuter un morceau de programme que si la condition exigée est respectée. "
462 | ]
463 | },
464 | {
465 | "cell_type": "code",
466 | "execution_count": null,
467 | "metadata": {
468 | "scrolled": true
469 | },
470 | "outputs": [],
471 | "source": [
472 | "n = int(input(\"Tapez un positif:\"))\n",
473 | "if n < 0:\n",
474 | " print(\"C'est malin...\") # cette instruction est dans le if\n",
475 | " print(\"J'avais dit un positif!\") # celle-ci également\n",
476 | "print(f\"Votre nombre est {n}.\") # mais pas celle-ci"
477 | ]
478 | },
479 | {
480 | "cell_type": "markdown",
481 | "metadata": {},
482 | "source": [
483 | "\n",
484 | " \n",
485 | "**IMPORTANT** : L'instruction `if` permet d'exprimer une condition. \n",
486 | "Elle doit être suivie d'une expression et de `:`. \n",
487 | "Les instructions qui seront exécutées si la condition est vraie doivent **absolument** être **indentées**.
"
488 | ]
489 | },
490 | {
491 | "cell_type": "markdown",
492 | "metadata": {},
493 | "source": [
494 | "On peut utiliser les **expressions** et les **opérateurs logiques** vus dans la séquence précédente:"
495 | ]
496 | },
497 | {
498 | "cell_type": "code",
499 | "execution_count": null,
500 | "metadata": {
501 | "scrolled": true
502 | },
503 | "outputs": [],
504 | "source": [
505 | "n = int(input(\"Tapez un chiffre, cette fois:\"))\n",
506 | "if not(0 <= n <= 9): # si n n'est pas un chiffre\n",
507 | " print(\"C'est malin...\")\n",
508 | " print(\"J'avais dit un chiffre !\")\n",
509 | "print(f\"Vous avez tapé {n}.\")"
510 | ]
511 | },
512 | {
513 | "cell_type": "markdown",
514 | "metadata": {},
515 | "source": [
516 | "\n",
517 | " \n",
518 | "**Ex3.0** Ecrivez un programme qui demande deux entiers `a` et `b`, et affiche `youpi` si la somme des deux variables est positive. \n",
519 | "**Ex3.1** Modifiez votre programme afin qu'il affiche `youpi` si `a` est pair et si `b` vaut 5 ou 12.
\n"
520 | ]
521 | },
522 | {
523 | "cell_type": "code",
524 | "execution_count": null,
525 | "metadata": {
526 | "scrolled": true
527 | },
528 | "outputs": [],
529 | "source": []
530 | },
531 | {
532 | "cell_type": "markdown",
533 | "metadata": {},
534 | "source": [
535 | "### Conditions multiples et alternatives\n",
536 | "Lorsqu'on souhaite tester plusieurs alternatives dans une structure conditionnelle, on utilise `elif` qui est un raccourci de *else if* et qui signifie *sinon si*. Ce *sinon* signifie bien que la condition concernée ne sera testée que si la précédente s'est avérée fausse. \n",
537 | "**On peut utiliser autant de `elif` qu'on le souhaite**."
538 | ]
539 | },
540 | {
541 | "cell_type": "code",
542 | "execution_count": null,
543 | "metadata": {
544 | "scrolled": true
545 | },
546 | "outputs": [],
547 | "source": [
548 | "rep = input(\"On fait une petite pause? (o/n)\")\n",
549 | "if rep == \"o\":\n",
550 | " print(\"Ca me semble raisonnable.\")\n",
551 | "elif rep == \"n\": # ne sera exécuté que si la condition précédente était fausse\n",
552 | " print(\"J'en vois qui tournent de l'oeil.\")\n",
553 | "print(\"Allez, pause !\")"
554 | ]
555 | },
556 | {
557 | "cell_type": "markdown",
558 | "metadata": {},
559 | "source": [
560 | "Dans une structure conditionnelle, on peut aussi prévoir un cas si toutes les conditions précédentes ont échouées: `else` (*sinon*). \n",
561 | "**On ne peut utiliser qu'un seul `else`, obligatoirement en dernière position de la structure conditionnelle.**"
562 | ]
563 | },
564 | {
565 | "cell_type": "code",
566 | "execution_count": null,
567 | "metadata": {
568 | "scrolled": true
569 | },
570 | "outputs": [],
571 | "source": [
572 | "rep = input(\"On fait une petite pause? (o/n)\")\n",
573 | "if rep == \"o\":\n",
574 | " print(\"Ca me semble raisonnable.\")\n",
575 | "elif rep == \"n\": \n",
576 | " print(\"J'en vois qui tournent de l'oeil.\")\n",
577 | "else: # sera exécuté si toutes les conditions précédentes sont fausses\n",
578 | " print(\"Réponse inintelligible, la fatigue certainement.\")\n",
579 | "print(\"Allez, pause. Un café sans sucre pour moi.\")"
580 | ]
581 | },
582 | {
583 | "cell_type": "markdown",
584 | "metadata": {},
585 | "source": [
586 | "\n",
587 | " \n",
588 | "**IMPORTANT** : L'instruction `if` est éventuellement suivie :\n",
589 | " * d'un ou plusieurs `elif`\n",
590 | " * d'un unique `else`, en dernière position \n",
591 | " \n",
592 | "qui permettent d'exprimer plusieurs alternatives.
"
593 | ]
594 | },
595 | {
596 | "cell_type": "markdown",
597 | "metadata": {},
598 | "source": [
599 | "\n",
600 | " \n",
601 | "**Ex3.2** Ecrivez un programme qui demande 2 entiers `a` et `b`, et affiche le plus grand d'entre eux. \n",
602 | " \n",
603 | "
"
604 | ]
605 | },
606 | {
607 | "cell_type": "code",
608 | "execution_count": null,
609 | "metadata": {
610 | "scrolled": true
611 | },
612 | "outputs": [],
613 | "source": []
614 | },
615 | {
616 | "cell_type": "markdown",
617 | "metadata": {
618 | "scrolled": true
619 | },
620 | "source": [
621 | "\n",
622 | " \n",
623 | "**Ex3.3** Modifiez votre programme afin qu'il demande 3 entiers `a`, `b`, et `c`, et affiche le plus grand d'entre eux. \n",
624 | "Vous allez écrire ce programme de deux façons différentes, qui ont chacune leur avantage:\n",
625 | " * avec des conditions utilisant les opérateurs logiques et exprimant directement *a est le plus grand des trois*, *b est le plus grand des trois*...\n",
626 | " * en n'utilisant que des inégalités simples (`a>b`) et en imbriquant plusieurs `if` les uns dans les autres\n",
627 | "
"
628 | ]
629 | },
630 | {
631 | "cell_type": "code",
632 | "execution_count": null,
633 | "metadata": {},
634 | "outputs": [],
635 | "source": []
636 | },
637 | {
638 | "cell_type": "code",
639 | "execution_count": null,
640 | "metadata": {},
641 | "outputs": [],
642 | "source": []
643 | },
644 | {
645 | "cell_type": "markdown",
646 | "metadata": {},
647 | "source": [
648 | "\n",
649 | " \n",
650 | "**Ex3.4** Ecrivez un programme qui demande 3 entiers et affiche `positifs ou nuls` s'ils sont tous positifs ou nuls, `négatifs` s'ils sont tous négatifs, et `signes différents` sinon. \n",
651 | "Vous allez écrire ce programme de deux façons différentes:\n",
652 | " * comme vous le souhaitez\n",
653 | " * en utilisant deux compteurs `posnul` et `neg` que vous augmenterez à chaque fois que vous détectez une variable positive ou nulle, ou une variable négative. Ensuite, vous n'aurez plus qu'à lire ces compteurs pour savoir quoi afficher.
"
654 | ]
655 | },
656 | {
657 | "cell_type": "code",
658 | "execution_count": null,
659 | "metadata": {
660 | "scrolled": true
661 | },
662 | "outputs": [],
663 | "source": []
664 | },
665 | {
666 | "cell_type": "code",
667 | "execution_count": null,
668 | "metadata": {
669 | "scrolled": true
670 | },
671 | "outputs": [],
672 | "source": []
673 | },
674 | {
675 | "cell_type": "markdown",
676 | "metadata": {},
677 | "source": [
678 | "## Boucles `while`\n",
679 | "Dans un programme, on a souvent besoin d'effectuer des actions de façon répétée. On a alors intérêt à utiliser des boucles. \n",
680 | "\n",
681 | "*Si par exemple on vous demande d'afficher tous les entiers de 1 à 1000, vous êtes bien embêtés sans les boucles.* \n",
682 | "\n",
683 | "Python propose deux types de boucles, `while` et `for`, qui sont très différentes. Nous expliquons ici le `while`... \n",
684 | "*While* signifie *tant que*. Concrètement, `while` va être associé à une condition (comme `if`) et se répéter tant que cette condition est vraie."
685 | ]
686 | },
687 | {
688 | "cell_type": "code",
689 | "execution_count": null,
690 | "metadata": {
691 | "scrolled": false
692 | },
693 | "outputs": [],
694 | "source": [
695 | "rep = input(\"Besoin de faire une pause? (o/n)\")\n",
696 | "while rep != \"n\":\n",
697 | " rep = input(\"Sérieusement, vraiment besoin d'une pause? (o/n)\")\n",
698 | "print(\"Allez on bosse.\")"
699 | ]
700 | },
701 | {
702 | "cell_type": "markdown",
703 | "metadata": {},
704 | "source": [
705 | "\n",
706 | " \n",
707 | "**Premières boucles** \n",
708 | "**Ex4.0** Ecrivez un programme qui affiche tous les entiers de 1 à 100. \n",
709 | "**Ex4.1** Modifiez le afin de n'afficher que les multiples de 3 compris entre 1 et 100. \n",
710 | "**Ex4.2** Modifiez le afin de n'afficher que les nombres qui sont multiples de 3 ET de 5, compris entre 1 et 100.\n",
711 | "\n",
712 | "
\n"
713 | ]
714 | },
715 | {
716 | "cell_type": "code",
717 | "execution_count": null,
718 | "metadata": {
719 | "scrolled": true
720 | },
721 | "outputs": [],
722 | "source": []
723 | },
724 | {
725 | "cell_type": "code",
726 | "execution_count": null,
727 | "metadata": {},
728 | "outputs": [],
729 | "source": []
730 | },
731 | {
732 | "cell_type": "code",
733 | "execution_count": null,
734 | "metadata": {},
735 | "outputs": [],
736 | "source": []
737 | },
738 | {
739 | "cell_type": "markdown",
740 | "metadata": {},
741 | "source": [
742 | "
\n",
743 | "\n",
744 | "\n",
745 | " \n",
746 | "**IMPORTANT** :Dans l'exercice précédent, vous avez normalement eu l'idée d'intégrer un `if` dans votre `while`. \n",
747 | "Comme dans un jeu de poupées russes, on peut **imbriquer** autant de boucles et de structures conditionnelles que nécessaire...sans oublier d'indenter correctement son programme :\n",
748 | "```\n",
749 | " while ... :\n",
750 | " if ... :\n",
751 | " while ... :\n",
752 | "```\n",
753 | "
"
754 | ]
755 | },
756 | {
757 | "cell_type": "markdown",
758 | "metadata": {},
759 | "source": [
760 | "\n",
761 | " \n",
762 | "**Ex4.3 Niveau \"Novice\"** \n",
763 | " Ecrivez un programme qui demande un entier positif `n`, vérifie qu'il est bien positif et affiche ensuite `n` étoiles : `*****...`\n",
764 | "
\n"
765 | ]
766 | },
767 | {
768 | "cell_type": "code",
769 | "execution_count": null,
770 | "metadata": {
771 | "scrolled": true
772 | },
773 | "outputs": [],
774 | "source": []
775 | },
776 | {
777 | "cell_type": "markdown",
778 | "metadata": {},
779 | "source": [
780 | "\n",
781 | " \n",
782 | "**Ex4.4 Niveau \"Débutant\"** \n",
783 | " On souhaite maintenant demander `n` et `m`, et afficher un rectangle de largeur `n` et de hauteur `m`. Exemple avec `n=4` et `m=3` :\n",
784 | "```\n",
785 | " ****\n",
786 | " ****\n",
787 | " ****\n",
788 | "```\n",
789 | " \n",
790 | "Vous pouvez (devez!) réutiliser votre programme précédent pour vous aider: vous disposez déjà d'un programme affichant `n` étoiles!\n",
791 | "
\n"
792 | ]
793 | },
794 | {
795 | "cell_type": "code",
796 | "execution_count": null,
797 | "metadata": {
798 | "scrolled": true
799 | },
800 | "outputs": [],
801 | "source": []
802 | },
803 | {
804 | "cell_type": "markdown",
805 | "metadata": {},
806 | "source": [
807 | "\n",
808 | " \n",
809 | "**Ex4.6 Niveau \"Confirmé\"** \n",
810 | " Plus dur, on souhaite maintenant afficher une pyramide (en fait un triangle rectangle) de `n` lignes, et dont la base fait `n` étoiles, de la façon suivante :\n",
811 | "```\n",
812 | " *\n",
813 | " **\n",
814 | " ***\n",
815 | " ....\n",
816 | "```\n",
817 | "
\n"
818 | ]
819 | },
820 | {
821 | "cell_type": "code",
822 | "execution_count": null,
823 | "metadata": {
824 | "scrolled": true
825 | },
826 | "outputs": [],
827 | "source": []
828 | },
829 | {
830 | "cell_type": "markdown",
831 | "metadata": {},
832 | "source": [
833 | "
\n",
834 | "\n",
835 | " \n",
836 | "**Ex4.6 Niveau \"émrifnoC\"** \n",
837 | " Facile de modifier ce programme afin que la pyramide ait la pointe en bas, non?\n",
838 | "
\n"
839 | ]
840 | },
841 | {
842 | "cell_type": "code",
843 | "execution_count": null,
844 | "metadata": {},
845 | "outputs": [],
846 | "source": []
847 | },
848 | {
849 | "cell_type": "markdown",
850 | "metadata": {},
851 | "source": [
852 | "\n",
853 | " \n",
854 | "**Ex4.7 Niveau \"Expert de la boucle\"** \n",
855 | " Plus compliqué, vous devez maintenant faire que votre triangle rectangle ait son angle droit en bas à droite :\n",
856 | "```\n",
857 | " *\n",
858 | " **\n",
859 | " ***\n",
860 | " ....\n",
861 | "```\n",
862 | "
\n"
863 | ]
864 | },
865 | {
866 | "cell_type": "code",
867 | "execution_count": null,
868 | "metadata": {
869 | "scrolled": true
870 | },
871 | "outputs": [],
872 | "source": []
873 | },
874 | {
875 | "cell_type": "markdown",
876 | "metadata": {},
877 | "source": [
878 | "**Bravo ! Vous avez fini ce TP !**"
879 | ]
880 | },
881 | {
882 | "cell_type": "markdown",
883 | "metadata": {},
884 | "source": [
885 | "
\n",
886 | "\n",
887 | "\n",
888 | "\n",
889 | "## __BILAN__\n",
890 | "Il existe un mécanisme d'**affectation multiple** qui permet... \n",
891 | "Le **format**, c'est la façon de... \n",
892 | "Selon votre version de python, vous utiliserez les **f-strings** ou **str.format**:... \n",
893 | "`input` permet de ... et renvoie... \n",
894 | "On peut déclencher une **conversion explicite** à l'aide des... de la façon suivante:... \n",
895 | "Les règles à respecter dans les **structures conditionnelles** sont... \n",
896 | "Le `while` permet de... \n",
897 | "**Imbriquer une boucle** consiste à...\n",
898 | "
"
899 | ]
900 | },
901 | {
902 | "cell_type": "code",
903 | "execution_count": null,
904 | "metadata": {
905 | "scrolled": true
906 | },
907 | "outputs": [],
908 | "source": []
909 | }
910 | ],
911 | "metadata": {
912 | "kernelspec": {
913 | "display_name": "Python 3",
914 | "language": "python",
915 | "name": "python3"
916 | },
917 | "language_info": {
918 | "codemirror_mode": {
919 | "name": "ipython",
920 | "version": 3
921 | },
922 | "file_extension": ".py",
923 | "mimetype": "text/x-python",
924 | "name": "python",
925 | "nbconvert_exporter": "python",
926 | "pygments_lexer": "ipython3",
927 | "version": "3.8.8"
928 | },
929 | "toc": {
930 | "base_numbering": 1,
931 | "nav_menu": {},
932 | "number_sections": true,
933 | "sideBar": true,
934 | "skip_h1_title": false,
935 | "title_cell": "Table of Contents",
936 | "title_sidebar": "Contents",
937 | "toc_cell": false,
938 | "toc_position": {},
939 | "toc_section_display": true,
940 | "toc_window_display": false
941 | }
942 | },
943 | "nbformat": 4,
944 | "nbformat_minor": 2
945 | }
946 |
--------------------------------------------------------------------------------
/tp/SAE03-TP3_listes.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "slideshow": {
7 | "slide_type": "slide"
8 | }
9 | },
10 | "source": [
11 | "
\n",
12 | "\n",
13 | "# SAÉ 03 - TP3 - Listes, indices, valeurs\n",
14 | "\n",
15 | "Bienvenue sur le Jupyter pour préparer la **SAÉ Traitement numérique du signal du département RT de Vélizy**. Les notebooks sont une adaptation de ceux proposés par le département info et de leur profs d'info géniaux.\n",
16 | "\n",
17 | "Ce TP est consacré au type `list` de python. "
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": 1,
23 | "metadata": {},
24 | "outputs": [
25 | {
26 | "data": {
27 | "text/html": [
28 | ""
45 | ],
46 | "text/plain": [
47 | ""
48 | ]
49 | },
50 | "execution_count": 1,
51 | "metadata": {},
52 | "output_type": "execute_result"
53 | }
54 | ],
55 | "source": [
56 | "# Exécutez cette cellule !\n",
57 | "from IPython.core.display import HTML\n",
58 | "\n",
59 | "styles = \"\"\n",
60 | "HTML(styles)"
61 | ]
62 | },
63 | {
64 | "cell_type": "markdown",
65 | "metadata": {
66 | "slideshow": {
67 | "slide_type": "fragment"
68 | }
69 | },
70 | "source": [
71 | "## Définition\n",
72 | "Une liste, ou `list`, est un **type conteneur**, c'est à dire qui contient des valeurs ou des objets. \n",
73 | "\n",
74 | "Un objet du type `list` se définit comme une liste d'éléments séparés par des virgules, entre crochets."
75 | ]
76 | },
77 | {
78 | "cell_type": "code",
79 | "execution_count": null,
80 | "metadata": {},
81 | "outputs": [],
82 | "source": [
83 | "maliste1 = [3, 5.2, \"hop\"]\n",
84 | "type(maliste1)"
85 | ]
86 | },
87 | {
88 | "cell_type": "markdown",
89 | "metadata": {},
90 | "source": [
91 | "Une liste peut contenir tous types d'objets comme dans l'exemple ci-dessus où `maliste1` contient trois éléments, dans l'ordre un `int` (entier), un `float` (flottant) et un `str` (chaîne de caractères)."
92 | ]
93 | },
94 | {
95 | "cell_type": "markdown",
96 | "metadata": {},
97 | "source": [
98 | "\n",
99 | " \n",
100 | "**Ex1.0 - une petite liste** \n",
101 | "Créez un objet nommé `maliste2` contenant 5 éléménts du type `int`, `int`, `float`, `bool`, `str`, puis affichez-le\n",
102 | "
"
103 | ]
104 | },
105 | {
106 | "cell_type": "code",
107 | "execution_count": null,
108 | "metadata": {},
109 | "outputs": [],
110 | "source": []
111 | },
112 | {
113 | "cell_type": "markdown",
114 | "metadata": {},
115 | "source": [
116 | "## Longueur d'une liste"
117 | ]
118 | },
119 | {
120 | "cell_type": "markdown",
121 | "metadata": {},
122 | "source": [
123 | "\n",
124 | " \n",
125 | "La **longueur d'une liste** est ... \n",
126 | "\n",
127 | "La plus petite longueur possible pour une liste est... \n",
128 | "
"
129 | ]
130 | },
131 | {
132 | "cell_type": "markdown",
133 | "metadata": {},
134 | "source": [
135 | "La longueur d'une liste est obtenue par la fonction native `len`. \n",
136 | "\n",
137 | "\n",
138 | "\n",
139 | "`len` est l'abbréviation du mot anglais ...\n",
140 | "\n",
141 | "
"
142 | ]
143 | },
144 | {
145 | "cell_type": "markdown",
146 | "metadata": {},
147 | "source": [
148 | "\n",
149 | "\n",
150 | "**Ex1.1 - Range ta chambre** \n",
151 | "Affichez la longueur de `maliste1` (définie au tout début de cette feuille). \n",
152 | "Puis faites le nécessaire pour que `maliste1` devienne une liste vide, et affichez à nouveau sa longueur.\n",
153 | "
"
154 | ]
155 | },
156 | {
157 | "cell_type": "code",
158 | "execution_count": null,
159 | "metadata": {},
160 | "outputs": [],
161 | "source": []
162 | },
163 | {
164 | "cell_type": "markdown",
165 | "metadata": {},
166 | "source": [
167 | "\n",
168 | " \n",
169 | "**Ex1.2 - None** \n",
170 | "Et si vous affectez `None` à votre liste...est-ce toujours une liste?\n",
171 | "
"
172 | ]
173 | },
174 | {
175 | "cell_type": "code",
176 | "execution_count": null,
177 | "metadata": {},
178 | "outputs": [],
179 | "source": [
180 | "maliste1 = None\n"
181 | ]
182 | },
183 | {
184 | "cell_type": "markdown",
185 | "metadata": {},
186 | "source": [
187 | "- le mot-clé `[]` décrit un objet un peu particulier: **la liste vide**. \n",
188 | "- le mot-clé `None` décrit un objet un peu particulier: **l'objet vide**. \n",
189 | " "
190 | ]
191 | },
192 | {
193 | "cell_type": "markdown",
194 | "metadata": {},
195 | "source": [
196 | "\n",
197 | " \n",
198 | "**Ex1.3 - Les objets particuliers** \n",
199 | "Question importante: on se demande quelle est la différence entre `None`, `[]`, `False` et `0`. \n",
200 | "En particulier, on se demande comment réagit `if` quand on lui soumet ces objets: est-ce que `if []` est vrai ou faux? \n",
201 | "*(Nous avons vu précédement que, pour les entiers, un entier nul était considéré comme Faux, et tous les autres entiers comme Vrai.)* \n",
202 | "Procédez à quelques tests à l'aide du `if` afin de déterminer comment `None`, `[]` et `False` sont évalués. Affichez également leur type. \n",
203 | "Enfin, expliquez quelle est la différence, pour une liste `l`, entre écrire `l=[]` et `l=None`.\n",
204 | "
"
205 | ]
206 | },
207 | {
208 | "cell_type": "code",
209 | "execution_count": null,
210 | "metadata": {},
211 | "outputs": [],
212 | "source": []
213 | },
214 | {
215 | "cell_type": "markdown",
216 | "metadata": {},
217 | "source": [
218 | " \n",
219 | "\n",
220 | "`False` est de type.....et est évidemment évalué comme étant Faux. \n",
221 | "\n",
222 | "`None` est de type.....et est évalué comme étant..... \n",
223 | "\n",
224 | "`[]` est de type.....et est évalué comme étant... \n",
225 | "\n",
226 | "
"
227 | ]
228 | },
229 | {
230 | "cell_type": "markdown",
231 | "metadata": {},
232 | "source": [
233 | "\n",
234 | " \n",
235 | "**Ex1.4 - liste au choix** \n",
236 | "\n",
237 | "Créez une liste de longueur 8 et affichez sa longueur.\n",
238 | " \n",
239 | "
"
240 | ]
241 | },
242 | {
243 | "cell_type": "code",
244 | "execution_count": null,
245 | "metadata": {},
246 | "outputs": [],
247 | "source": []
248 | },
249 | {
250 | "cell_type": "markdown",
251 | "metadata": {},
252 | "source": [
253 | "
\n",
254 | "\n",
255 | "## Indices dans une liste"
256 | ]
257 | },
258 | {
259 | "cell_type": "markdown",
260 | "metadata": {},
261 | "source": [
262 | "Les éléments d'une liste sont toujours numérotés dans l'ordre de la liste **en débutant à 0** et de 1 en 1. On appelle ce numéro **indice**. Les indices sont donc, dans l'ordre **0, 1, 2, 3, 4, 5, 6, 7...**"
263 | ]
264 | },
265 | {
266 | "cell_type": "code",
267 | "execution_count": null,
268 | "metadata": {},
269 | "outputs": [],
270 | "source": [
271 | "maliste1 = [3, 5.2, \"hop\"]"
272 | ]
273 | },
274 | {
275 | "cell_type": "markdown",
276 | "metadata": {},
277 | "source": [
278 | "L'élément 3 est à l'indice 0, l'élément 5.2 à l'indice 1 et l'élément 'hop' à l'indice 2.\n",
279 | "On peut afficher la valeur d'un élément à un indice avec la syntaxe \n",
280 | "\n",
281 | "`nomdelaliste[indice]`"
282 | ]
283 | },
284 | {
285 | "cell_type": "code",
286 | "execution_count": null,
287 | "metadata": {},
288 | "outputs": [],
289 | "source": [
290 | "maliste1[0]"
291 | ]
292 | },
293 | {
294 | "cell_type": "code",
295 | "execution_count": null,
296 | "metadata": {},
297 | "outputs": [],
298 | "source": [
299 | "maliste1[1]"
300 | ]
301 | },
302 | {
303 | "cell_type": "code",
304 | "execution_count": null,
305 | "metadata": {},
306 | "outputs": [],
307 | "source": [
308 | "maliste1[2]"
309 | ]
310 | },
311 | {
312 | "cell_type": "code",
313 | "execution_count": null,
314 | "metadata": {},
315 | "outputs": [],
316 | "source": [
317 | "maliste1[3]"
318 | ]
319 | },
320 | {
321 | "cell_type": "markdown",
322 | "metadata": {},
323 | "source": [
324 | "\n",
325 | "\n",
326 | "Le message d'erreur `list index out of range` signifie que ...\n",
327 | "
"
328 | ]
329 | },
330 | {
331 | "cell_type": "markdown",
332 | "metadata": {},
333 | "source": [
334 | "\n",
335 | "\n",
336 | "Le plus grand indice possible pour une liste qui aurait une longueur 200 est ...\n",
337 | "
\n",
338 | "\n",
339 | "(Vérifiez le nombre possible d'indice)"
340 | ]
341 | },
342 | {
343 | "cell_type": "markdown",
344 | "metadata": {},
345 | "source": [
346 | "Les listes sont **mutables** ce qui signifie qu'on peut les transformer et changer leurs valeurs sans modifier l'identité (obtenue avec `id`) de la liste concernée. On peut changer un élément qui se trouve dans une liste simplement par une affectation."
347 | ]
348 | },
349 | {
350 | "cell_type": "code",
351 | "execution_count": null,
352 | "metadata": {},
353 | "outputs": [],
354 | "source": [
355 | "maliste1[1] = \"nouveau\""
356 | ]
357 | },
358 | {
359 | "cell_type": "code",
360 | "execution_count": null,
361 | "metadata": {},
362 | "outputs": [],
363 | "source": [
364 | "maliste1"
365 | ]
366 | },
367 | {
368 | "cell_type": "markdown",
369 | "metadata": {},
370 | "source": [
371 | "\n",
372 | " \n",
373 | "**Exo 1.5** Créez une liste `maliste3` contenant les entiers de 3 à 8. Puis, un par un changez ces éléments en 10, 11, ..., 15\n",
374 | "
"
375 | ]
376 | },
377 | {
378 | "cell_type": "code",
379 | "execution_count": null,
380 | "metadata": {},
381 | "outputs": [],
382 | "source": []
383 | },
384 | {
385 | "cell_type": "markdown",
386 | "metadata": {},
387 | "source": [
388 | "## Ajouter des éléments dans une liste"
389 | ]
390 | },
391 | {
392 | "cell_type": "markdown",
393 | "metadata": {},
394 | "source": [
395 | "On peut ajouter de nouveaux éléments à la suite d'une liste déjà existante\n",
396 | "C'est une *modification* de la liste (les listes sont mutables). \n",
397 | "La syntaxe pour ajouter à la fin est \n",
398 | "`nomdelaliste.append(element_a_ajouter)`"
399 | ]
400 | },
401 | {
402 | "cell_type": "code",
403 | "execution_count": null,
404 | "metadata": {},
405 | "outputs": [],
406 | "source": [
407 | "maliste1"
408 | ]
409 | },
410 | {
411 | "cell_type": "code",
412 | "execution_count": null,
413 | "metadata": {},
414 | "outputs": [],
415 | "source": [
416 | "maliste1.append('42')"
417 | ]
418 | },
419 | {
420 | "cell_type": "markdown",
421 | "metadata": {},
422 | "source": [
423 | "notez que rien ne s'affiche car la méthode `append` ne **renvoie** rien"
424 | ]
425 | },
426 | {
427 | "cell_type": "code",
428 | "execution_count": null,
429 | "metadata": {},
430 | "outputs": [],
431 | "source": [
432 | "maliste1"
433 | ]
434 | },
435 | {
436 | "cell_type": "code",
437 | "execution_count": null,
438 | "metadata": {},
439 | "outputs": [],
440 | "source": [
441 | "print(len(maliste1))"
442 | ]
443 | },
444 | {
445 | "cell_type": "markdown",
446 | "metadata": {},
447 | "source": [
448 | "\n",
449 | " \n",
450 | "**append** signifie en anglais ...\n",
451 | "
"
452 | ]
453 | },
454 | {
455 | "cell_type": "markdown",
456 | "metadata": {},
457 | "source": [
458 | "## Exercices\n",
459 | "\n",
460 | "### La fonction native max"
461 | ]
462 | },
463 | {
464 | "cell_type": "markdown",
465 | "metadata": {},
466 | "source": [
467 | "\n",
468 | " \n",
469 | "**Exo 2.0** \n",
470 | "Il existe une fonction native `max` qui donne la valeur maximum dans une liste (quand cela a un sens). Écrivez un exemple ci-dessous.\n",
471 | "
"
472 | ]
473 | },
474 | {
475 | "cell_type": "code",
476 | "execution_count": null,
477 | "metadata": {},
478 | "outputs": [],
479 | "source": []
480 | },
481 | {
482 | "cell_type": "markdown",
483 | "metadata": {},
484 | "source": [
485 | "## Pour les exercices suivants le but est de ne PAS utiliser la fonction max ! \n",
486 | "\n",
487 | "Écris \"compris\" si tu as compris :"
488 | ]
489 | },
490 | {
491 | "cell_type": "markdown",
492 | "metadata": {},
493 | "source": [
494 | "### Maximum dans une liste de longueur 2 (exemple)\n",
495 | "Le code ci-dessous fonctionne quels que soient les deux nombres dans une liste de longueur 2. Vérifiez en changeant les valeurs !"
496 | ]
497 | },
498 | {
499 | "cell_type": "code",
500 | "execution_count": null,
501 | "metadata": {},
502 | "outputs": [],
503 | "source": [
504 | "l = [7,4]\n",
505 | "if l[0] > l[1]:\n",
506 | " maxi = l[0]\n",
507 | "else:\n",
508 | " maxi = l[1]\n",
509 | "print(\"Le maximum de la liste vaut\", maxi)"
510 | ]
511 | },
512 | {
513 | "cell_type": "markdown",
514 | "metadata": {},
515 | "source": [
516 | "### Maximum dans une liste de longueur 4\n",
517 | "\n",
518 | "\n",
519 | " \n",
520 | "**Exo 2.1** \n",
521 | "Complétez le code ci-dessous. A la fin de son exécution, la variable maxi doit contenir le maximum des 4 valeurs de la liste.\n",
522 | "\n",
523 | "**Attention :** le code doit fonctionner quelles que soient les valeurs de la liste !\n",
524 | "
"
525 | ]
526 | },
527 | {
528 | "cell_type": "code",
529 | "execution_count": null,
530 | "metadata": {},
531 | "outputs": [],
532 | "source": [
533 | "l = [7, 4, 12, 5]\n",
534 | "# à compléter\n",
535 | "\n",
536 | "\n",
537 | "print(\"Le maximum de la liste vaut\", maxi)"
538 | ]
539 | },
540 | {
541 | "cell_type": "markdown",
542 | "metadata": {},
543 | "source": [
544 | "### Indice du maximum dans une liste de longueur 4"
545 | ]
546 | },
547 | {
548 | "cell_type": "markdown",
549 | "metadata": {},
550 | "source": [
551 | "\n",
552 | " \n",
553 | "**Exo 2.2** \n",
554 | "Cette fois-ci, votre code doit donner l'indice qui correspond au maximum de la liste de longueur 4. Si le maximum apparaît plusieurs fois, vous devez afficher à la fin le premier indice possible.\n",
555 | "Par exemple, si la liste est `[3, 5, 1, 5]` l'indice affiché devra être 1.\n",
556 | "Bien entendu, le code doit fonctionner si l'on change les 4 valeurs !\n",
557 | "
"
558 | ]
559 | },
560 | {
561 | "cell_type": "code",
562 | "execution_count": null,
563 | "metadata": {},
564 | "outputs": [],
565 | "source": [
566 | "l = [3, 5, 1, 5]\n",
567 | "# à compléter\n",
568 | "\n",
569 | "\n",
570 | "print(\"L'indice du maximum de la liste est\", imaxi)"
571 | ]
572 | },
573 | {
574 | "cell_type": "markdown",
575 | "metadata": {},
576 | "source": [
577 | "### Échanger deux valeurs dans une liste\n",
578 | "\n",
579 | "\n",
580 | " \n",
581 | "**Exo 2.3** \n",
582 | "Cette liste est mal rangée. Echangez les valeurs se trouvant aux indices 3 et 6. Idéalement, cet échange devrait fonctionner même si on changeait la liste. Vous aurez peut-être besoin d'une variable \"tampon\" (ou de stockage temporaire) ?\n",
583 | "
\n"
584 | ]
585 | },
586 | {
587 | "cell_type": "code",
588 | "execution_count": null,
589 | "metadata": {},
590 | "outputs": [],
591 | "source": [
592 | "l = [10, 11, 12, 16, 14, 15, 13, 17]\n",
593 | "# a completer"
594 | ]
595 | },
596 | {
597 | "cell_type": "markdown",
598 | "metadata": {},
599 | "source": [
600 | "### Tri d'une liste de longueur 3\n",
601 | "\n",
602 | "\n",
603 | " \n",
604 | "**Exo 2.4** \n",
605 | "On donne une liste de longueur 3. On demande de la trier en ordre croissant en procédant par comparaisons et échanges successifs. En exemple, on vous montre comment le faire pour une liste de longueur 2 (mais il vous faut compléter les échanges)\n",
606 | "
"
607 | ]
608 | },
609 | {
610 | "cell_type": "code",
611 | "execution_count": null,
612 | "metadata": {},
613 | "outputs": [],
614 | "source": [
615 | "# exemple\n",
616 | "l = [12, 5]\n",
617 | "if l[1] < l[0]:\n",
618 | " # complétez : échangez les éléments d'indices 0 et 1\n",
619 | " \n",
620 | "print(l)"
621 | ]
622 | },
623 | {
624 | "cell_type": "code",
625 | "execution_count": null,
626 | "metadata": {},
627 | "outputs": [],
628 | "source": [
629 | "# idem pour listes de longueur 3\n",
630 | "l = [12, 15, 2]\n",
631 | "\n",
632 | "# À compléter...\n",
633 | "\n",
634 | "print(l)"
635 | ]
636 | },
637 | {
638 | "cell_type": "markdown",
639 | "metadata": {},
640 | "source": [
641 | "Pour vérifier, essayez différents ordres possibles pour la liste de départ. "
642 | ]
643 | },
644 | {
645 | "cell_type": "code",
646 | "execution_count": null,
647 | "metadata": {},
648 | "outputs": [],
649 | "source": [
650 | "# comme vous êtes en forme vous pouvez peut-être tenter le cas longueur 4 ?\n",
651 | "l = [12, 2, 6, 4]\n",
652 | "\n",
653 | "print(l)"
654 | ]
655 | },
656 | {
657 | "cell_type": "markdown",
658 | "metadata": {},
659 | "source": [
660 | "Il est possible de trier une liste avec la fonction `sort`, qu'on utilise de la même façon que `append` en l'écrivant après le nom de la liste et un point, ce qui donne `maliste.sort()` pour trier sa liste. Une fois a liste triée, il n'est pas possible de la remettre dans son ordre d'origine (on ne peut pas la \"dé-trier\")."
661 | ]
662 | },
663 | {
664 | "cell_type": "markdown",
665 | "metadata": {},
666 | "source": [
667 | "\n",
668 | "\n",
669 | "## __Récapitulatif__\n",
670 | "False est de type... et est évidemment évalué comme étant Faux.\n",
671 | "\n",
672 | "None est de type... et est évalué comme étant ...\n",
673 | "\n",
674 | "\n",
675 | "Une liste peut contenir ...\n",
676 | "\n",
677 | "La longueur d'une liste indique ... et on peut l'obtenir avec ...\n",
678 | "\n",
679 | "Une liste vide à une longueur de ... et s'écrit ...\n",
680 | "\n",
681 | "Les indices d'une liste de taille `n` vont de ... à ...\n",
682 | "\n",
683 | "On peut ajouter un élément à la fin d'une liste en écrivant ...\n",
684 | "\n",
685 | "La valeur maximum d'une liste est retournée par la fonction ...\n",
686 | "\n",
687 | "On peut trier une liste avec la fonction ...\n",
688 | "\n",
689 | "\n",
690 | "
"
691 | ]
692 | },
693 | {
694 | "cell_type": "code",
695 | "execution_count": null,
696 | "metadata": {},
697 | "outputs": [],
698 | "source": []
699 | }
700 | ],
701 | "metadata": {
702 | "kernelspec": {
703 | "display_name": "Python 3 (ipykernel)",
704 | "language": "python",
705 | "name": "python3"
706 | },
707 | "language_info": {
708 | "codemirror_mode": {
709 | "name": "ipython",
710 | "version": 3
711 | },
712 | "file_extension": ".py",
713 | "mimetype": "text/x-python",
714 | "name": "python",
715 | "nbconvert_exporter": "python",
716 | "pygments_lexer": "ipython3",
717 | "version": "3.9.5"
718 | }
719 | },
720 | "nbformat": 4,
721 | "nbformat_minor": 2
722 | }
723 |
--------------------------------------------------------------------------------
/tp/SAE03-TP4_for_range.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "
\n",
8 | "\n",
9 | "\n",
10 | "# SAÉ 03 - TP4 - La boucle for\n",
11 | "\n",
12 | "Bienvenue sur le Jupyter pour préparer la **SAÉ Traitement numérique du signal du département RT de Vélizy**. Les notebooks sont une adaptation de ceux proposés par le département info et de leur profs d'info géniaux.\n",
13 | "\n",
14 | "Ce TP est consacré au boucle `for` en python, qu'on applique sur les `list` ou pour répéter des instructions lorsqu'on connait à l'avance le nombre de répétitions nécessaires."
15 | ]
16 | },
17 | {
18 | "cell_type": "code",
19 | "execution_count": 1,
20 | "metadata": {},
21 | "outputs": [
22 | {
23 | "data": {
24 | "text/html": [
25 | ""
42 | ],
43 | "text/plain": [
44 | ""
45 | ]
46 | },
47 | "execution_count": 1,
48 | "metadata": {},
49 | "output_type": "execute_result"
50 | }
51 | ],
52 | "source": [
53 | "# Exécutez cette cellule !\n",
54 | "from IPython.core.display import HTML\n",
55 | "\n",
56 | "styles = \"\"\n",
57 | "HTML(styles)"
58 | ]
59 | },
60 | {
61 | "cell_type": "markdown",
62 | "metadata": {},
63 | "source": [
64 | "## Étude d'une boucle\n",
65 | "\n",
66 | "Très souvent, on désire faire une action pour chaque élément d'une liste. Par exemple, afficher les carrés des nombres de 1 à 10. Ceci peut être fait grâce une boucle `for` :"
67 | ]
68 | },
69 | {
70 | "cell_type": "code",
71 | "execution_count": null,
72 | "metadata": {
73 | "scrolled": true
74 | },
75 | "outputs": [],
76 | "source": [
77 | "l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n",
78 | "for x in l:\n",
79 | " print(x**2)"
80 | ]
81 | },
82 | {
83 | "cell_type": "markdown",
84 | "metadata": {},
85 | "source": [
86 | "Cette boucle peut se lire \"pour chaque élément `x` dans la liste `l` : il faut afficher `x` au carré\". \n",
87 | "\n",
88 | "Autre exemple :"
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": null,
94 | "metadata": {},
95 | "outputs": [],
96 | "source": [
97 | "animaux = [\"chat\", \"chien\", \"pingouin\", \"lézard\"]\n",
98 | "for animal in animaux:\n",
99 | " print(f\"le {animal} donne la papate\")"
100 | ]
101 | },
102 | {
103 | "cell_type": "markdown",
104 | "metadata": {},
105 | "source": [
106 | "On utilise ici le formatage de chaîne de caractère dans le print (avec un f devant la `str`), que nous avons vu au TP 2.\n",
107 | "\n",
108 | "La syntaxe générale de la boucle `for`est :"
109 | ]
110 | },
111 | {
112 | "cell_type": "code",
113 | "execution_count": null,
114 | "metadata": {},
115 | "outputs": [],
116 | "source": [
117 | "# for nom_variable in nom_liste:\n",
118 | "# bloc_d_instructions"
119 | ]
120 | },
121 | {
122 | "cell_type": "markdown",
123 | "metadata": {},
124 | "source": [
125 | "\n",
126 | " \n",
127 | "* le bloc d'instruction est **répété** autant de fois que ...\n",
128 | "* la variable de boucle ...\n",
129 | "* si on oublie les deux points, à la fin de la ligne du `for`, le python ... \n",
130 | "* le bloc d'instruction doit être ...\n",
131 | "\n",
132 | "
"
133 | ]
134 | },
135 | {
136 | "cell_type": "markdown",
137 | "metadata": {},
138 | "source": [
139 | "## Exercices d'application"
140 | ]
141 | },
142 | {
143 | "cell_type": "markdown",
144 | "metadata": {},
145 | "source": [
146 | "\n",
147 | " \n",
148 | "**Ex1.0 - Triple opposition** \n",
149 | "\n",
150 | "Pour les entiers pairs de 2 à 10 inclus, affichez à l'aide d'une boucle le triple du nombre puis son opposé. Pour les premiers entiers cela doit ressembler à :\n",
151 | "\n",
152 | "6 -2\n",
153 | "\n",
154 | "12 -4\n",
155 | "\n",
156 | "etc\n",
157 | "
"
158 | ]
159 | },
160 | {
161 | "cell_type": "code",
162 | "execution_count": null,
163 | "metadata": {},
164 | "outputs": [],
165 | "source": []
166 | },
167 | {
168 | "cell_type": "markdown",
169 | "metadata": {},
170 | "source": [
171 | "\n",
172 | " \n",
173 | "**Ex1.1 - Sommer sans se fatiguer** \n",
174 | "\n",
175 | "Complétez le code ci-dessous dont le but est de calculer la somme des entiers de 1 à 10 \n",
176 | "S = 1 + 2 + 3 + .. + 10\n",
177 | "\n",
178 | "
"
179 | ]
180 | },
181 | {
182 | "cell_type": "code",
183 | "execution_count": null,
184 | "metadata": {},
185 | "outputs": [],
186 | "source": [
187 | "somme = 0\n",
188 | "for x in ...\n",
189 | "\n",
190 | "print(somme) # en principe ça fait 55 !"
191 | ]
192 | },
193 | {
194 | "cell_type": "markdown",
195 | "metadata": {},
196 | "source": [
197 | "\n",
198 | " \n",
199 | "**Ex1.2 attention au BUG:** \n",
200 | "\n",
201 | "**SAUVEGARDEZ** avant d'exécuter le code suivant car il va jamais s'arrêter... ça va bugger ! Vous risquez de perdre votre travail. Pour éviter de perdre votre travail, vous pouvez cliquer dans le menu sur \"Noyau\" > \"Interrompre\" pour arrêter une code qui ne se termine pas.\n",
202 | "\n",
203 | "Essayez de comprendre pourquoi il ne s'arrête jamais.. et pourquoi il faut **éviter** faire ce genre de choses.
"
204 | ]
205 | },
206 | {
207 | "cell_type": "code",
208 | "execution_count": null,
209 | "metadata": {},
210 | "outputs": [],
211 | "source": [
212 | "l = [0]\n",
213 | "for x in l:\n",
214 | " l.append(x+1)\n",
215 | " print(l)"
216 | ]
217 | },
218 | {
219 | "cell_type": "markdown",
220 | "metadata": {},
221 | "source": [
222 | "\n",
223 | " \n",
224 | "**Ex1.3 - Maximum for ever** \n",
225 | "\n",
226 | "Reprendre le calcul du maximum d'une liste, mais cette fois-ci à l'aide d'une boucle `for` et il doit marcher quelle que soit la liste d'entiers non vide !!\n",
227 | "\n",
228 | "
"
229 | ]
230 | },
231 | {
232 | "cell_type": "code",
233 | "execution_count": null,
234 | "metadata": {},
235 | "outputs": [],
236 | "source": [
237 | "l = [3, 5, 2, 8, 6]\n",
238 | "maxi = l[0] # initialisation du maximum avec la première valeur de la liste\n",
239 | "# À completer\n",
240 | "\n",
241 | "print(f\"le maximum vaut {maxi}\")"
242 | ]
243 | },
244 | {
245 | "cell_type": "markdown",
246 | "metadata": {},
247 | "source": [
248 | "\n",
249 | " \n",
250 | "**Ex1.4 - Donnez-nous un indice** \n",
251 | "\n",
252 | "Même chose avec l'indice du maximum d'une liste (prendre le premier indice possible)\n",
253 | " \n",
254 | "
"
255 | ]
256 | },
257 | {
258 | "cell_type": "code",
259 | "execution_count": null,
260 | "metadata": {},
261 | "outputs": [],
262 | "source": [
263 | "l = [3, 5, 2, 8, 6, 4, 8, 3, 4]\n",
264 | "imaxi = 0 # initialisation du maximum avec le premier indice de la liste\n",
265 | "# À completer\n",
266 | "\n",
267 | "print(f\"l'indice du maximum vaut {imaxi}\")"
268 | ]
269 | },
270 | {
271 | "cell_type": "markdown",
272 | "metadata": {},
273 | "source": [
274 | "## Enchaîner les boucles for"
275 | ]
276 | },
277 | {
278 | "cell_type": "markdown",
279 | "metadata": {},
280 | "source": [
281 | "Les instructions sont effectuées à la suite, c'est aussi le cas pour les boucles for. \n",
282 | "Il faut qu'une boucle soit terminée pour passer à la suite du code. \n",
283 | "\n",
284 | "\n",
285 | " \n",
286 | "**Ex1.5 - for puis for** \n",
287 | "\n",
288 | "Essayez de prévoir ce qui va s'écrire avant d'exécuter le code.\n",
289 | " \n",
290 | "
"
291 | ]
292 | },
293 | {
294 | "cell_type": "code",
295 | "execution_count": null,
296 | "metadata": {},
297 | "outputs": [],
298 | "source": [
299 | "for x in ['a', 'b', 'c']:\n",
300 | " print(\"boucle 1\")\n",
301 | " print(x)\n",
302 | "print(\"entre les deux boucles\")\n",
303 | "for y in ['x', 'y', 'z']:\n",
304 | " print(\"boucle 2\")\n",
305 | " print(y)"
306 | ]
307 | },
308 | {
309 | "cell_type": "markdown",
310 | "metadata": {},
311 | "source": [
312 | "## Boucles imbriquées\n",
313 | "\n",
314 | "Si on met une boucle dans le bloc d'instruction d'une autre boucle, c'est ce qu'on appelle des boucles imbriquées. \n",
315 | "Dans ce cas la boucle \"extérieure\" va répéter la boucle \"intérieure\" en commençant à chaque fois depuis son début."
316 | ]
317 | },
318 | {
319 | "cell_type": "code",
320 | "execution_count": null,
321 | "metadata": {},
322 | "outputs": [],
323 | "source": [
324 | "for animal in ['koala', 'paresseux', 'maki', 'ouistiti']:\n",
325 | " for adjectif in ['mignon', 'malin', 'malicieux']:\n",
326 | " print(f\"{animal} {adjectif}\")"
327 | ]
328 | },
329 | {
330 | "cell_type": "markdown",
331 | "metadata": {},
332 | "source": [
333 | "\n",
334 | " \n",
335 | "**Ex1.6 - En son for intérieur** \n",
336 | "Essayez de prévoir la différence avec la boucle suivante avant de l'exécuter:\n",
337 | "\n",
338 | "
"
339 | ]
340 | },
341 | {
342 | "cell_type": "code",
343 | "execution_count": null,
344 | "metadata": {},
345 | "outputs": [],
346 | "source": [
347 | "for adjectif in ['mignon', 'malin', 'malicieux']:\n",
348 | " for animal in ['koala', 'paresseux', 'maki', 'ouistiti']:\n",
349 | " print(f\"{animal} {adjectif}\")"
350 | ]
351 | },
352 | {
353 | "cell_type": "markdown",
354 | "metadata": {},
355 | "source": [
356 | "\n",
357 | " \n",
358 | "**Ex1.7 - Le b-a ba** \n",
359 | "Utilisez des boucles imbriquées pour écrire \n",
360 | "\n",
361 | "aa \n",
362 | "ab \n",
363 | "ba \n",
364 | "bb \n",
365 | "ca \n",
366 | "cb \n",
367 | "
"
368 | ]
369 | },
370 | {
371 | "cell_type": "code",
372 | "execution_count": null,
373 | "metadata": {},
374 | "outputs": [],
375 | "source": []
376 | },
377 | {
378 | "cell_type": "markdown",
379 | "metadata": {},
380 | "source": [
381 | "## Dans le bloc ou pas dans le bloc ?\n",
382 | "\n",
383 | "Le fait de mettre une instruction dans le bloc d'instruction du for ou de la mettre en dehors, ça change tout ! Comparez les deux codes suivants:"
384 | ]
385 | },
386 | {
387 | "cell_type": "code",
388 | "execution_count": null,
389 | "metadata": {},
390 | "outputs": [],
391 | "source": [
392 | "for animal in ['koala', 'paresseux', 'maki', 'ouistiti']:\n",
393 | " print(f\"le {animal} fait la sieste\")\n",
394 | " print(\"attendez cinq minutes !\")"
395 | ]
396 | },
397 | {
398 | "cell_type": "code",
399 | "execution_count": null,
400 | "metadata": {},
401 | "outputs": [],
402 | "source": [
403 | "for animal in ['koala', 'paresseux', 'maki', 'ouistiti']:\n",
404 | " print(f\"le {animal} fait la sieste\")\n",
405 | "print(\"attendez cinq minutes !\")"
406 | ]
407 | },
408 | {
409 | "cell_type": "markdown",
410 | "metadata": {},
411 | "source": [
412 | "Dans la première version, il faut attendre 20 minutes en tout !..."
413 | ]
414 | },
415 | {
416 | "cell_type": "markdown",
417 | "metadata": {},
418 | "source": [
419 | "Boucles à la suite, imbriquées, quelles instructions dedans et dehors de la boucle ? Suivez les instructions pour chaque code. \n",
420 | "\n",
421 | "\n",
422 | " \n",
423 | "**Ex2.0 - Desserts à la suite** \n",
424 | "1. créez une liste de vos desserts préférés\n",
425 | "2. affichez pour chacun de ces desserts une phrase qui dit que vous les adorez (avec une boucle !!)\n",
426 | "3. puis pour chacun de ces desserts une phrase qui dit que vous en voulez encore.\n",
427 | "
"
428 | ]
429 | },
430 | {
431 | "cell_type": "code",
432 | "execution_count": null,
433 | "metadata": {},
434 | "outputs": [],
435 | "source": [
436 | "desserts = [\"sorbet fraise\", \"oréo\", \"pomme\"] # à compléter"
437 | ]
438 | },
439 | {
440 | "cell_type": "code",
441 | "execution_count": null,
442 | "metadata": {},
443 | "outputs": [],
444 | "source": []
445 | },
446 | {
447 | "cell_type": "markdown",
448 | "metadata": {},
449 | "source": [
450 | "\n",
451 | " \n",
452 | "**Ex2.1 - Desserts immédiats** \n",
453 | "\n",
454 | "Cette fois-ci, écrivez les deux phrases pour chaque dessert, avant de passer au dessert suivant.\n",
455 | "
"
456 | ]
457 | },
458 | {
459 | "cell_type": "code",
460 | "execution_count": null,
461 | "metadata": {},
462 | "outputs": [],
463 | "source": []
464 | },
465 | {
466 | "cell_type": "markdown",
467 | "metadata": {},
468 | "source": [
469 | "\n",
470 | " \n",
471 | "**Ex2.2 - Salutations imbriquées** \n",
472 | "\n",
473 | "Écrivez un code utilisant les listes l et m ci-dessous et qui affiche:\n",
474 | "\n",
475 | "`coucou a1 ciao`\n",
476 | "\n",
477 | "`coucou a2 ciao`\n",
478 | "\n",
479 | "`coucou a3 ciao`\n",
480 | "\n",
481 | "`coucou b1 ciao`\n",
482 | "\n",
483 | "`coucou b2 ciao`\n",
484 | "\n",
485 | "...\n",
486 | "\n",
487 | "`coucou c3 ciao`\n",
488 | "
\n"
489 | ]
490 | },
491 | {
492 | "cell_type": "code",
493 | "execution_count": null,
494 | "metadata": {},
495 | "outputs": [],
496 | "source": [
497 | "l = [\"a\", \"b\", \"c\"]\n",
498 | "m = [1, 2, 3]\n",
499 | "\n"
500 | ]
501 | },
502 | {
503 | "cell_type": "markdown",
504 | "metadata": {},
505 | "source": [
506 | "## La fonction `range`"
507 | ]
508 | },
509 | {
510 | "cell_type": "markdown",
511 | "metadata": {},
512 | "source": [
513 | "La fonction native `range` est un peu particulière mais très utile. Elle permet de renvoyer une sorte de liste des entiers de `0` à `n-1`, ce qui fait `n` entiers consécutifs en commençant à `0`."
514 | ]
515 | },
516 | {
517 | "cell_type": "code",
518 | "execution_count": null,
519 | "metadata": {},
520 | "outputs": [],
521 | "source": [
522 | "for i in range(10):\n",
523 | " print(i)"
524 | ]
525 | },
526 | {
527 | "cell_type": "markdown",
528 | "metadata": {},
529 | "source": [
530 | "Tout se passe comme si on avait écrit \"à la main\" :"
531 | ]
532 | },
533 | {
534 | "cell_type": "code",
535 | "execution_count": null,
536 | "metadata": {},
537 | "outputs": [],
538 | "source": [
539 | "for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:\n",
540 | " print(i)"
541 | ]
542 | },
543 | {
544 | "cell_type": "markdown",
545 | "metadata": {},
546 | "source": [
547 | "Toutefois il faut se méfier car `range(10)` n'est pas exactement une liste c'est un itérateur ; cela dépasse le cadre du TP pour l'instant, mais il faut savoir qu'il peut être converti en liste."
548 | ]
549 | },
550 | {
551 | "cell_type": "code",
552 | "execution_count": null,
553 | "metadata": {},
554 | "outputs": [],
555 | "source": [
556 | "print(range(10))\n",
557 | "print(type(range(10)))"
558 | ]
559 | },
560 | {
561 | "cell_type": "markdown",
562 | "metadata": {},
563 | "source": [
564 | "Comme vous voyez le type de `range(10)` n'est pas `list` mais `range`. Ceci dit on a pas exactement besoin de savoir ce que c'est pour s'en servir. On peut le convertir en liste :"
565 | ]
566 | },
567 | {
568 | "cell_type": "code",
569 | "execution_count": null,
570 | "metadata": {},
571 | "outputs": [],
572 | "source": [
573 | "l = list(range(10))\n",
574 | "print(l)\n",
575 | "print(type(l))"
576 | ]
577 | },
578 | {
579 | "cell_type": "markdown",
580 | "metadata": {},
581 | "source": [
582 | "\n",
583 | "\n",
584 | "`range(n)` où n est un entier est \"une sorte\" de liste des entiers qui vont de ...\n",
585 | "\n",
586 | "On peut :\n",
587 | "* l'utiliser dans une boucle pour compter de ...\n",
588 | "* le convertir en ...\n",
589 | "
"
590 | ]
591 | },
592 | {
593 | "cell_type": "markdown",
594 | "metadata": {},
595 | "source": [
596 | "\n",
597 | " \n",
598 | "**Ex3.0 - Range un peu !** \n",
599 | "\n",
600 | "Créez une liste des entiers de 0 à 12 (12 exclu)\n",
601 | "
"
602 | ]
603 | },
604 | {
605 | "cell_type": "code",
606 | "execution_count": null,
607 | "metadata": {},
608 | "outputs": [],
609 | "source": []
610 | },
611 | {
612 | "cell_type": "markdown",
613 | "metadata": {},
614 | "source": [
615 | "\n",
616 | " \n",
617 | "**Ex3.1 - Range encore !** \n",
618 | "créez une liste des entiers de 0 à 20 (20 inclus)\n",
619 | "\n",
620 | "
"
621 | ]
622 | },
623 | {
624 | "cell_type": "code",
625 | "execution_count": null,
626 | "metadata": {},
627 | "outputs": [],
628 | "source": []
629 | },
630 | {
631 | "cell_type": "markdown",
632 | "metadata": {},
633 | "source": [
634 | "\n",
635 | " \n",
636 | "**Ex3.2 - Salut tout le monde !** \n",
637 | "\n",
638 | "Affichez, à l'aide d'une boucle for, les phrases \"hello0\", \"hello1\", ... pour les entiers de 0 à 5 (exclus)\n",
639 | "
"
640 | ]
641 | },
642 | {
643 | "cell_type": "code",
644 | "execution_count": null,
645 | "metadata": {},
646 | "outputs": [],
647 | "source": []
648 | },
649 | {
650 | "cell_type": "markdown",
651 | "metadata": {},
652 | "source": [
653 | "\n",
654 | " \n",
655 | "**Ex3.3 - Des paramètres à géométrie variable** \n",
656 | "On peut appeler `range` avec 1 ou 2 ou 3 paramètres. Essayez vous-même de comprendre à quoi ils servent :\n",
657 | " \n",
658 | "
"
659 | ]
660 | },
661 | {
662 | "cell_type": "code",
663 | "execution_count": null,
664 | "metadata": {},
665 | "outputs": [],
666 | "source": [
667 | "list(range(12))"
668 | ]
669 | },
670 | {
671 | "cell_type": "code",
672 | "execution_count": null,
673 | "metadata": {},
674 | "outputs": [],
675 | "source": [
676 | "list(range(2, 12))"
677 | ]
678 | },
679 | {
680 | "cell_type": "code",
681 | "execution_count": null,
682 | "metadata": {},
683 | "outputs": [],
684 | "source": [
685 | "list(range(12, 2))"
686 | ]
687 | },
688 | {
689 | "cell_type": "code",
690 | "execution_count": null,
691 | "metadata": {},
692 | "outputs": [],
693 | "source": [
694 | "list(range(2, 12, 1))"
695 | ]
696 | },
697 | {
698 | "cell_type": "code",
699 | "execution_count": null,
700 | "metadata": {},
701 | "outputs": [],
702 | "source": [
703 | "list(range(2, 12, 2))"
704 | ]
705 | },
706 | {
707 | "cell_type": "code",
708 | "execution_count": null,
709 | "metadata": {},
710 | "outputs": [],
711 | "source": [
712 | "list(range(1, 12, 5))"
713 | ]
714 | },
715 | {
716 | "cell_type": "code",
717 | "execution_count": null,
718 | "metadata": {},
719 | "outputs": [],
720 | "source": [
721 | "list(range(2, 12, 5))"
722 | ]
723 | },
724 | {
725 | "cell_type": "code",
726 | "execution_count": null,
727 | "metadata": {},
728 | "outputs": [],
729 | "source": [
730 | "list(range(1, 12, -1))"
731 | ]
732 | },
733 | {
734 | "cell_type": "code",
735 | "execution_count": null,
736 | "metadata": {},
737 | "outputs": [],
738 | "source": [
739 | "list(range(10, 2, -1))"
740 | ]
741 | },
742 | {
743 | "cell_type": "markdown",
744 | "metadata": {},
745 | "source": [
746 | "\n",
747 | " \n",
748 | "Quand on appelle `range(a, b)`\n",
749 | "* le premier paramètre, `a`, représente : ...\n",
750 | "* le second paramètre, `b`, représente : ...\n",
751 | "\n",
752 | "
"
753 | ]
754 | },
755 | {
756 | "cell_type": "markdown",
757 | "metadata": {},
758 | "source": [
759 | "\n",
760 | " \n",
761 | "Quand on appelle `range(a, b, c)` \n",
762 | "* le premier paramètre, `a`, représente : ...\n",
763 | "* le deuxième paramètre, `b`, représente : ...\n",
764 | "* le troisième paramètre, `c`, représente : ...\n",
765 | "\n",
766 | "
"
767 | ]
768 | },
769 | {
770 | "cell_type": "markdown",
771 | "metadata": {},
772 | "source": [
773 | "## Applications sur le `range`\n",
774 | "\n",
775 | "\n",
776 | " \n",
777 | "**Ex3.4** \n",
778 | "Creéz la liste des entiers de 1 à 100 (100 inclus)\n",
779 | "
"
780 | ]
781 | },
782 | {
783 | "cell_type": "code",
784 | "execution_count": null,
785 | "metadata": {},
786 | "outputs": [],
787 | "source": []
788 | },
789 | {
790 | "cell_type": "markdown",
791 | "metadata": {},
792 | "source": [
793 | "\n",
794 | " \n",
795 | "**Ex3.5** \n",
796 | "Creéz la liste des entiers de 50 à 60 (60 exclus)\n",
797 | "
"
798 | ]
799 | },
800 | {
801 | "cell_type": "code",
802 | "execution_count": null,
803 | "metadata": {},
804 | "outputs": [],
805 | "source": []
806 | },
807 | {
808 | "cell_type": "markdown",
809 | "metadata": {},
810 | "source": [
811 | "\n",
812 | " \n",
813 | "**Ex3.6** \n",
814 | "Creéz la liste des entiers de -100 à 100 (100 inclus)\n",
815 | "
"
816 | ]
817 | },
818 | {
819 | "cell_type": "code",
820 | "execution_count": null,
821 | "metadata": {},
822 | "outputs": [],
823 | "source": []
824 | },
825 | {
826 | "cell_type": "markdown",
827 | "metadata": {},
828 | "source": [
829 | "\n",
830 | " \n",
831 | "**Ex3.7** \n",
832 | "Creéz la liste des entiers de 30 à 130 (inclus) de 2 en 2\n",
833 | "
"
834 | ]
835 | },
836 | {
837 | "cell_type": "code",
838 | "execution_count": null,
839 | "metadata": {},
840 | "outputs": [],
841 | "source": []
842 | },
843 | {
844 | "cell_type": "markdown",
845 | "metadata": {},
846 | "source": [
847 | "\n",
848 | " \n",
849 | "**Ex3.8** \n",
850 | "Creéz la liste des entiers de 100 à 50 (inclus) de -2 en -2\n",
851 | "
"
852 | ]
853 | },
854 | {
855 | "cell_type": "code",
856 | "execution_count": null,
857 | "metadata": {},
858 | "outputs": [],
859 | "source": []
860 | },
861 | {
862 | "cell_type": "markdown",
863 | "metadata": {},
864 | "source": [
865 | "\n",
866 | " \n",
867 | "**Ex3.9** \n",
868 | "Avec une boucle for faire des print des entiers de -100 à 100 (exclus) de 5 en 5\n",
869 | "
"
870 | ]
871 | },
872 | {
873 | "cell_type": "code",
874 | "execution_count": null,
875 | "metadata": {},
876 | "outputs": [],
877 | "source": []
878 | },
879 | {
880 | "cell_type": "markdown",
881 | "metadata": {},
882 | "source": [
883 | "\n",
884 | "\n",
885 | "## __Récapitulatif__\n",
886 | "\n",
887 | "**Boucle for**\n",
888 | "* si on oublie les deux points, à la fin de la ligne du `for`, le python est ... \n",
889 | "* le bloc d'instruction dans la boucle doit être ...\n",
890 | "* les intructions qui ne sont pas indentées sont exécutées ...\n",
891 | "* si une boucle est à l'intérieur d'une autre, c'est une boucle ...\n",
892 | "* si deux boucles se suivent dans le code, le code de la deuxième boucle est exécuté quand ... \n",
893 | "\n",
894 | "**Fonction range**\n",
895 | "* `range(n)` permet de générer les entiers qui vont de ...\n",
896 | "* on peut convertir `range(n)` en une liste le convertir en écrivant ... \n",
897 | "* Quand on appelle `range(a, b, c)` \n",
898 | " * le premier paramètre, `a`, représente : ...\n",
899 | " * le deuxième paramètre, `b`, représente : ...\n",
900 | " * le troisième paramètre, `c`, représente : ...\n",
901 | "\n",
902 | "
"
903 | ]
904 | },
905 | {
906 | "cell_type": "code",
907 | "execution_count": null,
908 | "metadata": {},
909 | "outputs": [],
910 | "source": []
911 | }
912 | ],
913 | "metadata": {
914 | "kernelspec": {
915 | "display_name": "Python 3 (ipykernel)",
916 | "language": "python",
917 | "name": "python3"
918 | },
919 | "language_info": {
920 | "codemirror_mode": {
921 | "name": "ipython",
922 | "version": 3
923 | },
924 | "file_extension": ".py",
925 | "mimetype": "text/x-python",
926 | "name": "python",
927 | "nbconvert_exporter": "python",
928 | "pygments_lexer": "ipython3",
929 | "version": "3.9.5"
930 | }
931 | },
932 | "nbformat": 4,
933 | "nbformat_minor": 2
934 | }
935 |
--------------------------------------------------------------------------------
/tp/custom.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------