| @@ -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 :) | |||