Skip to content

Commit bb21132

Browse files
committed
a quick exo on a hashable and sortable class
1 parent b13be05 commit bb21132

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

notebooks/_toc.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ parts:
3939
- file: tps/queens/README-queens-nb
4040
- caption: TPs classes
4141
chapters:
42+
- glob: exos/basic/EXO-class-sort-hash-nb
4243
- glob: tps/students-grades/README*
4344
- glob: tps/auctions/README*
4445
- glob: tps/unicode-boxes/README*
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
---
2+
jupytext:
3+
text_representation:
4+
extension: .md
5+
format_name: myst
6+
kernelspec:
7+
display_name: Python 3 (ipykernel)
8+
language: python
9+
name: python3
10+
language_info:
11+
name: python
12+
nbconvert_exporter: python
13+
pygments_lexer: ipython3
14+
nbhosting:
15+
title: comptages de mots
16+
---
17+
18+
<div class="licence">
19+
<span>Licence CC BY-NC-ND</span>
20+
<span>Thierry Parmentelat &amp; Arnaud Legout</span>
21+
</div>
22+
23+
+++
24+
25+
# une classe sortable et hashable
26+
27+
28+
## hashable
29+
30+
lorsqu'on a vu les types prédéfinis, on a dit qu'on ne pouvait utiliser comme clés de dictionnaire que des éléments **non mutables**
31+
32+
en réalité, les éléments qui peuvent servir de clé dans un dictionnaire (ou être mis dans un ensemble, c'est le même critère) sont appelés des objets ***hashables***
33+
34+
et, comme pour tous les autres traits du langage, on peut assez facilement rendre une classe *hashable**
35+
36+
## sortable
37+
38+
pour trier une liste d'objets, on peut customiser l'ordre du tri en passant une fonction
39+
40+
`sorted(L, key=)`
41+
42+
**mais aussi**, il y a une autre façon
43+
si on veut trier des éléments homogènes - tous de la même classe - il suffit de définir un ordre sur les éléments de la classe
44+
45+
## notre prétexte
46+
47+
pour s'entrainer, nous allons simplement créer une classe
48+
49+
- qui modélise un élève avec un nom, un prénom, et pour faire simple une note
50+
- cette note peut évoluer au cours du temps (par ex. une moyenne générale qui change au cours du trimestre)
51+
- on suppose qu'il n'y a pas deux élèves avec le même nom **et** le même prénom
52+
- on veut pouvoir, pour écrire la classe `Classe`, créer un ensemble d'élèves
53+
- et trier cet ensemble d'élèves par moyenne générale
54+
- et pouvoir créer un dictionnaire qui a les élèves comme clés
55+
56+
```{code-cell} ipython3
57+
class Student:
58+
pass
59+
```
60+
61+
```{code-cell} ipython3
62+
class Class:
63+
64+
def __init__(self):
65+
self._students = set()
66+
def add(self, student: Student):
67+
self._students.add(student)
68+
69+
def ranked(self) -> list[Student]:
70+
return sorted(self._students)
71+
# etc..
72+
```
73+
74+
## Indices
75+
76+
* voir le cours ici
77+
https://ue12-p24-python.readthedocs.io/en/p24/4-2-dunder-specials-nb.html#classe-sortable-obj-obj2

0 commit comments

Comments
 (0)