{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#
TP n°1 : Initiation à Python (Les bases)
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Afin de pouvoir personnaliser votre notebook Jupyter sans détruire le notebook sur lequel travaille votre voisin(e), vous allez tout d'abord aller dans le menu **`File`** (en haut) puis cliquer sur **`Make a copy...`**. Renommez le notebook avec votre nom, par exemple." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Les cellules des notebook Jupyter sont éditables et exécutables :**\n", "\n", "Pour exécuter le contenu d'une cellule dans ce document, vous pouvez utiliser le bouton\n", " (dans le menu en haut) ou bien utiliser les combinaisons de touches suivantes, après avoir sélecttionné la cellule :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Shift + Enter** : le code de la cellule est exécuté et le curseur passe à la cellule suivante.\n", "- **Ctrl + Enter** : le code de la cellule est exécuté et le curseur reste sur la même cellule.\n", "- **Alt + Enter** : le code de la cellule est exécuté et le notebook crée une nouvelle cellule immédiatement après." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ainsi, pour lire ce notebook, il faut exécuter les cellules **au fur et à mesure et dans l'ordre**, en partant de la première cellule, et en tapant **Maj+Entrée** -- ou **Shift+Enter** -- (sur le clavier, une fois sur la cellule) jusqu'à la fin du notebook, de sorte à bien évaluer toutes les cellules de code." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Remarques :

\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##
Il est vivement conseillé de modifier le code de chaque cellule commençant par Entrée [x] afin de s'entrainer
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Présentation de Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Python](https://fr.wikipedia.org/wiki/Python_(langage) \"Python sur Wikipedia.org\") est un langage de programmation moderne, [généraliste](https://fr.wikipedia.org/wiki/Langage_d%C3%A9di%C3%A9), [orienté objet](https://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_objet) et de [haut niveau](https://fr.wikipedia.org/wiki/Langage_de_haut_niveau) créé par le développeur néerlandais [Guido van Rossum](https://fr.wikipedia.org/wiki/Guido_van_Rossum). Fan de la série télévisée [*Monty Python's Flying Circus*](https://fr.wikipedia.org/wiki/Monty_Python%27s_Flying_Circus), il décide de baptiser ce langage « Python ».\n", "\n", "Caractéristiques techniques :\n", "\n", "* **typage dynamique :** Pas besoin de définir le type des variables, des arguments ou des types de retour des fonctions, il est inféré à l'exécution.\n", "* **gestion automatique de la mémoire :** Pas besoin d'allouer ou de désallouer explicitement pour les variables et les tableaux de données. Pas de problème de fuite de mémoire.\n", "* **interprété :** Pas besoin de compilé le code. L'interpréteur Python lit et exécute directement le code python.\n", "\n", "Avantages :\n", "\n", "- L'avantage principal est la facilité de programmer, réduisant le temps nécessaire au développement, débogage et maintien du code.\n", "- Le langage encourage plusieurs bonnes pratiques de progrmmation:\n", "- L'indentation comme syntaxe, définissant la portée d'un *scope*.\n", "- L'intégration de la documentation au code source.\n", "- Une bibliothèque standard fournie et un large nombre de paquets dédiés au calcul scientifique.\n", "\n", "Inconvénients :\n", "\n", "Puisque Python est un langage de programmation interprété et typé dynamiquement (*c.-à-d.* lors de l'exécution), l'exécution du code python peut être lente comparée à des langages de programmation compilés et typés statiquement (*c.-à-d.* lors de la compilation), tels que le C ou le Fortran." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Premiers pas en Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.1. L'en-tête d'un fichier Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Un fichier source Python se termine par l'extension « **.py** » et débutera systématiquement par la ligne suivante :\n", "\n", "```python\n", "# -*- coding: UTF-8 -*-\n", "```\n", "\n", "permettant d'utiliser l'encodage [UTF-8](https://fr.wikipedia.org/wiki/UTF-8) au sein du fichier source." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.2. Les commentaires dans un fichier source" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Une ligne de code débutant par le caractère dièse (`#`) sera considérée comme étant un commentaire :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ceci est un commentaire en Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Remarque :

\n", "

Une variante consiste à commencer un commentaire avec trois guillemets \"\"\" et à le finir de la même façon. C'est une façon aisée d'écrire un long commentaire qui court sur plusieurs lignes.

\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Éditeur Python\n", "\n", "Ceci est un commentaire.\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.3. Première ligne de code en Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quand vous exécutez un programme, vous obtiendrez souvent une sortie (résultat d'un calcul, affichage d'une chaîne de caractère,...). L'exemple de code ci-dessous contient une seule commande `print(\"Bonjour Python !\")` qui produit une seule ligne en sortie.\n", "\n", "Sélectionner la ligne *Entrée [x]* ci-dessous puis appuyez sur la combinaison de touche **Shift + Entrée**, sur votre clavier, pour exécuter le contenu du champ de saisie :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Bonjour Python !\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analyse de la ligne :\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sans les guillemets, l'interpréteur Python penserait que `Bonjour` est censé être une commande et cela entraînerait une erreur puisque cette commande n'existe pas :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(Bonjour, Python)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

L'instruction n'est pas comprise par l'interpréteur qui génère une erreur et le force à s'arrêter.

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°1 :** construisez une ligne de code qui va afficher le texte « Hello World ! » :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ecrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3. Les opérations de base" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.1. Les opérations arithmétiques" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut faire en python les mêmes calculs qu'avec une calculatrice :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Symbole | Opération |\n", "|---------|--------------|\n", "| + | Addition |\n", "| - | Soustraction |\n", "| * | Multiplication |\n", "| / | Division |\n", "| // | Division partie entière |\n", "| ** | Puissance |\n", "| % | Modulo |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exécuter le code des cellules suivantes :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Addition\n", "1 + 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Soustraction sur des petits entiers\n", "1 - 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# multiplication sur de très grands entiers\n", "6786897689768976893324534535 * 34535678909876543567890876" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# multiplication sur des flottants (nombres réels)\n", "3.14159 * 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

En python, la partie entière d'un nombre réel (ex : 3.14159) est séparée de la partie fractionnaire par un point (convention anglaise) et non une virgule (convention française). En d'autres termes, le séparateur décimal est le point . et non la virgule ,

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En mathématiques, et plus précisément en arithmétique, la [**division euclidienne**](https://fr.wikipedia.org/wiki/Division_euclidienne) (ou **division entière**) est une opération qui, à deux entiers naturels appelés **dividende** et **diviseur**, associe deux autres entiers appelés **quotient** et **reste**." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Division\n", "1 / 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

On obtient toujours un flottant lorsqu'on fait une division simple avec /, même entre deux entiers.

\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Quotient de la division euclidienne (ou division entière)\n", "1 // 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Reste de la division euclidienne (ou division entière)\n", "1 % 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Puissance\n", "2 ** 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Les puissances de dix\n", "1E30 * 2E8" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Le carré du nombre 1.34 dix puissance -7\n", "1.34E-7 ** 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# L'arrondi de 124,187 (à deux chiffres après la virgule ici)\n", "round(124.187,2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Formatage de nombre :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"π ≈ %.2f\" % 3.14159)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Remarque :

\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°2 :** écrire un programme qui calcule pui affiche le volume V (en cm3) d'une sphère de rayon r = 1,25 m en arondissant le résultat averc un chiffre après la virgule." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ecrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.2. Les opérateurs de comparaison" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Symbole | Opération |\n", "|---------|-----------|\n", "| == | égal |\n", "| != | différent |\n", "| < | inférieur |\n", "| > | supérieur |\n", "| <= | inférieur ou égal |\n", "| >= | supérieur ou égal |" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"1 == 2 est :\", 1 == 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "'1 != 2 est :', 1 != 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "'1 < 2 est :', 1 < 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "'1 <= 2 est :', 1 <= 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "'1 >= 2 est :', 1 > 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "'1 > 2 est :', 1 >= 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4. Variables et affectation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les variables permettent de stocker des informations en mémoire, pour une utilisation dans un programme. Chaque variable possède un nom mais il n'est pas nécessaire de la déclarer : elle est créée lorsqu'on lui affecte une information." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Vidéo de présentation - Ne pas exécuter pour l'instant\n", "from IPython.lib.display import YouTubeVideo\n", "YouTubeVideo('9VJdd4Klofs')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour stocker une l'information dans une variable, il faut écrire une instruction utilisant le signe égal `=` :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "a = 12 # Variable a\n", "b = 36 # Variable b\n", "c = a * b # Variable c\n", "monNombre = 13 # Variable monNombre" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "monNombre + 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "monNombre * 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "

Bon usage : il faut éviter de faire commencer le nom d'une variable par une majuscule ou le caractère « _ ».

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Une instruction très utile `a = a + 1` (ou `a += 1`) qui n'a aucun sens mathématique mais qui est très utile en informatique : " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = 3\n", "a = a + 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"La valeur de a est :\", a" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "b = 6\n", "b += 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"La valeur de b est :\", b" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "A # la casse (distinction entre majuscule et minuscule) est prise en compte dans python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analyse du code :\n", "\n", "- Première ligne : la valeur 3 est affectée dans la place mémoire « a » ;\n", "- Deuxième ligne : l'interpréteur Python calcule `a + 1` puis l'affecte dans la place mémoire `a`. La variable `a` devient donc égale à 4. Cette instruction augmente la valeur de la variable `a` d'une unité (on dit aussi **incrémenter**) ;\n", "- Troisième lkigne : elle confirme la valeur affectée à la variable `a` ;\n", "- Quatrième ligne : la valeur 6 est affectée dans la place mémoire « b » ;\n", "- Cinquième lgne : l'interpréteur Python calcule `b + 2` puis l'affecte dans la place mémoire `b`. La variable `b` devient donc égale à 8. Cette instruction augmente la valeur de la variable `b` qui est incrémentée de deux unités ;\n", "- Sixième ligne : elle confirme cette incrémentation.\n", "- Dernière ligne : elle confirme le fait que l'interpréteur différencie les lettres minuscules des lettres majuscules, d'où le message d'erreur." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.1. Les différents types de variable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les variables peuvent contenir différents types d'informations : on dit qu'elles sont de type ou typées.\n", "\n", "Python fournit des types de base, dits [types primitifs](https://en.wikipedia.org/wiki/Primitive_data_type) :\n", "\n", "- ***int*** : entiers (ex : -2 ; 5 ; ...)\n", "- ***float*** : décimal (ex : -2.0 ; 2e6=2000000.0)\n", "- ***str*** : chaîne de caractère (ex : 'Bonjour' ; \"Autre exemple\" ; \"2 + 3\" ; \"5\")\n", "- ***bool*** : Booléen : Vrai ou Faux. (ex : 2 == 3, False, 3 < 4)\n", "- ***list*** : Tableau ou liste (ex : [1,'toto', 2.0] ; [[1,2],[3,4]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

L'instruction type() permet d'obtenir le type d'une variable

\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Booléen\n", "b = True # La majuscule est importante !\n", "type(b)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Entier\n", "n = 12\n", "type(n)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Réel\n", "x = 1.0 # En réalité, dans la mémoire d'un ordinateur on ne peut stocker que des nombres décimaux !\n", "type(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Chaine de caractère\n", "s = \"1.0\" # s = '1.0', fonctionne également\n", "type(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Vous remarquerez que l'interpréteur Python a inféré (déduit) le type des variables b, n, x et s.

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.2. Les conversions de type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Grâce aux fonctions `int`, `float` et `str`, on peut convertir le type d'une variable." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "var = '0.1'\n", "var = int(var)\n", "var = float(var)\n", "type(var)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°3 :** le programme ci-dessus provoque une erreur, pourquoi ?" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "Votre réponse ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Par contre, on peut utiliser des objets flottants (`float`) dans des objets (`int`) en supprimant la partie fraction grâce à la fonction `int()`. Cette fonction démontre ce que l'on appelle ***l'arrondi vers un comportement nul*** :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "int(1.3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "int(1.7)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "int(-1.3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "int(-1.7)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Même si ce n'est pas conseillé, on peut aussi changer de type en cours de route dans un programme :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = \"Je suis une chaîne\" # a est une chaîne de caractères\n", "a" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = 12 # et maintenenant a est un nombre !!!\n", "a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.3. Les opérations arithmétiques sur les variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Symbole | Opération |\n", "|---------|--------------|\n", "| += | Addition |\n", "| -= | Soustraction |\n", "| *= | Multiplication |\n", "| /= | Division |\n", "| //= | Division partie entière |\n", "| **= | Puissance |\n", "| %= | Modulo |" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = 1.0\n", "x += 9.0\n", "print(x)\n", "x -= 1.0\n", "print(x)\n", "\n", "x /= 2.0\n", "print(x)\n", "\n", "x //= 2.0\n", "print(x)\n", "\n", "x **= 4.0\n", "print(x)\n", "\n", "x %= 6.0\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.4. Affectations simultanées" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x,y = 1,2\n", "print(x,y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Une application très classique de l'affectation **simultanée** est l'échange du contenu de deux variables :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "A,B = 32,10\n", "print(A,B,\"\\n\")\n", "\n", "print(\"La valeur de A est :\", A)\n", "print(\"La valeur de B est :\", B,\"\\n\")\n", "\n", "A,B = B,A\n", "\n", "print(\"La nouvelle valeur de A est :\", A)\n", "print(\"La nouvelle valeur de B est :\", B,\"\\n\")\n", "\n", "C,D,E = 10,5,18\n", "\n", "print(\"La nouvelle valeur de C est :\", C)\n", "print(\"La nouvelle valeur de D est :\", D)\n", "print(\"La nouvelle valeur de E est :\", E)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

La séquence de caractères \\n permet de passer à la ligne.

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 5. Les chaînes de caractères (*string*)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En Python, les chaines de caractères peuvent aussi bien s'écrire entre simples guillemets (**'**) qu'entre doubles guillemets (**\"**)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s1 = \"Bienvenue dans Python,\"\n", "s2 = 'un langage de programmation simple'\n", "\n", "print(s1)\n", "print(type(s1))\n", "print(s2)\n", "print(type(s2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remarque :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "b = 'c\\'est' # si la chaîne de caractères contient un simple guillemet ' alors il faut le faire précéder d'un \\\n", "b" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "b = \"c'est\" # ou alors on utilise les doubles guillemets \" \" sans le \\\n", "b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.1. Taille d'une chaîne de caractères\n", "\n", "Il existe une fonction **`len()`** qui permet de connaitre la taille d'une chaine de caractères :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Taille de s1 =\", len(s1))\n", "print(\"Taillle de s2 =\", len(s2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.2. Concaténation de chaînes de caractères et répétition\n", "\n", "On peut concaténer (relier entre elles, joindre) deux chaînes de catactères grâce à l'opérateur **`+`** :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# 3 manières de concaténer des chaînes de caractères\n", "print(s1 + s2)\n", "print(s1 + \" \" + s2)\n", "print(\" \".join((s1, s2)))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "print(\"Bienvenue dans Python,\" + \" un langage de programmation simple\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "prenom = \"Jean\"\n", "nom = 'Dupont'\n", "print(prenom, nom )\n", "\n", "complet = prenom + \" \" + nom\n", "print(\"\\nNom complet :\", complet)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Une opération interdite :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = 0\n", "s = \"e\"\n", "print(a + s) # petit problème de type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Répétition d'une chaîne de caractères :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(2 * '100')\n", "print(2 * 'Python')\n", "print(\"quatre fois ; \" * 4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.3. Formatage d'une chaîne de caractères\n", "\n", "On peut formater les chaines de caractères grâce à l'usage combiné des accolades **`{}`** et de la méthode (fonction) **`format()`** :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print('{0}{1}{0}'.format('abra', 'cad'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print('{0}{1}{1}'.format(3,5))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = \"{1}bla\"\n", "t = s.format(100,88)\n", "print(s)\n", "print(t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut faire de l'alignement :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"{:03}\".format( 1))\n", "print(\"{:03}\".format( 10))\n", "print(\"{:03}\".format(100))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut remplacer un élément de la chaîne :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "url = \"http://{language}.wikipedia.org/\"\n", "url = url.format(language=\"fr\")\n", "url" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut tronquer un élément de la chaîne :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "nom = \"Hugo\"\n", "prenom = \"Lebon\"\n", "nom_formate = \"%s, %s.\" % (nom, prenom[0])\n", "nom_formate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut tronquer l'affichage d'un nombre après la virgule :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print('{:0.4f}'.format(3.14159265359))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "round(3.14159265359, 4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.4. Indexation\n", "\n", "On peut accéder à un caractère d'une chaîne de caractères grâce à la syntaxe : `chaine[index]`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sparta = 'C\\'est Sparta !'\n", "sparta[0], sparta[2], sparta[-1], sparta[-3]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = sparta\n", "s[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.5. Le *slicing*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En programmation, et en Python en particulier, il arrive fréquemment, lorsque l'on travaille avec des chaînes de caractères, que l'on souhaite extraire une petite chaîne de caractères d'une chaîne plus longue. Python propose pour cela une technique simple appelée ***slicing*** (ou « decoupage en tranches »). Elle consiste à indiquer entre crochets les indices correspondant au début et à la fin de la « tranche » que l'on souhaite extraire.\n", "\n", "Ainsi, les slices sont des expressions qui permettent, en une ligne de code, d'extraire des éléments d'une chaîne de caractères." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Synthaxe :**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "chaine[debut:fin:saut]\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Remarque : dans la tranche, le début est inclu mais pas la fin.

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exemple :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ch = \"Juliette\"\n", "print(ch[0:3])\n", "print(ch[0:3:2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analyse du code :\n", "\n", "`ch = \" J u l i e t t e \"`\n", "
\n", "                  ↑  ↑ ↑  ↑  ↑  ↑ ↑  ↑

\n", "                   0  1  2  3   4  5  6   7\n", "\n", "- Première ligne : la variable `ch` reçoit la chaîne de cractères \"Juliette\" ;\n", "- Deuxième ligne : on extrait puis on affiche les caractères situés dans la tranche d'index [0 - 2] de la chaîne de caactères." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Autres exemples :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(ch[:4]) # extrait les 4 premiers caractères de la chaîne" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(ch[4:]) # extrait les caractères situés après le 3ème" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Pour plus d'informations :** [Les slices en Python](https://zestedesavoir.com/tutoriels/582/les-slices-en-python/)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 6. L'instruction `Input` (Saisir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il est parfois nécessaire de demander à l'utilisateur de sairisr la valeur d'une variable ou une chaîne de caractères (saisie interactive) :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = input(\"Saisir la valeur de a : \")\n", "\"Vous avez saisi la valeur :\",a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut utiliser la fonction `eval()` qui évalue la donnée saisie par l'utilisateur. Essayez d'entrer 8/2 :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = eval(input(\"Saisir la valeur de a : \")) # La fonction eval() évalue le contenu de ce qui est saisi\n", "\n", "\"Vous avez saisi la valeur :\",a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 7. Le test `if`...`elif`...`else` (Si...Alors...Sinon)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les instructions `if` .. `elif` .. `else` permettent de faire des tests. Pour cela, on utilise une structure de la forme :\n", "\n", "```python\n", "if expression1:\n", "\tbloc d’instructions1\n", "\n", "elif expression2:\n", "\tbloc d’instructions2\n", "\n", "elif expression3:\n", " bloc d’instructions3\n", "\n", "else:\n", "\tbloc d’instructionsN\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exécution :\n", "\n", "- Si ***expression1*** est **True** (Vraie) alors ***bloc instructions1*** est exécuté mais ***bloc d’instructions2***, ***bloc instructions3*** et ***bloc instructionsN*** sont ignorés.\n", "\n", "- Si ***expression1*** est **False** (Faux) ET ***expression2*** est **True** (Vraie) alors ***bloc instructions2*** est exécuté mais ***bloc d’instructions1***, ***bloc instructions3*** et ***bloc instructionsN*** sont ignorés.\n", "\n", "- Si toutes les ***expression*** (1, 2, 3,...) sont **False** (Faux) alors ***bloc instructionsN*** est exécuté mais les autres ***bloc d'instructions*** (1, 2, 3,...) sont ignorés.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exemple :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "x = 10\n", "if x < 4:\n", " print(\"petit\")\n", "elif x < 20:\n", " print(\"moyen\")\n", "else:\n", " print(\"grand\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analyse du code :\n", "\n", "- Première ligne : on affecte la nombre entier 10 à la variable `x` ;\n", "- Deuxième ligne : on compare `x` à 4 et si x est plus petit que 4 alors on affiche le message `petit`sinon on passe à la ligne suivante ;\n", "- Troisième ligne : si `x` est plus petit que 20 alors on affiche le message `moyen`sinon on passe à la ligne suivante ;\n", "- Dernière ligne : si aucune des conditions précédentes n'est satisfaite alors on affiche le message `grand`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Un autre exemple :** lancer le programme ci-dessous et observer le résultat" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = eval(input(\"Saisir un nombre :\"))\n", "if n%2 == 0 :\n", " print(n, \" est un nombre pair\")\n", "else : \n", " print(n, \" est un nombre impair\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°4 :** Modifier le programme ci-dessus pour demander à l'utilisateur de saisir une valeur et indiquer si le nombre saisi est `petit`, s'il est inférieur à 5, `grand` s'il est supérieur ou égal à 50 ou `moyen` sinon." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ecrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 8. La boucle `for` (pour)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La boucle `for` est une boucle bornée, on l'utilise quand on sait combien de fois doit avoir lieu la répétition d'une opération.\n", "\n", "L'en-tête de la boucle contient le mot clé `for` suivi, en général, d'une variable qui prend plusieurs valeurs et qui est utilisée comme **compteur** car elle sert à numéroter les répétitions de la boucle. Elle se termine par deux-points `:` et est suivie d’un bloc indenté qui constitue le **corps de la boucle**. On dit que l’on réalise une **itération** de la boucle à chaque fois que le corps de la boucle est exécuté." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La structure d'une boucle `for` est la suivante :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "```python\n", "for variable in liste_valeurs:\n", " bloc d'instructions\n", "```\n", "\n", "* `liste_valeurs` est de n'importe quel type « itérable » (c'est-à-dire qui peut prendre plusieurs valeurs succéssives) ;\n", "* `variable` prend successivement les valeurs de chaque élément de `expression`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Un *bloc* en python se distingue par le ***décalage par rapport à la marge***. Il permet de délimiter le début et la fin du contenu de la boucle `for`.\n", "\n", "On retrouvera cette notion de *bloc* également pour les boucles `while` (tant que), les tests `ìf`...`elif`...`else` (si... alors... sinon...), les définitions de fonction `def`, etc.\n", "\n", "**Il faut donc être très attentif à la présence de ces `:` et au décalage de marge qui s'en suit.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exemple :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "for i in range(5):\n", " print(\"je répète 5 fois la même chose. Ici, i =\",i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "est équivalent à :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for i in ( 0 , 1 , 2 , 3 , 4 ):\n", " print(\"je répète 5 fois la même chose. Ici, i =\",i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analyse du code :\n", "\n", "- la boucle `for i in range(n)` tournera `n` fois ;\n", "- la variable `i` prendra les valeurs entières entre `0` et `n-1`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Important :

\n", "

Remarquez bien le : après le range(5) : cela marque le début du bloc.

\n", "

Remarquez également le décalage du print qui indique qu'il appartient à la boucle for et ne sera exécuté QUE dans cette boucle.

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Encore un autre exemple :**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for i in (7, 4, \"oui\"):\n", " print(\"La variable i vaut :\", i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Une erreur de syntaxe :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "i = 3\n", "for i in range(5):\n", " print(\"je répète 5 fois la même chose. Ici, i =\",i)\n", "print(\"la valeur de i vaut :\", i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut ajouter des paramètres à l'instruction `range()` :\n", "\n", "```python\n", "range(debut,fin,saut)\n", "\n", "```\n", "\n", "**Exemple :**\n", "> range(1,10)\n", "\n", "Le compteur commencera à 1 et s'arrêtera à 9 (= 10 - 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°5 :** Expérimenter (= construire un programme) et expliquer les valeurs prises par la variable `i` dans la boucle suivante\n", "\n", "> for i in range(3,15,2):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ecrire votre code ici" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "Vos explications ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°6 :** écrire un programme qui calcule la somme des entiers de 5 à 20." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ecrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°7 :** écrire un programme qui calcule la somme des 5 premiers entiers impairs au carré." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ecrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°8 :** écrire un programme qui demande un nombre à l'utilisateur et qui affiche la table de multiplication de ce nombre. L'affichage de sortie ressemblera à ceci :\n", "\n", "
\n",
    "Table de 7 :\n",
    "    \n",
    "1 x 7 = 7\n",
    "2 x 7 = 14\n",
    "3 x 7 = 21\n",
    "4 x 7 = 28\n",
    "5 x 7 = 35\n",
    "6 x 7 = 42\n",
    "7 x 7 = 49\n",
    "8 x 7 = 56\n",
    "9 x 7 = 63\n",
    "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ecrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### La boucle `for` sur une chaine de caractères :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "C'est très facile de parcourir une chaîne de caractères avec une boucle `for` :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ADN = \"AGCTGTCGCG\"\n", "for lettre in ADN:\n", " print('la séquence ADN contient', lettre)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "qui est équivalent à :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for lettre in \"AGCTGTCGCG\":\n", " print('la séquence ADN contient', lettre)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°9 :** Exécuter et expliquer le code qui suit" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "chaine = input(\"Entrer une phrase:\") \n", "for lettre in chaine:\n", " if lettre in \"aeiouyAEIOUY\":\n", " print(lettre)\n", " elif lettre == \"I\":\n", " print(lettre)\n", " else:\n", " print(\"*\") " ] }, { "cell_type": "raw", "metadata": {}, "source": [ "Votre explication ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 9. La boucle `While` (Tant que)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La boucle `while` est une boucle non bornée : on l'utilise si on ne connait pas à l’avance le nombre de répétitions d'une opération.\n", "\n", "La structure d'une boucle `while` est la suivante :\n", "\n", "```python\n", "while condition:\n", " instruction1\n", " instruction2\n", " ...\n", "suite programme\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exécution :\n", "- Tant que la `condition` reste vraie, les instructions à l'intérieur du bloc (partie indentée) seront exécutées. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "i = 0\n", "while i < 10:\n", " print(\"i vaut :\", i)\n", " i = i + 1\n", "print(\"C'est terminé.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analyse du code :\n", "\n", "- la boucle `while i < 0` s'exécutera tant que `i` sera inférieur à 10 ;\n", "- à chaque tour de boucle, on incrémente `i`de 1 ;\n", "- la variable `i` prendra les valeurs entières entre 0 et `9` ;\n", "- quand `i` vaut 11, la boucle s'interrompt et le programme se termine." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Remarques :

\n", "

- Si la condition est fausse (false) au départ, le corps de la boucle n’est jamais exécuté ;

\n", "

- Si la condition reste toujours vraie (true), alors le corps de la boucle est répété indéfiniment, on parle de boucle infinie (le programme ne s'arrête jamais).

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice n°10 :** reprendre l'exercice n°7 mais en utilisant la boucle `while`.
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Ecrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comment choisir entre boucle for et boucle while ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En général, si on connaît avant de démarrer la boucle le nombre d’itérations à exécuter, on choisit une boucle `for`. Au contraire, si la décision d’arrêter la boucle ne peut se faire que par un test, on choisit une boucle `while`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il est toujours possible de remplacer une boucle `for` par une boucle `while` :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for i in range(4):\n", " print(\"i a pour valeur\", i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le programme ci-dessus est équivalent à :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "i = 0\n", "while i < 4:\n", " print(\"i a pour valeur\", i)\n", " i = i + 1 # on aurait pu aussi écrire i += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 10. Les instructions `continue`, `pass` et `break`, et la clause `else` dans les boucles [Lien](https://docs.python.org/fr/3.7/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.1. L’instruction `continue`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L’instruction `continue` permet de passer prématurément au tour de boucle suivant : elle fait continuer sur la prochaine itération de la boucle." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for i in range(4):\n", " print(\"debut itération\", i)\n", " print(\"i vaut :\", i)\n", " if i < 2:\n", " continue # on passe directement à l'instruction suivante\n", " print(\"fin itération\", i, \"\\n\")\n", "\n", "print(\"Exécuté après la boucle\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.2. L’instruction `pass`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L’instruction `pass` ne fait rien. Elle peut être utilisée lorsqu’une instruction est nécessaire pour fournir une syntaxe correcte, mais qu’aucune action ne doit être effectuée." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = int(input(\"donner un entier \"))\n", "if x % 2 == 0 :\n", " pass\n", "else :\n", " print(\"x est impair\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "qui aurait pu s'écrire plus simplement : " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = int(input(\"donner un entier \"))\n", "if not (x % 2 == 0):\n", " print(\"x est impair\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.3. L’instruction `break`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L’instruction `break` permet de stopper l’exécution d’une boucle (`while` ou `for`) : elle fait sortir de la boucle et passer à l’instruction suivante." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for i in range(10):\n", " print(\"debut itération\", i)\n", " print(\"i vaut :\", i)\n", " if i == 2:\n", " break # interruption définitive\n", " print(\"fin itération\", i, \"\\n\")\n", " \n", "print(\"\\nExécuté après la boucle\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Remarques :

\n", "

Dans le cas de boucles imbriquées, l’instruction break ne fait sortir que de la boucle dans laquelle elle se trouve.

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.4. La clause `else` dans une boucle" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for n in range(2, 8):\n", " for x in range(2, n):\n", " if n % x == 0:\n", " print(n, \"egale\", x, \"x\", n/x)\n", " break\n", " else:\n", " print(n, \"est un nombre premier\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 11. Les opérations logiques" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les opérateurs logiques sont utilisés dans les raisonnements logiques. Parmi ces opérateurs logiques, on trouve :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Symbole | Opération |\n", "|---------|--------------|\n", "| and | ET logique |\n", "| or | OU logique |\n", "| not | Négation |" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "True and False" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "True or False" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "not (True and False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exemples pour l'opréteur `and` :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = 2\n", "b = 3\n", "print(a == 2 and b == 2)\n", "print(a != 2 and b != 2)\n", "print(a < 3 and b < 3)\n", "print(a <= 3 and b <= 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exemples pour l'opréteur `or` :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(a == 2 or b == 2)\n", "print(a != 2 or b != 2)\n", "print(a < 3 or b < 3)\n", "print(a <= 3 or b <= 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Le `or` (ou) et le `and` (et) dans une boucle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Un `if` ou un `while` peut contenir plusieurs conditions, nous aurons alors une structure de la forme :\n", "\n", "```\n", "si condition1 op_logique condition2:\n", " bloc d'instructions1\n", "sinon:\n", " bloc d'instructions2\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "avec « **op_logique** » qui désigne un *opérateur logique* qui peut être le « ou » (noté en Python `or`) ou le « et » (noté en Python `and`)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exécution :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- (condition1 or condition2) est **vrai** SI condition1 est vraie OU condition2 est vraie.\n", "\n", "\n", "- (condition1 and condition2) est **faux** SI condition1 est vraie ET condition2 est faux." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les différents cas possibles peuvent être regroupés dans ce que l'on appelle une **table de vérité** :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Table de vérité pour le OR (OU) :\n", "\n", "| condition1 | condition2 | condition1 or condition2 |\n", "|------------|------------|--------------------------|\n", "| vrai | vrai | vrai |\n", "| vrai | faux | vrai |\n", "| faux | vrai | vrai |\n", "| faux | faux | faux |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "⇒ **`or`** renvoie True si **au moins une des propositions est vraie**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Table de vérité pour le AND (ET) :\n", "\n", "| condition1 | condition2 | condition1 and condition2 |\n", "|------------|------------|---------------------------|\n", "| vrai | vrai | vrai |\n", "| vrai | faux | faux |\n", "| faux | vrai | faux |\n", "| faux | faux | faux |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "⇒ **`and`** renvoie True si **toutes les propositions sont vraies**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 12. Exercice de clôture : le programme du juste prix !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour conclure cette activité, vous devrez écrire un programme de juste prix dont voici les règles du jeu :\n", "- L'ordinateur choisi un nombre au hasard compris entre 1 et 100\n", "- Le joueur doit essayer de le deviner en 10 coups maximum\n", "- L'ordinateur affiche **gagné** si l'utilisateur le trouve en moins de 10 coups, ou **perdu** sinon" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les programmeurs n'utilisent pas Jupyter (ce que vous utilisez actuellement avec cette page) pour créer des programmes mais un environnement de développement « intégré » (abrégé **EDI** en français ou **IDE** en anglais, pour Integrated Development Environment) tel que [IDLE](https://docs.python.org/3/library/idle.html), [Thonny](https://thonny.org/), [Spyder](https://www.spyder-ide.org/), [Visual Code](https://code.visualstudio.com/), etc.\n", "Vous allez donc faire de même et créer le programme de ce jeu à l'aide du logiciel **Thonny**, à lancer depuis le dossier NSI-SNT sur le bureau.\n", "\n", "Présentation de Thonny : *voir avec le professeur*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Quelques indices pour créer votre programme :**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Pour choisir un nombre aléatoire entre 1 et 100, on peut utiliser l'instruction **randint** :" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Vous pouvez exécuter plusieurs fois ce code\n", "import random # Ligne nécessaire pour utiliser l'instruction randint\n", "print(random.randint(1, 10)) # Dans cet exemple, le choix se fait entre 1 et 10 (bornes incluses)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- On pourra utiliser une boucle `while` (tant que), une variable pour comptabiliser le nombre de coups (compteur) et des tests `ìf`...`elif`...`else` (si... alors... sinon)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il est fortement conseillé d'écrire un algorithme en langage naturel ou en [pseudo-code](https://fr.wikipedia.org/wiki/Pseudo-code \"Wikipedia.org\") avant de se lancer dans le programme." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A vous de jouer !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Améliorations possibles :

\n", "

- Vérifier que l'utilisateur entre bien un entier.

\n", "

- Vérifier que le nombre entré est bien compris entre 0 et 100.

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cette activité s'inspire très largement de :\n", "- Cours de [Antony Lesage](https://www.lptmc.jussieu.fr/user/barbi/ENSEIGNEMENT/M2/Python1617/TD01-Exercices/TD01-Introduction_%D0%95_Python.html)\n", "- MOOC [Bioinformatique : algorithmes et génomes sur FUN](https://www.fun-mooc.fr/courses/course-v1:inria+41003+session03/about)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Pour aller plus loin :

\n", " \n", "
" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "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.7.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": false, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": false, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }