|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- % Programmation avec Python (Épisode 6)
- % Dimitri Merejkowsky
-
-
- #
-
- \center \huge Modules
-
- # Un fichier = un module
-
- À un fichier `mon_module.py` correspond _toujours_ un module `mon_module`.
- (La réciproque n'est pas vraie)
-
- # Code dans un module
-
- ```python
- # Dans bonjour.py
- a = 42
- ```
-
- Le module `bonjour` contient contient un *attribut* `a`
- dont la valeur est 42.
-
- # Importer un module
-
- Avec le mot-clé `import`, suivi du nom du module,
- _sans guillemets_.
-
- ```python
- $ python
- >>> import bonjour
- >>> bonjour.a
- 42
- ```
-
- # Une fonction dans un module
-
- ```python
- # toujours dans bonjour.py
- a = 42
- def dire_bonjour():
- print("Bonjour!")
- ```
-
- # Appeler une fonction depuis un module
-
- ```python
- >>> import bonjour
- >>> bonjour.dire_bonjour()
- Bonjour!
- ```
-
- **note**: différent de `python3 bonjour.py`.
-
- # Interaction - 1
-
-
- ```python
- >>> import bonjour
- >>> bonjour.dire_bonjour()
- Bonjour!
- >>> bonjour.dire_bonjour()
- Bonjour!
- ```
-
- # Interaction - 2
-
- ```python
- >>> import bonjour
- >>> bonjour.a
- 42
- >>> bonjour.a = 36
- >>> bonjour.a
- 36
- ```
-
- # Les imports ne sont faits qu'une seule fois
-
-
- ```python
- # Dans bonjour.py
- print("Je suis le module bonjour!")
- ```
-
- ```python
- >>> import bonjour
- Je suis le module bonjour!
- >>> import bonjour
- <rien>
- ```
-
- # La bibliothèque standard
-
- La bibliothèque standard est une collection de modules directement utilisables fournis à l'installation de Python.
-
- Exemple: `sys`, `random`, ...
-
- Toute la bibliothèque standard est documentée - et la traduction en Français est en cours:
-
- https://docs.python.org/fr/3/library/index.html
-
- Mettez ce lien dans vos favoris - il vous sera très utile.
-
-
- # Le module sys
-
- Le module `sys` est disponible par défaut, et contient plusieurs variables
- utiles.
-
- On va parler ici de l'une d'entre elles: `argv`.
-
- # sys.argv avec un fichier
-
- `sys.argv` est une liste de chaînes de caractères, qui
- n'est *jamais vide*, et est utile quand on lance python
- avec un fichier source:
-
- ```python
- # Dans lancez_moi.py
- import sys
-
- def main():
- print(sys.argv)
-
- main()
- ```
-
- \vfill
-
- Le premier élément est alors le nom du fichier:
-
- ```bash
- $ python3 lancez_moi.py
- ["lancez_moi.py"]
- ```
-
- # sys.argv avec un fichier - 2
-
- Si on rajoute des mots après le nom du fichier, ils apparaissent dans `sys.argv`:
-
- ```python
- # dans lancez_moi.py
- import sys
-
- def main():
- print(sys.argv)
-
- main()
- ```
-
- \vfill
-
- ```bash
- $ python3 lancez_moi.py un deux trois
- ["lancez_moi.py", "un", "deux", "trois"]
- ```
-
- # Les scripts Python
-
- Pour interagir avec l'utilisateur, on a souvent utilisé `input()`, passer par
- `sys.argv` est plus commun.
-
- Exemple:
-
- ```bash
- $ python3 faire_le_café
- $ python3 faire_le_café --sans-sucre
- ```
-
- #
-
- \center \huge QCM
-
-
- #
-
- ```python
- def dire_bonjour():
- return "Bonjour"
-
- x = dire_bonjour()
- print(x)
- ```
-
- 1. Erreur
- 2. Affiche "Bonjour"
-
- \pause
-
- Réponse: 2
-
-
- #
-
- ```python
- def dire_bonjour():
- print("Bonjour")
-
- x = dire_bonjour()
- print(x)
- ```
-
- 1. Erreur
- 2. Affiche "Bonjour"
- 3. Affiche "Bonjour" puis "None"
-
- \pause
-
- Réponse: 3 - le premier print vient de l'appel de la fonction,
- comme la fonction ne renvoie rien (pas de `return`), x vaut
- None
-
- #
-
- ```python
- def dire_bonjour():
- return "Bonjour"
-
- dire_bonjour()
- ```
-
- 1. N'affiche rien
- 2. Affiche "Bonjour"
- 3. Affiche 'None"
-
-
- \pause
-
- Réponse 1 - la fonction renvoie une valeur, mais
- on n'en fait rien.
-
-
- #
-
- ```python
- # Dans mon_module.py
- ma_variable = 42
- ```
-
- ```python
- >>> import "mon_module"
- >>> print(ma_variable)
- ```
-
- 1. Erreur
- 2. Affiche '42'
-
- \pause
-
- Réponse 1: les noms de modules ne sont pas des strings!
-
- #
-
- ```python
- # Dans mon_module.py
- ma_variable = 42
- ```
-
- ```python
- >>> import mon_module
- >>> print(ma_variable)
- ```
-
- 1. Erreur
- 2. Affiche '42'
-
- \pause
-
- Réponse 1: `ma_variable` est un *attribut* de `mon_module`, elle n'est
- pas disponible en dehors.
-
- #
-
- ```python
- # Dans mon_module.py
- ma_variable = 42
- ```
-
- ```python
- import mon_module
- mon_module.ma_variable = 43
- print(mon_module.ma_variable)
- ```
-
- 1. Erreur
- 2. Affiche '43'
-
- \pause
-
- Réponse 2: on peut lire et écrire les attributs des modules
- importés!
-
- #
-
- ```python
- # Dans mon_script.py
- print(sys.argv[0])
- ```
-
- ```bash
- $ python mon_script mon_argument
- ```
-
- 1. Erreur
- 2. Affiche 'mon_script'
-
- \pause
-
- Réponse 1: il faut donner le vrai nom du fichier!
-
- #
-
- ```python
- # Dans mon_script.py
- print(sys.argv[0])
- ```
-
- ```bash
- $ python mon_script.py mon_argument
- ```
-
- 1. Erreur
- 2. Affiche 'mon_script'
-
- \pause
-
- Réponse 1: il faut importer `sys` avant de pouvoir l'utiliser
-
- #
-
- ```python
- # Dans mon_script.py
- import sys
- print(sys.argv[0])
- ```
-
- ```bash
- $ python mon_script.py mon_argument
- ```
-
- 1. Erreur
- 2. Affiche 'mon_argument'
-
- \pause
-
- C'est un piège! `argv[0]` est le chemin du script!
-
- #
-
- ```python
- # Dans mon_script.py
- import sys
- print(sys.argv[1])
- ```
-
- ```bash
- $ python mon_script.py mon_argument
- ```
-
- 1. Erreur
- 2. Affiche 'mon_argument'
-
- \pause
-
- Réponse 2 :)
-
- #
-
- ```python
- # Dans mon_script.py
- import sys
- print(sys.argv[1])
- ```
-
- ```bash
- $ python mon_script.py
- ```
-
- 1. Erreur
- 2. Affiche 'mon_script.py'
-
- \pause
-
- Réponse 1. `argv` a une taille 1, et on accède à l'index 1.
-
- #
-
- \center \huge Atelier
-
- # Introduction
-
- Vous allez jouer le rôle successivement d'un espion Bordure, puis d'un
- espion Syldave (les noms viennent de l'univers de Tintin), et l'atelier
- comporte trois parties.
-
- # Chiffrement v1
-
- Vous devez implémenter le script suivant, nommé `chiffrer.py`.
-
- Il se lance ainsi:
-
- ```bash
- $ python chiffrer.py n MESSAGE
- ```
-
- où `n` est en entier entre 0 et 25, et `MESSAGE` une chaîne de caractères
- non accentués.
-
- L'algorithme est le suivant:
-
- * Supprimer les espaces et les signes de ponctuation du message
- * Remplacer chaque lettre par une majuscule
- * Décaler chaque lettre du message en utilisant le pas `n`.
-
- Par exemple, si le message est `BONJOUR` et le pas 2, le message
- chiffré devient `DQPLQWT`.
-
- Notez que si on décale la lettre `Y` avec un pas de 3, on doit obtenir
- `B` (il faut effectuer une rotation)
-
-
- # Chiffrement v2
-
- Pour le chiffrement version 2, il faut maintenant utiliser une *clé* `k`
- à la place de l'entier `n`.
-
- Le script devient:
-
- ```bash
- $ python chiffrer2.py k MESSAGE
- ```
-
- Pour chiffrer le message, on continue à décaler chaque lettre d'un pas,
- mais la valeur du pas n'est plus constante. À la place, elle est
- donnée par les lettres de la clé.
-
- Par exemple, avec la clé 'ACB', le pas prend les valeurs `0, 2, 1, 0, 2, 1` etc.
-
- En chiffrant `tintin` avec la clé `ACB`, on doit obtenir `TKOTKO`.
-
- # Casser le chiffrement
-
- Maintenant vous jouez le rôle d'un espion Syldave. Voici ce que vous avez
- à votre disposition:
-
- * Le script `chiffrer2.py`
- * Le message secret suivant: `IHDXUVZKRISCBNJWBXIDUWVVODUBPRFQRIRGBUR`
-
- Vous savez également que:
-
- * La clé utilisée contient 3 lettres
- * Le message parle du maréchal Plekszy-Gladz
-
- Vous devez déchiffrer le message, et obtenir la valeur de la clé.
-
- # Indications - 1
-
- Quelques indices:
-
- * La fonction `ord` permet de convertir une lettre en son code ASCII:
-
- `ord('A') = 65, ord('B') = 66, ... ,ord('Z') = 90`
-
- * La fonction `chr` permet de convertir un entier en lettre:
-
- `chr(65) = 'A', chr(66) = 'B', ..., chr(90) = 'Z'`
-
- # Indications - 2
-
- * L'opérateur `%` permet de s'assurer qu'une valeur est comprise dans un intervalle donné.
-
- `0 % 26 = 0, 1 % 26 = 1, ..., 26 % 26 = 0`
-
- `27 % 26 = 1, 28 % 26 = 2, ...`
-
- * Toutes les chaînes de caractères en Python contiennent les méthodes `is_alpha()` et `upper()`:
-
- `"a".is_alpha() = True, "!".is_alpha() = False`
-
- `"Message Important".upper() = "MESSAGE IMPORTANT"`
-
- # Conseils pour l'implémentation
-
- * Dans `chiffrer.py`, assurez-vous d'avoir une fonction `décale_lettre` prenant une lettre et un pas. Cela facilitera l'implémentation de `chiffrer2.py`.
-
- * Pour la dernière partie:
- * Pour casser le message, vous pouvez partir de `chiffrer2.py`. Il y a très peu de code à changer ...
- * Il y a $26^3$ clés possibles. Un ordinateur n'aura aucun mal à les essayer toutes une par une (ça ne fait "que" 17 000 possibilités environ)
- * Quand vous aurez déchiffré le message, vérifiez que votre clé est correcte, en essayant de le re-chiffrer avec l'algorithme v2 - vous devez retomber sur le message chiffré initial.
-
|