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