<style>
.sol{
color:green;
}
</style>
# CP Python: Séance 9
### 1. Repartir de ce [nouveau REPL](https://repl.it/join/sqscldet-guillaumegst) et terminer la QBF liée aux dictionnaires dans le fichier `qbf7.py`
* Autrement dit, implémentez la fonction `topk_words(words,k)` en appelant les deux fonctions fonctions auxiliaires `topk(tuples,k)` __ET__ `counts(workds)` déjà définies dans le REPL.
* Notez que dans ce cas-ci, je vous ai fourni deux implémentations de `topk(tuples,k)`, choisissez celle que vous préférez.
* Assurez-vous que les tests fonctionnent dans le fichier `main.py`.
### 2. Classes et objets
- [x] Regarder cette vidéo YouTube: https://youtu.be/apACNr7DC_s
- [x] Lire [1 - Classes and objects - Basics
](https://syllabus-interactif.info.ucl.ac.be/syllabus/info1-theory/PART_III/classes_and_objects_I)
- [x] Lire [2 - Classes and objects - Advanced](https://syllabus-interactif.info.ucl.ac.be/syllabus/info1-theory/PART_III/classes_and_objects_II)
- [ ] Etre capable de refaire TOUS les exercices de la [phase de démarrage](https://syllabus-interactif.info.ucl.ac.be/syllabus/info1-exercises/PART_III/MISSION_8/preparation). Je vous interrogerai sur des exercices choisis sur le moment.
__NB__ N'hésitez pas à repartir du fichier `objets.py` dans le REPL pour modifier/expérimenter les classes `Pair` et `Student`. De même, *Python Tutor Visualize* peut vous être utile pour représenter graphiquement les objets.
### 3. Envoyez-moi l'examen blanc que vous avez reçu
### Exercices choisis
---
#### Exercices 1 & 2: Définitions et interprétation Python [10min]
```python=
class Student :
def __init__(self,n) :
"""
Initialise un nouvel objet de type Student avec un nom n donné.
@pre: -
@post: Un objet de type Student a été créé avec comme 'name' n,
et un score None pour chacun des trois tests 'test1', 'test2' et 'test3'
"""
# nom de l'étudiant
self.name = n
# score reçu par l'étudiant sur trois tests
# (initialement None car l'étudiant n'a pas encore passé les tests)
self.test1 = None
self.test2 = None
self.test3 = None
def average_score(self) :
""""
Calcul du score moyen que l'étudiant a obtenu sur les 3 tests.
@pre: les variables d'instance test1, test2 et test3
contiennent des valeurs de type int
@post: retourne la valeur moyenne de ces trois valeurs
"""
return (self.test1 + self.test2 + self.test3) / 3
```
Les instructions suivant donnent un exemple de comment cette classe peut être utilisé:
```python=
student = Student("Kim")
student.test1 = 14.0
student.test2 = 10.5
student.test3 = 12.0
print("Bonjour, " + student.name + ". Vos scores sont:")
print(student.test1)
print(student.test2)
print(student.test3)
print("Votre score moyenne est " + str(student.average_score()))
student2 = student
print("Votre score moyenne est " + str(student2.average_score()))
student = None
student2 = None
```
---
**Classe, objet (ou instance)**
?
**Constructeur et méthode d'initialisation**
?
**Attribut (ou variable d'instance)**
?
**Méthode d'instance**
?
**Référence à un objet et la valeur None**
?
**Référence à self**
?
---
> *A représenter graphiquement: état de `student` L1, L4, L13. Hint:*
> 
__`student.name`__
?
__`student.average_score()`__
?
__`self.name`__
?
---
#### Exercice 4: Une classe simple [20m]
```python=
class Pair:
"""
Une paire d'entiers
"""
def __init__(self, x=None, y=None):
"""
@pre -
@post crée une paire (a,b) composée de x et y,
ou une paire non-initialisée si aucune valeur
de x et de y n'est donné lors de l'appel au constructeur
"""
self.a = x # le premier élément de la paire
self.b = y # le second élément de la paire
def __str__(self):
return str(self.a) + ", " + str(self.b)
```
Considérons le code Python ci-dessous illustrant une utilisation de la classe Pair:
```python=
p0 = Pair() ##1##
p1 = Pair(0,0) ##2##
p2 = Pair(1,1) ##3##
p0.b = 3 ##4##
p1.a = 10 ##5##
p2.a = p1.a ##6##
p2 = p1
```
Expliquez les opérations effectuées par chacune de ces lignes. Pensez à utiliser une représentation graphique des différents objets telle que celle utilisée dans le syllabus ou les transparents en indiquant les valeurs des différentes variables d'instance.
> A représenter graphiquement: les états des instances de Pair. Hint:
> <img src="https://i.imgur.com/Y9nWTnD.png" width=600>
---
#### Exercice 7: Egalité [10m] + à préparer
Considérez les instructions suivantes qui utilisent la classe Pair vue précédemment:
```python=
p1 = Pair(9, 42)
p2 = Pair(9, 42)
if (p1 == p2):
print("Egaux en 1") ##1##
p2 = p1
if (p1 == p2):
print("Egaux en 2") ##2##
```
Lesquelles des lignes ##1## et/ou ##2## produiront-elles un message?
Ajoutez une méthode `__eq__(self, p)` à la classe Pair qui compare la valeur de deux paires, de manière à ce que p1 == p2 retournera True à la ligne ##1##. Pensez à gérer également le cas où p == None.
```python=
class Pair:
def __init__(self, x, y):
self.a = x
self.b = y
def __eq__ (self, p):
"""
@pre -
@post Retourne true si la paire p est égale à l'objet.
Retourne false sinon
"""
# À implémenter
```
---