| @@ -1,165 +1,560 @@ | |||||
| ### Introduction | |||||
| # Introduction à la programmation avec Python | |||||
| * Historique du langage: | |||||
| * création par Guido pour l'enseignement | |||||
| * Monty Python | |||||
| * le grand schisme 2/3. | |||||
| * Meilleur nul part, excellent partout | |||||
| * Utilisation de Python | |||||
| <p align="right"> | |||||
| E2L <br /> | |||||
| 24/11/2018 <br /> | |||||
| Dimitri Merejkowsky <br /> | |||||
| </p> | |||||
| * Sciences (physique, chimie ...) | |||||
| * Animation | |||||
| * Sites web | |||||
| * ... | |||||
| * Ligne de commande | |||||
| * Langage de 'glue' | |||||
| --- | |||||
| ### Le REPL | |||||
| # Plan | |||||
| * S'assurer que tous les étudiants peuvent lancer le REPL | |||||
| * Présentation et historique du langage | |||||
| * L'interpréteur interactif | |||||
| * Un jeu simple | |||||
| Notions: | |||||
| --- | |||||
| * Entiers et flottants (via maths basiques: + * - /) | |||||
| * Grouper avec des parenthèses. | |||||
| * Booléens | |||||
| * Variables | |||||
| * Fonctions: | |||||
| # Historique | |||||
| * `quit()` | |||||
| * Créé par Guido van Rossum. Conçu à la base pour l'enseignement. | |||||
| * Le nom vient des Monty Python (si, si) | |||||
| * Python 1: Sortie en 1991 | |||||
| * Python 2: en 2000 | |||||
| * Python 3: en 2008 | |||||
| ### Du code dans un fichier | |||||
| --- | |||||
| Oups, les variables disparaissent quand on ferme le REPL. | |||||
| Solution: les mettre dans un fichier `.py`. | |||||
| # Le grand schisme | |||||
| ```python | |||||
| a = 1 | |||||
| b = 2 | |||||
| La plupart des langages continuent à être compatibles d'une version à l'autre. | |||||
| c = a+b | |||||
| *Ce n'est pas le cas pour Python3*, et ça a causé beaucoup de confusion et de débats. | |||||
| print(c) | |||||
| ``` | |||||
| Heureusement, 10 ans plus tard, la situation s'est arrangée. | |||||
| S'assurer que les étudiants peuvent: | |||||
| --- | |||||
| * `cd` dans le bon répertoire | |||||
| * Lancer `python <lefichier.py`. | |||||
| # Python3 | |||||
| Notions: | |||||
| Ce cours fonctionne donc uniquement avec Python3. | |||||
| * Fonction print() | |||||
| * Commentaires | |||||
| N'utilisez *pas* Python2, sinon certaines choses expliquées ici ne marcheront pas :/ | |||||
| * Définir notre propre fonction: | |||||
| --- | |||||
| * Paramètres | |||||
| * Indentation | |||||
| * Deux-points | |||||
| * return() | |||||
| # Utilisation de Python | |||||
| ```python | |||||
| # ceci est un commentaire | |||||
| def add(a, b): | |||||
| return a + b | |||||
| * Aussi appelé "langage de script", `glue language` | |||||
| a = 1 | |||||
| b = 2 | |||||
| c = add(a, b) | |||||
| print(c) | |||||
| ``` | |||||
| * Bon partout, excellent nulle part | |||||
| * Exemples d'utilisation: | |||||
| ### Chaînes de caractères | |||||
| * Sciences (physique, chimie, linguistique ...) | |||||
| * Animation (Pixar, Disney ...) | |||||
| * Sites web (journaux, youtube, ...) | |||||
| * Ligne de commande | |||||
| * ... | |||||
| * Guillemets simple et double | |||||
| * Concaténation implicite | |||||
| * Backslash et échappement: '\n', '\r', '\t' | |||||
| * Raw string 'r' | |||||
| * Triple-guillemets | |||||
| * Parenthèses | |||||
| * Addition avec '+' | |||||
| --- | |||||
| Notions: | |||||
| * types. On peut pas ajouter un entier à une strig | |||||
| * conversion avec `str()` | |||||
| # Installation | |||||
| ```python | |||||
| message = "Le total est: " + c | |||||
| print(message) | |||||
| ``` | |||||
| --- | |||||
| * Indexation | |||||
| # L'interpréteur interactif | |||||
| ``` | |||||
| +---+---+---+---+---+---+ | |||||
| | P | y | t | h | o | n | | |||||
| +---+---+---+---+---+---+ | |||||
| 0 1 2 3 4 5 6 | |||||
| -6 -5 -4 -3 -2 -1 | |||||
| ``` | |||||
| * `len()` | |||||
| !pycon | |||||
| $ python3 | |||||
| Python 3.7.1 (default, Oct 22 2018, 10:41:28) | |||||
| [GCC 8.2.1 20180831] on linux | |||||
| Type "help", "credits" or "license" for more information. | |||||
| >>> | |||||
| ### Flot de contrôle | |||||
| --- | |||||
| * if | |||||
| * while | |||||
| * `break`, `continue` | |||||
| * `for` | |||||
| * `range()` | |||||
| * On peut aussi itérer sur les strings | |||||
| # Note | |||||
| ### Entrèe standard | |||||
| * input() | |||||
| Recopiez les entrées sur les slides dans votre propre interpréteur. | |||||
| S'il fait quelque chose que vous ne comprenez pas, prévenez moi! | |||||
| Démo: "à quel nombre je pense" | |||||
| --- | |||||
| # Entiers et maths simples | |||||
| ```python | |||||
| secret = 42 | |||||
| !pycon | |||||
| >>> 1 | |||||
| 1 | |||||
| >>> 2 | |||||
| 2 | |||||
| >>> 1 + 2 | |||||
| 3 | |||||
| >>> 2 * 3 | |||||
| 6 | |||||
| print("Devine le nombre auquel je pense"): | |||||
| while True: | |||||
| reponse = input() | |||||
| if response > secret: | |||||
| print("Trop grand") | |||||
| if response < secret: | |||||
| print("Trop petit") | |||||
| print("Gagné") | |||||
| break | |||||
| ``` | |||||
| --- | |||||
| Notions: | |||||
| # Flottants | |||||
| * Exceptions: si la conversion échoue | |||||
| C'est le `.` qui fait le flottant | |||||
| ```python | |||||
| import random | |||||
| !pycon | |||||
| >>> 0.5 | |||||
| 0.5 | |||||
| >>> 0.5 + 0.2 | |||||
| 0.7 | |||||
| >>> 10 / 3 | |||||
| 3.3333333333333335 | |||||
| secret = random.randint(0, 100) | |||||
| ``` | |||||
| *Note: les flottants sont imprécis* | |||||
| ---- | |||||
| Notions: | |||||
| # Division entières et modulo | |||||
| * imports | |||||
| * accès à un membre avec `.` | |||||
| !pycon | |||||
| >>> 14 // 3 | |||||
| 4 | |||||
| >>> 14 % 3 | |||||
| 2 | |||||
| *Le `%` n'a rien à voir avec un pourcentage!* | |||||
| Des liens: | |||||
| --- | |||||
| * La doc officielle (récemment traduite en français): | |||||
| https://docs.python.org/fr/3/tutorial/index.html | |||||
| # Priorité des opérations | |||||
| * sametmax: http://sametmax.com/cours-et-tutos/. Note: ça y parle aussi de | |||||
| cul, donc pas à mettre entre toutes les mains ;-) | |||||
| !pycon | |||||
| >>> 1 + 2 * 3 | |||||
| 7 | |||||
| >>> (1 + 2) * 3 | |||||
| 9 | |||||
| * Fin! | |||||
| *Les parenthèses permettent de grouper les expressions* | |||||
| --- | |||||
| # Variables | |||||
| !pycon | |||||
| >>> a = 2 | |||||
| >>> a | |||||
| 2 | |||||
| >>> b = 3 | |||||
| >>> a + b | |||||
| 5 | |||||
| * On peut nommer des valeurs | |||||
| * On peut afficher la valeur d'une variable entrant son nom dans le REPL | |||||
| --- | |||||
| # Variables (2) | |||||
| !pycon | |||||
| >>> a = 2 | |||||
| >>> a | |||||
| 2 | |||||
| >>> a = 3 | |||||
| >>> a | |||||
| 3 | |||||
| * On peut changer la valeur d'une variable (d'où son nom) | |||||
| --- | |||||
| # Les chaînes de caractères | |||||
| Aussi appelées "string". | |||||
| Avec des simple quotes (`'`) | |||||
| !pycon | |||||
| >>> 'Bonjour monde!' | |||||
| 'Bonjour monde' | |||||
| Marche aussi avec des double quotes (`"`) | |||||
| !pycon | |||||
| >>> "Bonjour, monde!" | |||||
| 'Bonjour monde' | |||||
| --- | |||||
| # Double et simple quotes | |||||
| On peut mettre des simples quotes dans des double quotes et vice-versa. | |||||
| !pycon | |||||
| >>> "Il a dit: 'bonjour' ce matin." | |||||
| "Il a dit: 'bonjour' ce matin." | |||||
| >>> 'Il a dit: "bonjour" ce matin' | |||||
| 'Il a dit: "bonjour" ce matin!' | |||||
| --- | |||||
| # Échappement | |||||
| Avec la barre oblique inversée "backslash" | |||||
| !pycon | |||||
| >>> 'Il a dit: "bonjour". C\'est sympa!' | |||||
| 'Il a dit: "bonjour". C\'est sympa!' | |||||
| --- | |||||
| # Concaténation | |||||
| !pycon | |||||
| >>> name = "John" | |||||
| >>> message = "Bonjour " + name + " !" | |||||
| >>> message | |||||
| "Bonjour John !" | |||||
| --- | |||||
| # Types | |||||
| !pycon | |||||
| >>> a = 42 | |||||
| >>> message = "La réponse est: " + a | |||||
| TypeError: can only concatenate str (not "int") to str | |||||
| On ne mélange pas les torchons et les serviettes! | |||||
| --- | |||||
| # Conversions | |||||
| !python | |||||
| # Entier vers string | |||||
| >>> a = 42 | |||||
| >>> message = "La réponse est: " + str(a) | |||||
| >>> message | |||||
| 'La réponse est 42' | |||||
| # String vers entier | |||||
| >>> answer = int("42") | |||||
| >>> answer | |||||
| 42 | |||||
| Notez les parenthèses autour des valeurs. | |||||
| --- | |||||
| # Booléens | |||||
| True et False | |||||
| En Python, elle sont en majuscules! | |||||
| --- | |||||
| # Assignation | |||||
| On peut assigner des variables aux valeurs True et False | |||||
| !pycon | |||||
| >>> la_terre_est_plate = False | |||||
| ... | |||||
| >>> python_c_est_genial = True | |||||
| --- | |||||
| # Comparaisons | |||||
| !pycon | |||||
| >>> a = 2 | |||||
| >>> b = 3 | |||||
| >>> a > b | |||||
| False | |||||
| >>> 2 + 2 == 4 | |||||
| True | |||||
| Note: `==` pour la comparaison, `=` pour l'assignation | |||||
| --- | |||||
| # Comparaisons (2) | |||||
| !pycon | |||||
| >>> a = 2 | |||||
| >>> b = 3 | |||||
| >>> a != b | |||||
| True | |||||
| >>> 2 + 2 >= 4 | |||||
| True | |||||
| --- | |||||
| # Non persistance | |||||
| !pycon | |||||
| >>> a = 2 | |||||
| >>> quit() | |||||
| <span /> | |||||
| !pycon | |||||
| >>> a | |||||
| Traceback (most recent call last): | |||||
| File "<stdin>", line 1, in <module> | |||||
| NameError: name 'a' is not defined | |||||
| *Notre premier message d'erreur !* | |||||
| --- | |||||
| # Du code dans un fichier | |||||
| Aussi appelé: "code source", ou "source". | |||||
| L'essence du logiciel libre :) | |||||
| --- | |||||
| # Installation d'un éditeur de texte simple | |||||
| * Linux; `gedit`, `kate`, ... | |||||
| * macOS: `CotEditor` | |||||
| * Windows: `Notepad++` | |||||
| J'insiste sur **simple**. Inutile d'installer un IDE pour le moment. | |||||
| --- | |||||
| # Configuration | |||||
| * Police de caractères à chasse fixe | |||||
| * Indentation de *4 espaces* | |||||
| * Remplacer tabulation par des espaces | |||||
| * Activer la coloration syntaxique | |||||
| --- | |||||
| # Notre premier fichier source | |||||
| Insérez le code suivant dans votre éditeur de texte | |||||
| !python | |||||
| # Affiche un message | |||||
| print("Bonjour, monde") | |||||
| Sauvegardez dans un fichier `bonjour.py` dans `Documents/e2l/python` par exemple | |||||
| --- | |||||
| # Lancer du code en ligne de commande | |||||
| !console | |||||
| $ cd Documents/e2l/python/ | |||||
| $ python3 bonjour.py | |||||
| Bonjour, monde | |||||
| * Les lignes commençant par dièse (`#`) ont été ignorées | |||||
| * `print()` affiche la valeur, comme dans le REPL. | |||||
| --- | |||||
| # Note importante (1) | |||||
| Vous avez juste besoin: | |||||
| * d'un éditeur de texte | |||||
| * de Python3 installé | |||||
| * d'une ligne de commande | |||||
| Pas la peine d'installer quoique ce soit de plus pour le moment | |||||
| --- | |||||
| # Note importante (2) | |||||
| À partir de maintenant, vous devez suivre ce cycle: | |||||
| 1. *Recopiez* le code affiché dans votre éditeur, à la suite du code | |||||
| déjà écrit | |||||
| 2. Lancez le code depuis la ligne de commande | |||||
| 3. Réparez les erreurs éventuelles | |||||
| 4. Recommencez | |||||
| --- | |||||
| # Note importante (3) | |||||
| C'est le meilleur moyen d'apprendre. Si vous restez passifs vous retiendrez beaucoup moins de choses et ne pourrez pas coder par vous-même. | |||||
| Profitez qu'on soit là pour vous aider si vous avez des erreurs que vous ne comprenez pas! | |||||
| --- | |||||
| # Flot de contrôle | |||||
| L'essence de la programmation! | |||||
| --- | |||||
| # while | |||||
| Répéter tant qu'une condition est vraie | |||||
| !python | |||||
| print("Bonjour, monde") | |||||
| while True: | |||||
| print("spam!") | |||||
| Notes: | |||||
| * deux points à la fin de la ligne | |||||
| * indentation après les deux points | |||||
| --- | |||||
| # Notre première boucle infinie | |||||
| !bash | |||||
| > python bonjour.py | |||||
| Bonjour, monde | |||||
| spam! | |||||
| spam! | |||||
| spam! | |||||
| .... | |||||
| CTRL-C pour interrompre | |||||
| --- | |||||
| # Conditions | |||||
| !python | |||||
| a = 3 | |||||
| b = 4 | |||||
| if a == b: | |||||
| print("a et b sont égaux") | |||||
| else: | |||||
| print("a et be sont différents") | |||||
| Rappel: | |||||
| * deux points à la fin de la ligne | |||||
| * indentation après les deux points | |||||
| --- | |||||
| # Combiner while et if | |||||
| Interrompt la boucle quand une condition devient vraie: | |||||
| !python | |||||
| i = 0 | |||||
| while True: | |||||
| i = i + 1 | |||||
| if i > 3: | |||||
| print("i est plus grand que 3, on arrête") | |||||
| break | |||||
| print("i =" + str(i)) | |||||
| print("i est plus petit que 3, on continue") | |||||
| <pre> | |||||
| i = 1 | |||||
| i est plus petit que 3, on continue | |||||
| i = 2 | |||||
| i est plus petit que 3, on continue | |||||
| i = 3 | |||||
| i est plus petit que 3, on continue | |||||
| i est plus grand que 3, on arrête | |||||
| </pre> | |||||
| --- | |||||
| # Lire une entrée utilisateur | |||||
| * `input()` (encore des parenthèses ...) | |||||
| * interrompt le script | |||||
| * lit ce que l'utilisateur tape jusqu'à ce qu'il tape "entrée". | |||||
| * renvoie une string | |||||
| --- | |||||
| # Devine nombre | |||||
| --- | |||||
| # Le code | |||||
| !python | |||||
| secret = 42 | |||||
| print("Devine le nombre auquel je pense") | |||||
| while True: | |||||
| response = input() | |||||
| response = int(response) | |||||
| if response > secret: | |||||
| print("Trop grand") | |||||
| continue | |||||
| if response < secret: | |||||
| print("Trop petit") | |||||
| continue | |||||
| print("Gagné") | |||||
| break | |||||
| --- | |||||
| À vous de jouer! | |||||
| --- | |||||
| # Éviter de hard-coder le secret | |||||
| Le secret a une valeur prédéfinie, et il faut changer le code source | |||||
| pour changer le secret, pas glop. | |||||
| Solution: le choisir au hasard | |||||
| --- | |||||
| # Un secret au hasard | |||||
| Remplacez le première ligne pour avoir: | |||||
| !python | |||||
| import random | |||||
| secret = random.randint(0, 100) | |||||
| Le jeu devient tout de suite plus amusant :) | |||||