---
# System prepended metadata

title: 'CP Python: Séance 9'

---

<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:*
> ![](https://i.imgur.com/yjqOJqf.png)

__`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
```



---