|
|
@@ -334,4 +334,178 @@ def main(): |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
\center \huge Compléments |
|
|
|
\center \huge Compléments - tris |
|
|
|
|
|
|
|
|
|
|
|
# sort() - ordre naturel |
|
|
|
|
|
|
|
```python |
|
|
|
>>> nombres = [2, 3, 1, 5] |
|
|
|
>>> nombres.sort() |
|
|
|
>>> nombres |
|
|
|
[1, 2, 3, 5] |
|
|
|
``` |
|
|
|
|
|
|
|
Notez que la liste est modifiée *sur place*. |
|
|
|
|
|
|
|
# sort() - ordre alphabétique |
|
|
|
|
|
|
|
```python |
|
|
|
>>> mots = ["abeille", "faucon", "chat"] |
|
|
|
>>> mots.sort() |
|
|
|
>>> mots |
|
|
|
['abeille', 'chat', 'faucon'] |
|
|
|
``` |
|
|
|
|
|
|
|
# sort() - ordre lexicographique |
|
|
|
|
|
|
|
Pour chaque "liste-élément" on compare le premier élément. |
|
|
|
S'il y a égalité, on regarde le deuxième élément, etc: |
|
|
|
|
|
|
|
```python |
|
|
|
>>> composite = [["chat", 1], ["abeille", 2], ["chat", 3]] |
|
|
|
>>> composite.sort() |
|
|
|
>>> composite |
|
|
|
[['abeille', 2], ['chat', 1], ['chat', 3]] |
|
|
|
``` |
|
|
|
|
|
|
|
L'ordre alphabétique est l'ordre lexicographique pour les chaînes de caractères :) |
|
|
|
|
|
|
|
# Attention! |
|
|
|
|
|
|
|
Tous les éléments de la liste doivent être comparables deux à deux: |
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
|
|
```python |
|
|
|
>>> mauvaise_liste = ["un", 2] |
|
|
|
>>> mauvaise_liste.sort() |
|
|
|
TypeError |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# Comparer autrement |
|
|
|
|
|
|
|
Exemple: trier les mots par leur taille avec l'argument `key` |
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
|
|
```python |
|
|
|
def taille(mot): |
|
|
|
return len(mot) |
|
|
|
|
|
|
|
mots = ["chat", "abeille", "faucon"] |
|
|
|
mots.sort(key=taille) |
|
|
|
>>> mots |
|
|
|
["chat", "faucon", "abeille"] |
|
|
|
``` |
|
|
|
|
|
|
|
# Lambda |
|
|
|
|
|
|
|
Sert définir une fonction sans utiliser `def` |
|
|
|
|
|
|
|
```python |
|
|
|
>>> retourne_42 = lambda: 42 # pas d'argument |
|
|
|
>>> retourne_42() |
|
|
|
42 |
|
|
|
>>> ajoute_deux = lambda x: x + 2 # un seul argument |
|
|
|
>>> ajoute_deux(3) |
|
|
|
5 |
|
|
|
>>> multiplie = lambda x, y: x* y # deux arguments |
|
|
|
>>> multiplie(2, 3) |
|
|
|
6 |
|
|
|
``` |
|
|
|
Note: le corps de la fonction doit tenir en une seule ligne |
|
|
|
|
|
|
|
# Utilisation avec sort |
|
|
|
|
|
|
|
```python |
|
|
|
>>> mots = ["chat", "abeille", "faucon"] |
|
|
|
>>> mots.sort(key=lambda x: len(x)) |
|
|
|
>>> mots |
|
|
|
["chat", "faucon", "abeille"] |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# sorted() |
|
|
|
|
|
|
|
```python |
|
|
|
b = a.copy() |
|
|
|
b.sort() |
|
|
|
|
|
|
|
# or |
|
|
|
b = sorted(a) |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
\center \huge Compléments - fichiers |
|
|
|
|
|
|
|
|
|
|
|
# Rappel: lire |
|
|
|
|
|
|
|
```python |
|
|
|
file = open("toto.txt", "r") # 'r' comme 'read' |
|
|
|
contenu = file.read() |
|
|
|
file.close() |
|
|
|
``` |
|
|
|
|
|
|
|
Note: le fichier `toto.txt` doit exister! |
|
|
|
|
|
|
|
# Écrire |
|
|
|
|
|
|
|
On peut écrire tout le contenu d'un coup: |
|
|
|
|
|
|
|
```python |
|
|
|
contenu = "du texte à sauvegarder" |
|
|
|
file = open("article.txt", "w") # 'w' comme 'write' |
|
|
|
file.write(contenu) |
|
|
|
file.close() |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
* Le fichier `article.txt` sera écrasé s'il existe déjà. |
|
|
|
* N'oubliez surtout pas d'appeler `close()` |
|
|
|
|
|
|
|
# Que faire en cas d'erreur ? |
|
|
|
|
|
|
|
```python |
|
|
|
file = open("article.txt", "w") # 'w' comme 'write' |
|
|
|
# ... beacoup de code ici |
|
|
|
# ... < une erreur |
|
|
|
file.close() |
|
|
|
``` |
|
|
|
|
|
|
|
S'il y a une erreur entre `open()` et `close()`, le fichier ne sera pas fermé! |
|
|
|
|
|
|
|
|
|
|
|
# Le mot-clé with |
|
|
|
|
|
|
|
```python |
|
|
|
with open("toto.txt", "w") as file: |
|
|
|
file.write("du texte") |
|
|
|
``` |
|
|
|
|
|
|
|
Quand on sort du bloc `with` on a la garantie que `file.close()` sera appelé, |
|
|
|
*même* si on sort du bloc à cause d'une erreur. |
|
|
|
|
|
|
|
# Convention |
|
|
|
|
|
|
|
Il n'y a maintenant plus aucune raison d'appeler `.close()` "à la main", |
|
|
|
donc ne le faites pas ... |
|
|
|
|
|
|
|
# Lire et écrire des lignes |
|
|
|
|
|
|
|
Très courant: |
|
|
|
|
|
|
|
```python |
|
|
|
with open("toto.txt", "r") as file: |
|
|
|
lignes = file.readlines() |
|
|
|
|
|
|
|
# faire quelque chose avec la liste de lignes |
|
|
|
|
|
|
|
with open("toto.txt", "w") as file: |
|
|
|
file.writelines(lignes) |
|
|
|
``` |
|
|
|
|
|
|
|
Pensez à fermer le premier fichier avant d'ouvrir le second. |
|
|
|
(ça marche même s'ils ont le même nom) |