{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "1_Introduction.ipynb", "provenance": [], "collapsed_sections": [ "Nx49_9RZwiWR" ], "toc_visible": true, "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "DfQ-d2onvooo", "colab_type": "text" }, "source": [ "Mickaël Tits\n", "CETIC\n", "mickael.tits@cetic.be" ] }, { "cell_type": "markdown", "metadata": { "id": "gT78kDJQYzEH", "colab_type": "text" }, "source": [ "# Chapitre 1 - Introduction au langage de programmation Python" ] }, { "cell_type": "markdown", "metadata": { "id": "FlKvA2FSt-C1", "colab_type": "text" }, "source": [ "# Pourquoi Python ?\n", "1. C'est un langage **interprété**: lorsqu'on écrit une instruction, on peut directement l'exécuter. A l'opposé, un langage **compilé** nécessite l'écriture (et la compilation) d'un programme entier avant de pouvoir le tester. Un langage interprété permet de programmer plus facilement, **de manière interactive**, de tester facilement un morceau de code. C'est donc un langage idéal pour rapidement développer et tester des prototypes, ou puls particulièrement, des algorithmes d'analyse de données.\n", "\n", "2. C'est un langage **haut-niveau**: une seule ligne de code permet dans certains cas de réaliser des processus complexe, en cachant les détails liés notamment à la gestion ou la réprésentation des données dans la mémoire de l'ordinateur, ou les opérations arithmétiques ou binaires de bas-niveau. Un langage de haut-niveau rend plus facile le développement d'un programme, et augmente donc la **productivité** (généralement au détriment de la vitesse d'exécution).\n", "\n", "3. Python est **open source**: et donc **gratuit** pour tout le monde, y compris les entreprises.\n", "\n", "4. C'est un langage **populaire**: la communauté de développeurs est très active, et on trouve facilement sur internet de la documentation et de très **nombreux exemples d'utilisation** dans tout type d'application. De plus, la communauté développe et maintient de très **nombreuses librairies** développées et/ou compatibles avec Python, permettant d'augmenter la productivité lors de l'écriture d'un programme, particulièrement dans les domaines des mathématiques et des sciences des données.\n", "\n", "![Texte alternatif…](https://github.com/titsitits/Python_Data_Science/blob/master/Images/python_stack_overflow_withsource.png?raw=true)\n", "\n", "(source: https://stackoverflow.blog/2017/09/06/incredible-growth-python/)\n", "\n", "\n", "Python est donc le langage idéal pour développer et tester facilement et rapidement un algorithme. Le désavantage principal est sa lenteur: l'exécution d'un langage haut-niveau et interprété est généralement plus lente que celle d'un langage compilé. \n", "\n", "Dans un contexte ou la vitesse d'exécution est cruciale (e.g. pour des systèmes embarqués, ou traitement de données en temps réel, des programmes réactifs), Python n'est pas le langage idéal. A l'inverse, dans un contexte où la vitesse de développement est cruciale (développement de prototypes, d'applications business concurrentes), la productivité offerte par le langage Python en fait un bon choix." ] }, { "cell_type": "markdown", "metadata": { "id": "QL889EyHjniU", "colab_type": "text" }, "source": [ "#Instructions\n" ] }, { "cell_type": "markdown", "metadata": { "id": "OWwb8aHl9rn9", "colab_type": "text" }, "source": [ "* Les **instructions** permettent de commander l'**interpréteur** Python, c'est-à-dire un système qui comprend les instructions et les traduit en traitements sur des données binaires, représentées sous forme d'**objets** informatiques.\n", "* Par défaut, chaque ligne de code correspond à une instruction\n", "* Les instructions sont interprétées séquentiellement par l'interpréteur Python.\n", "* Il existe différents types d'instructions, telles que des assignations de variables, des opérations, des appels de fonctions, des conditions, des boucles, etc. que nous allons voir ci-dessous.\n" ] }, { "cell_type": "code", "metadata": { "id": "K9_3X5sYieOe", "colab_type": "code", "outputId": "c62fe0fd-22de-4a52-d8d4-6b244741210a", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "#Assignation d'une variable, dont l'identifiant est \"prix\"\n", "prix = 300000\n", "\n", "#Appel d'une fonction de base, \"print\", qui permet d'imprimer la variable dans la console\n", "print(prix)" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "300000\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "bTU1o58Pik_s", "colab_type": "code", "outputId": "4aa93e44-dd8a-42da-ef97-eb26ef269f31", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "#On peut écrire plusieurs instructions sur une seule ligne, en les séparant avec le symbole ;\n", "a = 100000; b = 200000; c = 300000\n", "\n", "#On peut écrire Une instruction sur plusieurs lignes, en la découpant avec le symbole \\\n", "print(a + b \\\n", " + c)" ], "execution_count": 2, "outputs": [ { "output_type": "stream", "text": [ "600000\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "wF6q5rvmjEKi", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 166 }, "outputId": "19a5b907-de3b-48d8-ef21-23d7a537eada" }, "source": [ "#Oups, la variable prix2 n'existe pas: l'interpréteur ne comprend donc pas l'instruction et renvoie un message d'erreur pour le signaler. Il faut bien sûr assigner une variable avant de l'utiliser.\n", "print(prix + \\\n", " prix2)" ], "execution_count": 3, "outputs": [ { "output_type": "error", "ename": "NameError", "evalue": "ignored", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprix\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mprix2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'prix2' is not defined" ] } ] }, { "cell_type": "code", "metadata": { "id": "4aRNFha3iyA7", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "f470e9be-9585-44fe-a51c-ace9b728609e" }, "source": [ "prix2 = 250000\n", "print(prix + \\\n", " prix2)" ], "execution_count": 4, "outputs": [ { "output_type": "stream", "text": [ "550000\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "EeasGouZi6ih", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "5d70bd44-0bb6-46fb-e8ad-a5bba67cbc50" }, "source": [ "prix2" ], "execution_count": 5, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "250000" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "markdown", "metadata": { "id": "2DCdosyImaOy", "colab_type": "text" }, "source": [ "Les identifiants d'une variable s'écrivent en un mot, peuvent contenir des lettres, des nombres, et \"_\", mais ne peuvent pas commencer par un nombre. Ils ne peuvent pas contenir de symboles spéciaux tels que !, @, #, $, %." ] }, { "cell_type": "code", "metadata": { "id": "dMkf4q_ojJDw", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 131 }, "outputId": "c202e4aa-ef6d-4168-abc9-8e251a2c335b" }, "source": [ "_variable = 1\n", "#Oups: ces identifiants sont invalides => l'interpréteur renvoie un message d'erreur.\n", "2variable = 1\n", "v@ri@ble = 1" ], "execution_count": 6, "outputs": [ { "output_type": "error", "ename": "SyntaxError", "evalue": "ignored", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m 2variable = 1\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "2QZ7fUYrqcFn", "colab_type": "text" }, "source": [ "Certains mots-clés ne peuvent pas être utilisés comme identifiants, car ils ont une signification bien précise pour l'interpréteur python. C'est par exemple le cas de **`del`** qui est une instruction en soi, et qui permet en l'occurrence de supprimer une variable.\n", "Pour éviter tout risque de confusion, il est également préférable d'éviter d'utiliser comme identifiant ceux définissant déjà des fonctions de base de Python, tel que **`print`**." ] }, { "cell_type": "code", "metadata": { "id": "p7qjS2-8jvps", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 183 }, "outputId": "d5b1fc58-d7e9-41a0-83e2-c4de30a0c950" }, "source": [ "#Oups, j'ai redéfini une fonction de base. L'interpréteur ne comprend plus alors l'appel à la fonction.\n", "print = 1\n", "print(\"Rue de Bruxelles 61, Namur\")" ], "execution_count": 7, "outputs": [ { "output_type": "error", "ename": "TypeError", "evalue": "ignored", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Rue de Bruxelles 61, Namur\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'int' object is not callable" ] } ] }, { "cell_type": "code", "metadata": { "id": "mXfmu6GRkInd", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "c5a2a3d4-7280-44e0-e185-db4036ba8553" }, "source": [ "#Supprimons la variable créée avec le mot-clé \"del\"\n", "del print\n", "#La fonction de base fonctionne de nouveau\n", "print(\"Rue de Bruxelles 61, Namur\")" ], "execution_count": 8, "outputs": [ { "output_type": "stream", "text": [ "Rue de Bruxelles 61, Namur\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "Cw-8UJdPkx-Z", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 131 }, "outputId": "1f71f321-e12b-422c-9cab-20b1b1243351" }, "source": [ "#Oups, j'ai utilisé un mot-clé comme nom de variable\n", "del = 1" ], "execution_count": 9, "outputs": [ { "output_type": "error", "ename": "SyntaxError", "evalue": "ignored", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m del = 1\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "j02sjwqOttpj", "colab_type": "text" }, "source": [ "# Types de données de base" ] }, { "cell_type": "markdown", "metadata": { "id": "OJe8qc_Qiipc", "colab_type": "text" }, "source": [ "On identifie généralement quatre types de données de base en Python.\n", "\n", "Trois sont des **données numériques**:\n", "* Booléen (**`bool`**): `True, False`\n", "* Nombre entier (**`int`**): `-42, 0, 1, 42, 250000`\n", "* Nombre décimal à virgule flottante (**`float`**): `42.0, 3.14, -0.01`\n", "\n", "La dernière permet de représenter du **texte**:\n", "\n", "* Chaîne de caractères (**`string`**): `\"Hello World!\"` ou `'Hello World!' `\n", "\n", "On définit un **`string`** en entourant le texte des symboles **\"double quote\"** ou **'simple quote'**. Ainsi, 4 représente un **`int`**, mais \"4\" représente un **`string`**." ] }, { "cell_type": "markdown", "metadata": { "id": "topa9bZ1_LzX", "colab_type": "text" }, "source": [ "## Assignation dynamique\n", "* Pas besoin de définir le type d'une variable, l'interpréteur Python comprend tout seul :" ] }, { "cell_type": "code", "metadata": { "id": "fQpdYIbDwZ6J", "colab_type": "code", "colab": {} }, "source": [ "my_int = 250000\n", "my_float = 1.23\n", "my_bool = True\n", "my_string = \"Rue de Bruxelles 61, Namur\"\n", "#Veuillez notez les guillements pour définir le string" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "MDN_RjvEwnQx", "colab_type": "code", "outputId": "42b5adc8-3ed4-4856-cf5e-bb4908fdba24", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "my_int, my_float, my_bool, my_string" ], "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(250000, 1.23, True, 'Rue de Bruxelles 61, Namur')" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "markdown", "metadata": { "id": "ExLckC98fWfE", "colab_type": "text" }, "source": [ "* La fonction \"type\" permet de vérifier le type d'une variable :" ] }, { "cell_type": "code", "metadata": { "id": "8yOIDVQ3wtzx", "colab_type": "code", "outputId": "fd3e3143-b9a2-4024-9adb-55d5a497ccae", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "type(my_string)" ], "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "str" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "62yQ85nk_H5Y", "colab_type": "text" }, "source": [ "* On peut également modifier dynamiquement le type des variables :" ] }, { "cell_type": "code", "metadata": { "id": "sExIWlgL-98I", "colab_type": "code", "outputId": "3aa7ab80-0c20-4d25-93e9-2be9a4aa9fef", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "my_string = 5.0\n", "type(my_string)" ], "execution_count": 13, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "float" ] }, "metadata": { "tags": [] }, "execution_count": 13 } ] }, { "cell_type": "code", "metadata": { "id": "4VW52peNqBSu", "colab_type": "code", "colab": {} }, "source": [ "my_int1 = 2\n", "my_int2 = 2\n", "my_float1 = 4.2\n", "my_bool = True\n", "my_string1 = \"Rue de Bruxelles\"\n", "my_string2 = ' 61'\n", "my_string3 = \" Namur\"\n" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "a9oA4Ic-fsGm", "colab_type": "text" }, "source": [ "* La commande \"whos\" permet de visualiser l'ensemble des variables actuellement présentes dans le programme :" ] }, { "cell_type": "code", "metadata": { "id": "JStVzuHmCgm4", "colab_type": "code", "outputId": "b8397c94-fd3d-4af9-dc13-54adfba06386", "colab": { "base_uri": "https://localhost:8080/", "height": 312 } }, "source": [ "whos" ], "execution_count": 15, "outputs": [ { "output_type": "stream", "text": [ "Variable Type Data/Info\n", "-------------------------------\n", "a int 100000\n", "b int 200000\n", "c int 300000\n", "my_bool bool True\n", "my_float float 1.23\n", "my_float1 float 4.2\n", "my_int int 250000\n", "my_int1 int 2\n", "my_int2 int 2\n", "my_string float 5.0\n", "my_string1 str Rue de Bruxelles\n", "my_string2 str 61\n", "my_string3 str Namur\n", "prix int 300000\n", "prix2 int 250000\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "qDeZyjk5uwPZ", "colab_type": "text" }, "source": [ "## Conversion de types (casting)\n", "* Lorsque c'est possible, un type de données peut être converti vers un autre type de données.\n", " * convertir un **`int`** en **`str`**: **`str(4)`** => \"4\"\n", " * convertir un **`str`** en **`int`**: **`int(\"4\")`** => 4\n", " * convertir un **`float`** en **`int`**: **`int(4.8)`** => 4\n", " * conversion en **`bool`**: **`bool(\"\"), bool(0.0), bool(0)`** => **`False`**. Tout le reste renvoie **`True`**" ] }, { "cell_type": "code", "metadata": { "id": "TShUkq-5j41v", "colab_type": "code", "outputId": "ce8a47c0-330b-4e11-cf19-5899f5e215a8", "colab": { "base_uri": "https://localhost:8080/", "height": 69 } }, "source": [ "print(bool(\"\"), bool(0.0), bool(0))\n", "print(bool(\"0\"), bool(-1.2), bool(-10), bool(\"hi\"))\n", "str(True), str(False), int(True), int(False), float(True), float(False)" ], "execution_count": 16, "outputs": [ { "output_type": "stream", "text": [ "False False False\n", "True True True True\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "('True', 'False', 1, 0, 1.0, 0.0)" ] }, "metadata": { "tags": [] }, "execution_count": 16 } ] }, { "cell_type": "code", "metadata": { "id": "W_WvNT5Imd-q", "colab_type": "code", "outputId": "37149871-d9a7-4eae-a627-0e460001b442", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "int(4.9), float(\"3.5\"), str(3.5), bool(4.2), bool(-2), bool(0)" ], "execution_count": 17, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(4, 3.5, '3.5', True, True, False)" ] }, "metadata": { "tags": [] }, "execution_count": 17 } ] }, { "cell_type": "markdown", "metadata": { "id": "erueK9u6w35g", "colab_type": "text" }, "source": [ "# Opérations de base\n", " \n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "1g5ZK-F9qg-V", "colab_type": "text" }, "source": [ "## Opérations arithmétiques\n", "\n", "Les opérations de base peuvent se faire entre différents types de données numériques, en réalisant des conversions implicites de types si nécessaire:\n", "\n", "* Les **int**, **float** et **bool** peuvent être additionnés (**+**), multiplés (**\\***), divisés (**/**), ou soustraits (**-**) entre eux. \n", "* L'opérateur **\\*\\*** et un opérateur de puissance (exposant): 2\\*\\*10 => 1024\n", "* L'opérateur **%** et un modulo (reste de la division entière): 11%3 => 2" ] }, { "cell_type": "code", "metadata": { "id": "91uAuVpbsm8I", "colab_type": "code", "outputId": "bbcefc4f-9ba1-4d1f-f792-99ac8428e18a", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "#Operations sur un seul type de donnée\n", "print( my_int1+my_int2, 111-69, 6*7, (my_int1 + my_int2) * 10 + 2)" ], "execution_count": 18, "outputs": [ { "output_type": "stream", "text": [ "4 42 42 42\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "psumtjRGBFD3", "colab_type": "code", "outputId": "c8eaf935-4fbf-4720-ba0d-0910e970723b", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "#Opération compatibles entre types différents (entier, float, booléen)\n", "print(my_int1 + my_float1,\\\n", " my_float1 + my_bool,\\\n", " (my_int1 + my_int2 - 3.5) * 5 / 2)" ], "execution_count": 19, "outputs": [ { "output_type": "stream", "text": [ "6.2 5.2 1.25\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "TIJAjY4eBhxg", "colab_type": "code", "outputId": "6f4ec2c6-8cd0-464f-bd77-bd9ff8584781", "colab": { "base_uri": "https://localhost:8080/", "height": 52 } }, "source": [ "#Exposant\n", "print(2 ** 42)\n", "#Modulo\n", "print(11%3)" ], "execution_count": 20, "outputs": [ { "output_type": "stream", "text": [ "4398046511104\n", "2\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "c-H_YAb3HcNB", "colab_type": "code", "outputId": "f353a808-ae67-4c92-e74d-0f3542131b33", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "#La division entière renvoie un float (contrairement au langage C)\n", "8/3" ], "execution_count": 21, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "2.6666666666666665" ] }, "metadata": { "tags": [] }, "execution_count": 21 } ] }, { "cell_type": "markdown", "metadata": { "id": "02YJHXTyqlV9", "colab_type": "text" }, "source": [ "## Opérations sur des string\n", "\n", "Les string peuvent être additionnés entre eux (**+**), ou multiplés par un entier (**\\***):\n", "\n", " * Deux **string** peuvent être additionnés, ce qui résulte en une concaténation: \"hell\" + \"o\" => \"hello\"\n", " * Un **string** peut être multiplié par un entier, ce qui résulte en une concaténation multiple du string: \"hi\"*3 => \"hihihi\"" ] }, { "cell_type": "code", "metadata": { "id": "OmUps4p3_16q", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "outputId": "af170b6c-5990-4dfd-c1c2-85640a6da98b" }, "source": [ "#Les opérations sur les strings sont des concaténation\n", "address = my_string1 + my_string2 + my_string3\n", "print(address)\n", "print(\"hi\" * 3)" ], "execution_count": 22, "outputs": [ { "output_type": "stream", "text": [ "Rue de Bruxelles 61 Namur\n", "hihihi\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "0k8t2ZQW9L7x", "colab_type": "text" }, "source": [ "* Les opérations invalides (telle qu'additionner un string avec une variable numérique), renvoient une erreur:" ] }, { "cell_type": "code", "metadata": { "id": "mhBeoWyks8In", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 166 }, "outputId": "12e90f38-d8ed-4737-a865-d23f205fbd2e" }, "source": [ "my_int1 + my_string1" ], "execution_count": 23, "outputs": [ { "output_type": "error", "ename": "TypeError", "evalue": "ignored", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmy_int1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmy_string1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'str'" ] } ] }, { "cell_type": "code", "metadata": { "id": "mvy5DPPQs-P3", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "11a712cd-a93a-4f8f-88e0-23e9260b8922" }, "source": [ "string = '4'\n", "string + str(my_int1)" ], "execution_count": 24, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'42'" ] }, "metadata": { "tags": [] }, "execution_count": 24 } ] }, { "cell_type": "code", "metadata": { "id": "PGkQdMjktCfm", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "e6e6611d-f2c1-499e-d3e3-5bc1aa6dbc13" }, "source": [ "my_int1 + int(string)" ], "execution_count": 25, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "6" ] }, "metadata": { "tags": [] }, "execution_count": 25 } ] }, { "cell_type": "markdown", "metadata": { "id": "d0WLB3Mah1Tt", "colab_type": "text" }, "source": [ "## Opérateurs spéciaux: +=, *=, -=, /=, **=, %=\n", "\n", "* Les opérateurs spéciaux **`+=`**, **`*=`**, **`-=`**, **`/=`** permettent à la fois de réaliser une opération arithmétique et une assignation. \n", "\n", " > L'instruction \"**`toto += 1`**\" est équivalente à \"**`toto = toto + 1`**\"" ] }, { "cell_type": "code", "metadata": { "id": "ogRkFXK5DNHP", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "14ac7582-d09d-4a89-a6cb-5de942980b78" }, "source": [ "#Self-operation\n", "toto = 1\n", "toto += 100\n", "toto *= 2\n", "toto -= 76\n", "toto /= 3\n", "toto" ], "execution_count": 26, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "42.0" ] }, "metadata": { "tags": [] }, "execution_count": 26 } ] }, { "cell_type": "code", "metadata": { "id": "nffPqKhspl-6", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "288bebdb-2d86-4d82-e948-b030388cd6d3" }, "source": [ "hi = 11\n", "hi %= 3\n", "hi" ], "execution_count": 27, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "2" ] }, "metadata": { "tags": [] }, "execution_count": 27 } ] }, { "cell_type": "markdown", "metadata": { "id": "dSYmLW86ODdZ", "colab_type": "text" }, "source": [ "## Opérateurs de tests\n", "* test d'égalité: ==\n", "* test d'inégalité: !=\n", "* test de supériorité et infériorité stricte: > et <\n", "* inférieur/supérieur ou égal: <= et >=\n", "* le mot-clé **`is`** est équivalent à l'opérateur **`==`**\n", "* le mot-clé **`is not`** est équivalent à l'opérateur **`!=`**\n", "\n", "Ces opérateurs sont généralement utilisés avec les conditions: if, elif, ..., elif, else (voir plus loin)." ] }, { "cell_type": "code", "metadata": { "id": "e4WF9dj0OFa9", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "bbd57352-2af7-446c-ad7f-9e9f49301f3c" }, "source": [ "#assignation de variable\n", "a = 42\n", "\n", "# l'opérateur de test d'égalité \"==\" renvoie un booléen, ne doit surtout pas être confondu avec l'opération d'assignation \"=\" (c'est une source fréquente de bugs dans les conditions)\n", "a == 42 ,\\\n", "a != 42 ,\\\n", "a > 3 ,\\\n", "a <= 42 ,\\\n", "a is 42 ,\\\n", "a is not 42" ], "execution_count": 28, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(True, False, True, True, True, False)" ] }, "metadata": { "tags": [] }, "execution_count": 28 } ] }, { "cell_type": "markdown", "metadata": { "id": "tWUGwB5MeQOh", "colab_type": "text" }, "source": [ "## Opérateurs logiques\n", "* **`and`**: \"et\", **`*`** logique: True and False = False (1 * 0 = 1)\n", "* **`or`** : \"ou\", **`+`** logique: True or False = True (1 + 0 = 1)\n", "\n", "Remarque: en logique, 1 + 1 = 1 (True or True = True)\n", "\n", "Ces opérateurs sont généralement utilisés avec les opérateurs de tests, pour vérifier des conditions multiples (voir plus loin)." ] }, { "cell_type": "code", "metadata": { "id": "lEDJ4VzHRR-w", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 69 }, "outputId": "f0618e0f-c9db-4143-fbd7-3725fdd6c132" }, "source": [ "print(not True)\n", "\n", "print((a > 41) and (a < 43))\n", "\n", "print((a == 42) or (a == 43))" ], "execution_count": 29, "outputs": [ { "output_type": "stream", "text": [ "False\n", "True\n", "True\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "eeAdHBHmrRzt", "colab_type": "text" }, "source": [ "# Contrôle du flux des instructions\n" ] }, { "cell_type": "markdown", "metadata": { "id": "PcN74MUv9u49", "colab_type": "text" }, "source": [ "Certaines instructions permettent de contrôler le flux du code:\n", "\n", "* Les **conditions** permettent de réaliser un bloc d'instructions, ou de l'éviter, ou encore de choisir un bloc d'instructions parmi plusieurs.\n", "* Les **boucles** permettent de repasser plusieurs fois, de manière itérative, par le même bloc d'instructions\n", "* Pour différencier les différents blocs d'instructions, on utilise l'**indentation** (en utilisant des Tab, ou des Whitespace)\n", "\n", "En Python, l'indentation de chaque ligne de commande est donc très importante, puisque c'est elle qui définit le flux des instructions." ] }, { "cell_type": "code", "metadata": { "id": "xyi7hNPwsMdo", "colab_type": "code", "outputId": "8d367ab3-e7ab-4da9-c478-c1fc3656a2c0", "colab": { "base_uri": "https://localhost:8080/", "height": 131 } }, "source": [ "a = 1\n", "b = 2\n", "#On ne peut pas changer d'indentation sans définir un comportement \n", "#pour ce nouveau bloc de code (avec une condition ou une boucle)\n", " c = 3\n", " d = 4" ], "execution_count": 30, "outputs": [ { "output_type": "error", "ename": "IndentationError", "evalue": "ignored", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m c = 3\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "mzdy9jacqbRX", "colab_type": "text" }, "source": [ "## Conditions\n", "Les mot-clés **`if`**, **`elif`**, et **`else`** permettent de définir un flux conditionnel d'instructions:\n", "* \"**`if condition:`**\" : si la condition est vraie (**`True`**), le bloc d'instruction indenté sous cette condition et réalisé\n", "* \"**`elif condition2:`**\": si la condition précédente était fausse (dans le **`if`** précédent), et que cette condition2 est vraie, le bloc d'instruction indenté sous cette condition et réalisé\n", "* \"**`else:`**\": si toutes les conditions précédentes étaient fausses, le bloc indenté suivant est réalisé\n", "* Attention à l'**indentation** et au symbole **\":\"** ! C'est le bloc indenté après le symbole \":\" qui dépend de la condition\n", "* Si on veut spécifier un bloc d'instruction qui n'exécute rien, on peut utiliser le mot-clé **`pass`**" ] }, { "cell_type": "code", "metadata": { "id": "Ey0G8G1BOXvh", "colab_type": "code", "outputId": "92aa5a12-45b2-4a37-9047-6acb30922a65", "colab": { "base_uri": "https://localhost:8080/", "height": 52 } }, "source": [ "#condition = True\n", "a = 42\n", "condition = a == 43\n", "\n", "if condition:\n", " print(\"C'est vrai!\")\n", " \n", "if condition == True: \n", " print(\"C'est vraiment vrai!\")\n", " \n", "if condition == False:\n", " print(\"C'est faux!\")\n", " \n", "if not condition:\n", " print(\"Ce n'est pas vrai!\")\n" ], "execution_count": 31, "outputs": [ { "output_type": "stream", "text": [ "C'est faux!\n", "Ce n'est pas vrai!\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "x1LfvyQ9eEXi", "colab_type": "code", "outputId": "cf422cb1-ca7f-4cd6-e284-836000dd8e84", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "prix_maison = 150000\n", "\n", "condition = prix_maison < 200000\n", "#condition = a == 43\n", "\n", "if condition:\n", " print(\"C'est pas cher!\")\n", "else:\n", " print(\"C'est cher!\")" ], "execution_count": 32, "outputs": [ { "output_type": "stream", "text": [ "C'est pas cher!\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "awQni_LeP30h", "colab_type": "code", "outputId": "272441dc-2f4e-402e-922d-677ab30887b2", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "PER = 35 #price_earning_ratio\n", "\n", "if PER < 0: \n", " pass #il ne se passe rien\n", "elif PER < 10:\n", "\tprint(\"J'achète!\")\n", "elif PER <= 30:\n", "\tprint(\"Hodl!\")\n", "else:\n", "\tprint(\"Je vends!\")\n" ], "execution_count": 33, "outputs": [ { "output_type": "stream", "text": [ "Je vends!\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "akgy0WgBTPGH", "colab_type": "text" }, "source": [ "## Boucles\n", "Les boucles permettent de définir un flux itératif d'instructions:\n", "* **`while condition:`**: on éxécute le même bloc d'instructions itérativement tant qu'on respecte une condition\n", "* **`for variable in variable_set:`**: on exécute le bloc d'instructions itérativement sur un ensemble d'éléments" ] }, { "cell_type": "code", "metadata": { "id": "3aFkZPXaS4O5", "colab_type": "code", "outputId": "b80ce404-d268-4ae4-8540-b9823da88f0c", "colab": { "base_uri": "https://localhost:8080/", "height": 104 } }, "source": [ "\n", "count = 0\n", "while count < 5:\n", "\tprint(\"Je suis dans une boucle while depuis \" + str(count) + \" itérations\")\n", "\tcount += 1" ], "execution_count": 34, "outputs": [ { "output_type": "stream", "text": [ "Je suis dans une boucle while depuis 0 itérations\n", "Je suis dans une boucle while depuis 1 itérations\n", "Je suis dans une boucle while depuis 2 itérations\n", "Je suis dans une boucle while depuis 3 itérations\n", "Je suis dans une boucle while depuis 4 itérations\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "wJywAemKU39K", "colab_type": "code", "outputId": "e68fbe6a-eabd-4d88-f63d-b1b03f958354", "colab": { "base_uri": "https://localhost:8080/", "height": 104 } }, "source": [ "for i in range(0, 5):\n", "\n", " print(\"Je suis à l'itération\", i)" ], "execution_count": 35, "outputs": [ { "output_type": "stream", "text": [ "Je suis à l'itération 0\n", "Je suis à l'itération 1\n", "Je suis à l'itération 2\n", "Je suis à l'itération 3\n", "Je suis à l'itération 4\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "TTygHqOqw13N", "colab_type": "code", "outputId": "4e02e4ff-9017-4fde-a88e-202d61e80fd7", "colab": { "base_uri": "https://localhost:8080/", "height": 191 } }, "source": [ "for year in range(9,50):\n", " \n", " if year % 4 == 0:\n", " print(\"Année bissextile!\")\n", " continue #continuer directement la suite de la boucle\n", " \n", " if year == 18:\n", " print(\"Adulte!\")\n", " break #sortie d'une boucle\n", " \n", " print(year)" ], "execution_count": 36, "outputs": [ { "output_type": "stream", "text": [ "9\n", "10\n", "11\n", "Année bissextile!\n", "13\n", "14\n", "15\n", "Année bissextile!\n", "17\n", "Adulte!\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "oelH_ek3xwew", "colab_type": "code", "outputId": "a8fb0a15-2362-4f1e-8239-76db048a5969", "colab": { "base_uri": "https://localhost:8080/", "height": 156 } }, "source": [ "prix = 100000\n", "mine = False\n", "while True: \n", " #la condition est toujours vraie, c'est une boucle infinie; \n", " #il faut donc au moins inclure un \"break\"\n", " #dans le bloc d'instruction pour permettre une sortie de la boucle\n", " #(sinon il faut arrêter le programme manuellement)\n", " \n", " prix += 20000\n", " print(prix)\n", " \n", " if prix > 150000 and prix < 200000 and mine == False:\n", " print(\"j'achète\")\n", " mine = True \n", " \n", " elif prix > 200000 and mine:\n", " print(\"Je revends\")\n", " mine = False\n", " \n", " break\n", " " ], "execution_count": 37, "outputs": [ { "output_type": "stream", "text": [ "120000\n", "140000\n", "160000\n", "j'achète\n", "180000\n", "200000\n", "220000\n", "Je revends\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "O837MBoAygsu", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 183 }, "outputId": "1a36187d-4c31-4fbb-c99d-d42a10698bff" }, "source": [ "#Boucle infinie\n", "while True:\n", " pass" ], "execution_count": 38, "outputs": [ { "output_type": "error", "ename": "KeyboardInterrupt", "evalue": "ignored", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ] }, { "cell_type": "markdown", "metadata": { "id": "Ia4gzC9V1NDZ", "colab_type": "text" }, "source": [ "# Bonus - Exemple minimaliste: un petit programme mathématique\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "fRLbUg989zLU", "colab_type": "text" }, "source": [ "Approximation de $\\pi$:\n", "\n", "> $\\pi = 4\\sum_{n=0}^{\\infty} \\cfrac {(-1)^n}{2n+1} = 4\\left( \\frac11- \\frac13+ \\frac15- \\frac17+- \\cdots\\right)$\n", "\n", "\n", "* On estime itérativement pi, avec une série de fractions de plus en plus longue\n", "* On définit une condition pour sortir de la boucle d'itération: lorsque la nouvelle estimation ne change presque plus, on considère qu'on est assez proche de la solution\n", "\n", "(Remarque: ce n'est pas la meilleure méthode d'estimation mais elle est facile à coder, ce qui en fait un bon exemple de programme mathématique)" ] }, { "cell_type": "code", "metadata": { "id": "HmUWZtO_ZKun", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "4d1183e2-7bf9-4ac9-9bbb-a2e0c5b4966f" }, "source": [ "\n", "k=3\n", "series=1\n", "previous_pi = 0\n", "new_pi = 10\n", "\n", "epsilon = 10**-5\n", "\n", "while abs(new_pi - previous_pi) > epsilon:\n", " \n", " previous_pi = new_pi\n", " series = series - 1/k + 1/(k+2)\n", " k+=4\n", " \n", " #estimations successives de pi\n", " new_pi = 4*series\n", " \n", " #afficher le résultat toutes les 5 itérations\n", " if (k-3)%20 == 0:\n", " #afficher le résultat sur la même ligne\n", " print(new_pi, end = ' ')\n", " \n", "\n", "print('')\n", "print(new_pi)" ], "execution_count": 39, "outputs": [ { "output_type": "stream", "text": [ "3.232315809405594 3.189184782277596 3.1738423371907505 3.1659792728432157 3.1611986129870506 3.157984995168666 3.155676462307475 3.1539378622726155 3.1525813328751204 3.1514934010709914 3.150601479819498 3.149856975293274 3.1492261301786892 3.1486847629938386 3.1482150975379377 3.1478037738120017 3.147440556810415 3.147117473309498 3.1468282198062982 3.1465677471829556 3.1463319634705034 3.1461175173068994 3.1459216376375845 3.1457420133232326 3.1455767015256 3.145424057153498 3.1452826779291465 3.145151361183851 3.145029069561572 3.1449149035588526 3.144808079362397 3.1447079108290805 3.1446137947323693 3.14452519860463 3.1444416506576474 3.1443627313783775 3.144288066483858 3.1442173209855673 3.1441501941646153 3.144086415298761 3.1440257400132237 3.143967947151556 3.1439128360821247 3.1438602243710556 \n", "3.1438198223201614\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "71l9Dhjp-pdG", "colab_type": "text" }, "source": [ "# Attention à la syntaxe et à l'indentation !\n" ] }, { "cell_type": "markdown", "metadata": { "id": "LeZ8WTjddRWZ", "colab_type": "text" }, "source": [ "## Exercice: corrigez ce code" ] }, { "cell_type": "code", "metadata": { "id": "5jtjpcPqzvVD", "colab_type": "code", "colab": {} }, "source": [ "prix = 100000\n", "mine = False\n", "\n", "while True:\n", " \n", "prix += 20000\n", "print(prix)\n", " \n", " if prix > 150000 and prix < 200000 and mine == False\n", " print(\"j'achète\")\n", " mine = True\n", " \n", " elif prix > 200000 and mine:\n", " print(\"Je \n", " revends\")\n", " mine = False\n", " \n", " break" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Nx49_9RZwiWR", "colab_type": "text" }, "source": [ "### Solution" ] }, { "cell_type": "code", "metadata": { "id": "my2OvxwTwkMW", "colab_type": "code", "colab": {} }, "source": [ "prix = 100000\n", "mine = False\n", "while True:\n", " \n", " prix += 20000\n", " print(prix)\n", " \n", " if prix > 150000 and prix < 200000 and mine == False:\n", " print(\"j'achète\")\n", " mine = True \n", " \n", " elif prix > 200000 and mine:\n", " print(\"Je revends\")\n", " mine = False\n", " \n", " break\n", " " ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KG_PPSe9e1-M", "colab_type": "text" }, "source": [ "# Récapitulatif des mots-clés et types de données de base" ] }, { "cell_type": "code", "metadata": { "id": "Y5t-fPt2e1G4", "colab_type": "code", "colab": {} }, "source": [ "#Types de base\n", "250000 #entier\n", "0.12 #float\n", "'42' ou \"42\" #string\n", "True False #booléens\n", "\n", "#Opérateurs de test\n", "is\n", "in\n", "not\n", "and\n", "or\n", "\n", "#Boucles\n", "for\n", "while\n", "\n", "#Conditions\n", "if\n", "elif\n", "else\n", "\n", "pass\t#Instruction nulle (il ne se passe rien)\n", "break #Sortie de boucle\n", "continue #On passe à l'itération suivante dans une boucle\n", "\n", "#Quelques fonctions de base\n", "print\n", "range\n", "type\n", "abs\n", "\n", "#Fonctions de conversion de type (casting)\n", "int\n", "float\n", "bool\n", "str\n", "\n" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "SnSuv8RjqwzB", "colab_type": "text" }, "source": [ "Maintenant que vous connaissez les bases du Python, vous pouvez passer au [Chapitre 2: Les collections d'objets Python](https://colab.research.google.com/github/titsitits/UNamur_Python_Analytics/blob/master/2_Collections.ipynb)" ] } ] }