Jupyter notebook Sujets/Semaine 1 - Le point sur les types Python/Le point sur les types Python.ipynb
Le point sur les types en Python
Ces exercices ont pour but de vous faire réfléchir à la façon de modéliser un problème à l'aide des types Python (listes, dictionnaires, etc.).
Exercice : Compter les mots et les caractères (tiré du TP 10 d’AP1).
On souhaite faire des statistiques sur l’usage des caractères (lettres) ainsi que des différents mots dans un long texte, en comptant le nombre d’occurrences de chaque lettre ou de chaque mot.
Structures de données
Pour commencer, on cherche à compter seulement le nombre d’occurrences de chaque caractère. En supposant que le texte contient uniquement des caractères ASCII (facilement représentables par un entier compris entre 32 et 126), proposer une structure la plus simple possible pour stocker le nombre d’occurrences de chaque caractère. Utilisez le code du caractère comme indice.
les mots clé (keywords) vont être la lettre et la valeur vas être le nombre d'occurence : exemple dico[a] = 2 la lettre apparait 2 fois
Que se passe-t-il si le texte n’est pas codé en ASCII mais en UTF-8 (qui peut représenter en théorie jusqu’à 1112064 symboles différents, même si tous ne sont pas utilisés) ? Adaptez la structure de donnée en conséquence. Utilisez le caractère comme clef d'accès.
On s’intéresse maintenant au comptage des mots du texte. Discutez les deux choix de structure utilisés pour les lettres, et indiquez pourquoi l’un de ces deux choix n’est pas adapté du tout. On défini un mot comme une suite de caractères non transparants/espace.
Décrivez rapidement un algorithme permettant de calculer la fréquence d’apparition de chaque mot dans le texte.
remplacer ce texte
Implémentation
Dans les questions qui suivents, nous allons réellement implémenter l'ensemble des structures de données, fonctions et algorithmes décrits ci-dessus.
Écrivez une fonction
compte_caracteresqui prend en argument une chaîne de caractères et un dictionnaire, insère dans le dictionnaire le nombre d'occurrences de chaque caractère dans la chaîne, et renvoie le nombre total de caractères dans la chaîne.
Écrivez une fonction
compte_motsqui prend en argument une chaîne de caractères et un dictionnaire comme paramètres et qui insère dans le dictionnaire le nombre d'occurrences de chaque mot de la chaîne. La fonction renverra le nombre total de mots dans cette chaîne.
Manipulation de fichiers
Écrivez une fonction qui prend un nom de fichier en argument et qui compte et renvoie le nombre total de lignes, de mots et de caractères dans le fichier.
Modifiez la fonction précédente pour qu'elle compte et renvoie aussi le nombre d'occurrences de chaque mot et de chaque caractère.
Écrivez une fonction qui prend un nom de fichier en paramètre et écrit les statistiques calculées par la fonction précédente dans un fichier portant le même nom suffixé par
.stats. Par exemple, appelée sur un fichierhernani.txt, la fonction créera le fichierhernani.txt.stats(en TP, ce fichier est fourni dans le répertoire de la semaine 1).
☆ Modifiez le programme pour ignorer la ponctuation.
☆ Modifiez le programme pour ignorer les didascalies et les noms de personnages.
☆ Modifiez le programme pour afficher le comptage des mots et des caractères par nombre d'occurrences décroissant. Indice : utilisez la fonction prédéfinie
sorted.
Exercice : Polygones.
On souhaite créer une petite application graphique permettant de dessiner des polygones. Avant de se lancer dans la réalisation de l'interface, on souhaite écrire quelques fonctions permettant de manipuler les polygones.
Proposez une structure Python permettant de représenter un polygone.
Donnez une expression permettant d’accéder à l’abscisse du premier point d’un polygone.
Écrivez une fonction calculant le périmètre d’un polygone.
Une fois un premier polygone dessiné, il est tentant d’en dessiner un deuxième. Mais si l’on se trompe ? Décrivez une structure Python permettant de supprimer le dernier polygone créé, puis le polygone précédent, etc.
Quelles sont les actions nécessaires pour maintenir cette structure, et à quel moment sont-elles effectuées ?
Pour aller plus loin : écrivez dans un programme python séparé (pas dans ce notebook) et à l'aide de la bibliothèque
upemtkune interface graphique permettant de dessiner des polygones à l'aide de la souris. Chaque clic gauche insère un nouveau point, et un clic droit referme le polygone en reliant le premier et le dernier point désignés. Par exemple, trois clics gauches suivi d’un clic droit dessinent un triangle. Un clic droit non précédé d'un clic gauche supprimera le dernier polygone créé.
Exercice : Les lapins, ça va et ça vient.
Comme tout le monde le sait, dans la société des lapins on trouve plusieurs grandes familles. Il y a par exemple les familles Rabbit, Bunny, Lapin, etc. Chaque famille est composée d’un ou plusieurs membres, identifiés par leur prénom. Par exemple, Roger et Jacob sont dans la famille Rabbit, Jeannot dans la famille Lapin. Une famille peut contenir plusieurs individus portant le même prénom. On ne connaît pas l’âge exact de chaque membre d’une famille, mais on sait malgré tout dire qui est né avant ou après qui. Les familles voient de nombreuses naissances, mais parfois certain lapins disparaissent du fait de leur âge ou dans de tragiques accidents de cuisine.
Proposez un exemple de structure Python permettant de rassembler (au moins) toutes les données décrites ci-dessus.
Donnez une expression valant
Truesi un membre de la famille Bunny s’appelle Bugs.
Donnez une instruction permettant de déclarer la naissance dans la famille Lapin d’un nouveau-né appelé Jeannette.
Écrivez une fonction permettant de déterminer la famille la plus nombreuse.
Écrivez une fonction permettant de déclarer le décès du plus vieux lapin de la famille passée en argument. Attention, si le dernier lapin d’une famille décède, la famille disparaît.
Quelle modification pouvez-vous proposer pour modéliser le fait que deux lapins de la même famille ne peuvent porter le même prénom ?
Quelle modification pouvez-vous proposer pour intégrer au modèle l’âge exact de chaque lapin ? Cette modification fonctionne-t-elle si plusieurs lapins de la même famille portent le même prénom ? Comment faire alors ?
Exercice : Les bons comptes font les bons amis.
Guildenstern s’est mis en tête de tenir les comptes de son groupe d’amis. Ce sont tous des têtes en l’air qui, oubliant régulièrement leur bourse à la maison, se font offrir le sandwich grec en disant « Ouais ouais, je te rembourse quand on sera rentrés à Elseneur. » Par conséquent, ils ont tous de petites dettes les uns envers les autres, et il devient difficile de se rappeler qui doit combien à qui.
Proposez une structure Python permettant de rassembler toutes les données nécessaires. Vous devez définir un objet
comptespermettant de représenter les dettes des uns et des autres (inventez un exemple contenant au moins Rosencrantz et Guildenstern).
Donnez une expression valant
Truesi Rosencrantz doit quelque chose à Guildenstern.
Donnez une expression permettant de savoir combien Rosencrantz doit à Guildenstern (en supposant éventuellement que cette expression vaut 0 s’il ne lui doit rien).
Comme tout le monde est étourdi, deux personnes se doivent parfois mutuellement de l’argent. Par exemple, si Guildenstern doit € à Rosencrantz et Rosencrantz doit € à Guildenstern (avec ), on peut effacer la dette de Rosencrantz et ramener celle de Guildenstern à €.
Écrivez une fonction prenant les arguments nécessaires et simplifiant les dettes partout où cela est possible. (Il est conseillé d’écrire des fonctions intermédiaires.)
Pour aller plus loin : écrivez un programme complet de gestion de dettes entre amis en vous inspirant des questions précédentes.