# CP Python - Seance 6
## Les acquis

#### Ressources de la séance passée
- [Guide de la séance 5](https://hackmd.io/@Tb5Z2PdeRLSnkxJEsjcLXg/ryJ4doo9P)
- [Repl.it de la séance 5](https://repl.it/@GuillaumeGst/CP-Python-Seance-5)
#### Exception
* Error = event, which occurs during the execution of a program that disrupts the normal flow of the program's instructions.
* Exception = a Python object that represents an error
* In general, when a Python script encounters an error, it __raises__ an exception.
```pyth
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
```
* Il est possible de __gérer__ des exceptions avec `try...except`
```pyth
while True:
try:
x = int(input("Please enter a number: "))
break
except ValueError:
print("Oops! That was no valid number. Try again...")
```
* Il est possible de __déclencher__ soi-même des exceptions avec `raise`
```pyth
>>> raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: HiThere
```
## A préparer:
- [x] Regarder petit rappel vidéo (2 min) sur les tuples imbriqués [ICI](https://www.youtube.com/watch?v=yrt8Ylb3F5o)
```python
lst = [('LINFO1101', ['Jean', 'Pierre']), ('LINFO1110', ['Jean']),\
('LINFO1111', ['Jean']), ('LINFO1112', ['Jacques', 'Pierre']), \
('LINFO1113', ['Pierre'])]
# Comment afficher le deuxième tuple ?
# Comment afficher le dernier tuple ?
# Comment afficher seulement 'LINFO1110' ?
# Comment afficher seulement 'Jacques' ?
```
- [x] Si nécessaire, exécuter ma version de la fonction [`binary_search`](https://repl.it/@GuillaumeGst/CP-Python-Seance-5#binary_search.py) du REPL pour afficher toutes les étapes de l'algorithme.
> *Quelle est la pré-condition indispensable pour pouvoir utiliser l'algorithme `binary_search` ?*
- [x] Essayer de comprendre `plus_frequent` avec [Python Tutor Visualize](http://pythontutor.com/visualize.html#code=def%20plus_frequent%28s%29%3A%0A%20%20s.lower%28%29.strip%28%29%0A%20%20max_count%20%3D%200%0A%20%20freq%20%3D%20''%0A%20%20for%20i%20in%20s%3A%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20for%20j%20in%20s%3A%0A%20%20%20%20%20%20if%20j%20%3D%3D%20i%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D1%0A%20%20%20%20%20%20if%28count%20%3E%20max_count%29%3A%0A%20%20%20%20%20%20%20%20%20%20max_count%20%3D%20count%0A%20%20%20%20%20%20%20%20%20%20freq%20%3D%20j%0A%20%20return%20freq,%20max_count%0A%20%20%0Aplus_frequent%28%22pizza%22%29&cumulative=false&curInstr=75&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) le code suivant:
```python=
def plus_frequent(s):
s.lower().strip()
max_count = 0
freq = ''
for i in s:
count = 0
for j in s:
if j == i:
count +=1
if(count > max_count):
max_count = count
freq = j
return freq, max_count
```
- [x] Implémentez la fonction `trouver_plus_long_PIN(lst)` une variante de `trouver_doublon(lst)`
* La fonction `trouver_plus_long_PIN` permet de retrouver la personne dont le mot de passe est le plus sécurisé, parmi des mots de passe exclusivement numériques.
* Autrement dit, si la liste `pin_list = [('Kim','Mens',1232445),('Olivier','Pecheur',8349),('Aragorn','Premier Du Nom',101)]` est donnée en argument, `trouver_plus_long_PIN(pin_list)` devra retourner le string `"Kim Mens"`
* Contrainte: Veuillez ré-utiliser votre fonction `count_digits` de l'interrogation :wink:
* Post-condition: si les mots de passe ont tous la même longueur, retourner le `Prénom Nom` du premier tuple
- [ ] Implémentez la fonction suivante (niveau intermédiaire):
```python
def getMax ( filename ):
""" pre: filename est une chaîne de caractères
post:
- Renvoie le plus grand nombre réel >= 0 trouvé dans le fichier
de nom filename.
- Les lignes ne représentant pas un seul nombre réel >= 0 sont ignorées.
- Si le fichier n'existe pas ou si une erreur d'entrée/sortie survient,
la fonction renvoie la valeur -1, est imprime a message d'erreur.
- Si le fichier ne contient aucune ligne valide, renvoie
la valeur -1.
Par exemple, la méthode retourne 10.0 pour le fichier de contenu suivant:
0.345.67
hello
-543.0
500.0 1000.0 2000.0
10.0
3.1416
"""
```
> *Remarque: Comment écrire nous même le fichier de test ?*
- Essayer de résoudre Session 6: Q* Hogwarts - Quidditch (niveau difficile)
- Essayer de résoudre Session 6: Q* Sauvegarde (niveau intermédiaire/difficle)