diff --git a/sessions/python-05.md b/sessions/python-05.md index 5cba6bc..356566e 100644 --- a/sessions/python-05.md +++ b/sessions/python-05.md @@ -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)