@@ -1,70 +0,0 @@ | |||||
\center \huge Lire et écrire des 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) |
@@ -1,103 +0,0 @@ | |||||
% notions: sort, lambdas, sort avec une fonction key() | |||||
# Trier des listes | |||||
# 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) | |||||
``` |
@@ -3,9 +3,8 @@ Ce fichier contient diverses notes utiles à la préparation des futurs cours. | |||||
# Sujets à évoquer | # Sujets à évoquer | ||||
* short circuit in if: `if a is not None and a.b == 42` | * short circuit in if: `if a is not None and a.b == 42` | ||||
* [tris, lamdbas](fragments/sort.md) | |||||
* style: trailing white space, editor configuration | |||||
* [formatage de strings](fragments/format.md) | * [formatage de strings](fragments/format.md) | ||||
* [lecture / écriture de fichiers](fragments/sort.md) | |||||
* liste par compréhension et filtres | * liste par compréhension et filtres | ||||
* `help()`, doc en ligne (également en français) | * `help()`, doc en ligne (également en français) | ||||
@@ -6,17 +6,32 @@ def parse_scores(): | |||||
res[name] = int(score) | res[name] = int(score) | ||||
return res | return res | ||||
scores = { "joe" : 42, "jack" : 43 } | |||||
print (convert(scores)) | |||||
def print_scores(scores): | def print_scores(scores): | ||||
print("Tableau des résultats:") | print("Tableau des résultats:") | ||||
for name, score in scores.items(): | for name, score in scores.items(): | ||||
print(name, score) | print(name, score) | ||||
def register_score(scores, name, new_score): | |||||
pass | |||||
def convert(scores): | |||||
res = "" | |||||
for name, score in scores.items(): | |||||
res += name + " " + str(score) + "\n" | |||||
return res | |||||
def register_score(scores, name, new_score): | |||||
# Mise à jour des tableaux des scores | |||||
# Et écriture dans un fichier | |||||
scores[name] = new_score | |||||
with open("scores.txt", "w") as file: | |||||
file.write(convert(scores)) | |||||
def main(): | def main(): | ||||
scores = parse_scores() | scores = parse_scores() | ||||
name = input("nom: ") | name = input("nom: ") | ||||
@@ -25,4 +40,4 @@ def main(): | |||||
print_scores(scores) | print_scores(scores) | ||||
main() | |||||
main() |