{ "cells": [ { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "[prev: Les conteneurs de base](data-structures.ipynb) | [home](../index.ipynb) | [next: Structuration du code](code-block.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Structure de contrôle\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- if (test) elif else\n", " * conversion implicite en booléen\n", "- while (test) [break/continue] else\n", "- for (iter) [break/continue] else\n", "\n", "susucre : `a = x if cond else y`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IF - ELIF - ELSE\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Structure de `if - elif -else`\n", "\n", "``` python\n", "# instruction avant le if\n", "\n", "if test_1:\n", " # instruction A\n", "elif test_2:\n", " # instruction B\n", "elif test_3:\n", " # instruction C\n", "else:\n", " # instruction D\n", "\n", "# instruction après le if\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "start\n", "travail\n", "end\n" ] } ], "source": [ "print('start')\n", "\n", "a = 1\n", "\n", "if a == 1:\n", " print('travail')\n", "\n", "print('end')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "start\n", "end\n" ] } ], "source": [ "print('start')\n", "\n", "a = 2\n", "\n", "if a == 1:\n", " print('travail')\n", "\n", "print('end')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "start\n", "travail 1\n", "end\n" ] } ], "source": [ "print('start')\n", "\n", "a = 1\n", "\n", "if a == 1:\n", " print('travail 1')\n", "else:\n", " print('travail 2')\n", "\n", "print('end')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "start\n", "travail 2\n", "end\n" ] } ], "source": [ "print('start')\n", "\n", "a = 1\n", "\n", "if a == 2:\n", " print('travail 1')\n", "else:\n", " print('travail 2')\n", "\n", "print('end')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "travail 1\n" ] } ], "source": [ "a = 1\n", "\n", "if a == 1:\n", " print('travail 1')\n", "elif a == 2:\n", " print('travail 2')\n", "else:\n", " print('dodo')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "travail 2\n" ] } ], "source": [ "a = 2\n", "\n", "if a == 1:\n", " print('travail 1')\n", "elif a == 2:\n", " print('travail 2')\n", "else:\n", " print('dodo')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dodo\n" ] } ], "source": [ "a = 3\n", "\n", "if a == 1:\n", " print('travail 1')\n", "elif a == 2:\n", " print('travail 2')\n", "else:\n", " print('dodo')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## FOR\n", "\n", "En python, `for` permet d'itérer sur les éléments d'une séquence (ex: `list`, `tuple`, `dict`)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "toto\n", "42\n", "3.14\n" ] } ], "source": [ "ma_liste = ['toto', 42, 3.14]\n", "\n", "for elem in ma_liste:\n", " print(elem)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "un\n", "2\n", "trois\n" ] } ], "source": [ "mon_dict = {'un': 42, 2: 'bonjour', 'trois': 3.14}\n", "\n", "for elem in mon_dict:\n", " print(elem)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p\n", "y\n", "t\n", "h\n", "o\n", "n\n" ] } ], "source": [ "for elem in 'python':\n", " print(elem)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Structure de `for - continue / break - else`\n", "\n", "``` python\n", "# instruction avant le for\n", "\n", "for elem in sequence:\n", " # debut des instructions\n", " if test_break:\n", " # on arrete tout\n", " break\n", " if test_continue:\n", " # on passe à l'itération suivante\n", " continue\n", " # suite des instructions\n", " # pas vue si continue\n", "else:\n", " # executer si on est sorti de la boucle sans break\n", "\n", "# instruction après le for\n", "```" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tout s'est bien passé\n", "[0, 2, 4, 6, 8]\n" ] } ], "source": [ "#liste = range(15)\n", "liste = range(10)\n", "result = []\n", "\n", "for elem in liste:\n", " if elem > 10:\n", " result = 'interdit de dépasser 10'\n", " break\n", " if elem % 2:\n", " # ignorer les impairs\n", " continue\n", " result.append(elem) # un peu comme 'result += [elem]' mais bien mieux\n", "else:\n", " print(\"tout s'est bien passé\")\n", "\n", "print(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Remarque** Ce dernier exemple présente de gros défauts:\n", "\n", " - changer la nature de `result` selon le contexte\n", " - `else: print(...)` est un mode de communication très faible" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## WHILE\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Structure de `while - continue / break - else`\n", "\n", "``` python\n", "# instruction avant le while\n", "\n", "while test_boucle:\n", " # debut des instructions\n", " if test_break:\n", " # on arrete tout\n", " break\n", " if test_continue:\n", " # on passe à l'itération suivante\n", " continue\n", " # suite des instructions\n", " # pas vue si continue\n", "else:\n", " # executer si on est sorti de la boucle sans break\n", "\n", "# instruction après le while\n", "```" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 2 3 4 5 6 7 8 9 10 " ] } ], "source": [ "# compteur\n", "\n", "a = 0\n", "\n", "while a < 10:\n", " a += 1\n", " print(a, end=' ')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 4 6 8 10 " ] } ], "source": [ "# compteur pair\n", "\n", "a = 0\n", "\n", "while a < 10:\n", " a += 1\n", " if a % 2:\n", " continue\n", " print(a, end=' ')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def indice(liste, valeur):\n", " \"renvoie le premier indice tq liste[indice] == valeur\"\n", " i = 0\n", " \n", " while i < len(liste):\n", " if liste[i] == valeur:\n", " result = i\n", " break\n", " i += 1\n", " else:\n", " result = None\n", " \n", " return result\n", "\n", "\n", "ma_liste = ['zero', 'un', 'deux', 'trois']" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indice(ma_liste, 'deux')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "indice(ma_liste, 'quatre')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En pratique, on préférera l'utilisation du `for` (éventuellement couplé à un `if`) qui ne risque pas de partir dans des boucles infinies.\n", "\n", "Par exemple, le code suivant tournera à l'infini (et on n'aime pas ça) :\n", "```python\n", "a = 0\n", "\n", "while a < 10:\n", " if a % 2:\n", " continue\n", " print(a, end=' ')\n", " a += 1\n", "```" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 2 4 6 8 10 " ] } ], "source": [ "# compteur pair\n", "\n", "for a in range(25):\n", " if a > 10:\n", " break\n", " if a % 2:\n", " continue\n", " print(a, end=' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [Conversion de secondes (étape 2)](../exercises/exercises.ipynb#Exercice-3-:-conversion-de-secondes)\n", "- [Compte occurences (étape 1)](../exercises/exercises.ipynb#Exercice-5-:-compte-occurences)\n", "- [Suite de Collatz](../exercises/exercises.ipynb#Exercice-6-:-suite-de-Collatz)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 4 }