UE5 : Fondamentaux du développement web frontal, niveau 2

Séance 1 : Exercices

  1. REV-1: les classes Python
  2. APP-1: découverte du package os
  3. APP-2: variables de package
  4. REF-1: afficher le nom de l'application
  5. Les classes
    1. Pas à pas sur les livres
      1. APP-3: Création d'une classe
      2. APP-4: Méthodes de classe
      3. APP-5: Attribut de classe
      4. APP-6: Comparaison d'instances
      5. APP-7: Commentaires
    2. APP-8: De l'aléatoire dans un attribut d'instance
    3. APP-9: Un système bancaire
    4. APP-10: Des statistiques
    5. APP-11: Tableau de scores
    6. APP-12: Créer des classes à la volée
    7. Des classes dynamiques
      1. APP-13: Changement de nom de classe
      2. APP-14: Héritage de classe
    8. APP-15: En voyage scolaire
    9. APP-16: Des potions magiques

Note préalable: quel que soit le type de rendu, ce qui m'intéresse est le code que vous avez écrit, et non ce qui s'affiche à votre écran. A partir de ce que vous m'envoyez (fichier, application zipée, dépôt), je le rejouerai de mon côté si besoin pour voir le résultat. N'oubliez pas de commenter votre code.

REV-1 : Les classes Python

Pour la donnée suivante représentant une personne, écrire une classe Python Personne() avec plusieurs méthodes et attributs.

{
    "annee_naissance": "1966",
    "nom" : "Dupont",
    "prenom": "Jean"
}

Pour chaque appel suivant à la classe, voici les résultats attendus. Développer ce qui est nécessaire afin d'avoir ce résultat:

Résultat attendu dans le terminal:

>> Cas 1 : Personne(data).data
>> {'annee_naissance': '1966', 'nom': 'Dupont', 'prenom': 'Jean'}
>> Cas 2 : Personne(data).etat_civil()
>> Jean Dupont
>> Cas 3 : Personne(data).age()
>> 57

Type de rendu possible :

APP-1 : Découverte du package os

A partir de la documentation de la librairie os:

Résultat attendu: En fonction des actions demandées, ce peuvent être des affichages ou des actions sur des répertoires. Par exemple, pour le premier cas Afficher le chemin du dossier courant, il faudra afficher un chemin absolu ressemblant à ce qui suit si j'exécute une commande dans le terminal de Python.exe: C:\Users\maxim\AppData\Local\Programs\Python\Python311

Type de rendu possible :

APP-2 : Variables de package

Prendre le squelette d'une application Flask. Comme tout est package, il est possible d'attribuer des variables à chaque package.

Résultat attendu:

Type de rendu possible :

REF-1 : Afficher le nom de l'application

Dans les cours suivants, nous développerons une application basée sur les données du WorldFactbook de la CIA (lien).

Résultat attendu:

Type de rendu possible :

Les classes

Pas à pas sur les livres

Prenons 2 livres:

APP-3 : Création d'une classe

Résultat attendu dans le terminal:

Le Seigneur des Anneaux J.R.R. Tolkien 1954
Harry Potter à l'école des sorciers J.K. Rowling 1997

Type de rendu possible :

APP-4 : Méthodes de classe

Résultat attendu dans le terminal:

Le Seigneur des Anneaux par J.R.R. Tolkien, publié en 1954.
Harry Potter à l'école des sorciers par J.K. Rowling, publié en 1997.

Type de rendu possible :

APP-5 : Attribut de classe

Résultat attendu dans le terminal:

2

Type de rendu possible :

APP-6 : Comparaisons d'instances

Résultat attendu dans le terminal: Pour les deux instances suivantes,

livre1 = Livre("Le Seigneur des Anneaux", "J.R.R. Tolkien", 1954)
livre2 = Livre("Le Seigneur des Anneaux", "J.R.R. Tolkien", 1954)

il faut que ça retourne:

Les livres sont identiques.

En revanche, pour les deux instances suivantes,

livre3 = Livre("Le Seigneur des Anneaux", "J.R.R. Tolkien", 1956)
livre4 = Livre("Le Seigneur des Anneaux", "J.R.R. Tolkien", 1954)

il faut que ça retourne:

Les livres sont différents.

Type de rendu possible :

APP-7 : Commentaires

Résultat attendu dans le terminal: Le code suivant

livre.ajouter_commentaire("Excellent livre!")
livre.ajouter_commentaire("J'ai adoré l'intrigue.")
livre.afficher_commentaires()

doit renvoyer

Commentaires:
Excellent livre!
J'ai adoré l'intrigue.

Type de rendu possible :

APP-8 : De l'aléatoire dans un attribut d'instance

Voici un bout de code qui permet d'afficher le nombre de fantômes répartis par couleur:

fantomes = []
for _ in range(100):
    fantomes.append(Fantome().couleur)

for coul in sorted(set([i for i in fantomes])):
   print(coul + " : " + str(fantomes.count(coul)))

Résultat attendu dans le terminal (les nombres varieront toujours):

blanc : 19
bleu : 9
noir : 18
orange : 20
rouge : 12
vert : 10
violet : 12

Type de rendu possible :

APP-9 : Un système bancaire

Une banque vient de se rendre compte que la classe la plus importante manque: Client() (des attributs d'instance sont à paramétrer, à vous de les trouver). Elle doit absolument contenir les méthodes suivantes:

Quelques aides:

Résultat attendu dans le terminal: Il y a 2 clients à la banque, définis initialement comme suit:

Dupont = Client('Dupont', 70, True)
Dupond = Client('Dupond', 70, False)

Chacune des opérations effectuées ci-dessous, et dans l'ordre, doivent renvoyer ce qui suit:

Type de rendu possible :

APP-10 : Des statistiques

Un producteur de musique a besoin, pour chacun des titres de son catalogue, de connaître, de jour en jour, le nombre de nouvelles personnes qui écoutent chaque titre.

Ceci peut être utile

Résultat attendu dans le terminal: Soit une chanson "All I Want for Christmas Is You" de M. Carey.

Le premier jour d'exploitation du titre, les personnes suivantes ont été écouté le titre: ["BéatriCe", "Michel", "bertranD", "Zoé"].

jour1_personnes =["BéatriCe", "Michel", "bertranD", "Zoé"] 
christmas_song.nouveaux(jour1_personnes)

doit renvoyer

Il y a eu 4 nouvelles personnes aujourd'hui qui ont découvert le titre All I Want for Christmas Is You de M. Carey

Le deuxième jour, les personnes suivantes ont été écouté le titre: ["béatrice", "Agathe", "Bertrand", "Micheline", "marin"].

jour2_personnes =["béatrice", "Agathe", "Bertrand", "Micheline", "marin"] 
christmas_song.nouveaux(jour2_personnes)

doit renvoyer

Il y a eu 3 nouvelles personnes aujourd'hui qui ont découvert le titre All I Want for Christmas Is You de M. Carey

Type de rendu possible :

APP-11 : Tableau de scores

A la foire, il y a un chambouletout. Chaque couleur de brique vaut les points suivants:

Le but sera de trouver le vainqueur parmi tous les joueurs suivants:

[
  {nom: "Jean", rouge: 1 , bleu: 2, vert: 2},
  {name: "Jacques" , rouge: 1 , bleu: 2, vert: 3},
  {name: "Zoé" , rouge: 1 , bleu: 1, vert: 2, noir:1}
]

Résultat attendu dans le terminal:

Avec le code suivant,

liste_resultats = [
  {"nom": "Jean", "rouge": 1 , "bleu": 2, "vert": 2},
  {"nom": "Jacques" , "rouge": 1 , "bleu": 2, "vert": 3},
  {"nom": "Zoé" , "rouge": 1 , "bleu": 1, "vert": 2, "noir":1}
]
print("Et le gagnant est ... " + str(get_winner(liste_resultats)[0]["nom"])+ " avec "+str(get_winner(liste_resultats)[0]["score"])+" points!")

, obtenir

Et le gagnant est ... Zoé avec 25 points!

Type de rendu possible :

APP-12 : Créer des classes à la volée

Ecrire des classes et déclarer leurs attributs peut être long et fastidieux quand on veut des classes simples. Par exemple, on écrirait:

class Animal:
    def __init__(self, nom, espece, age, sante, masse, couleur):
        self.nom = namnome
        self.espece = espece
        self.age = age
        self.sante = sante
        self.masse = masse
        self.couleur = couleur

Résultat attendu dans le terminal:

Voici deux classes Animal et Maison créées à la volée, et dont a un instancier un ou plusieurs objets à chaque fois:

Animal = make_class("nom", "espece", "age", "sante", "masse", "couleur")
print(Animal)
print(type(Animal))
un_animal = Animal("Brebis", "inconnue", 3, "excellente", 30, "blanc")
print(un_animal.couleur)

Maison = make_class("superficie", "pieces","ville")
print(Maison)
print(type(Maison))
une_maison = Maison(70, 4, "Paris")
print(une_maison.superficie)
une_deuxieme_maison = Maison(30, 2, "Marseille")
print(une_deuxieme_maison.superficie)

Le retour sera:

<class '__main__.make_class.<locals>.MaClass'>
blanc
<class '__main__.make_class.<locals>.MaClass'>
70
30

Type de rendu possible :

Des classes dynamiques

APP-13 : Changement de nom de classe

Jacques a développer une fantastique classe SuperClasse. Mais son camarade n'apprécie ce nom de classe et veut à tout prix changer son nom en CetteSuperClasse. Jacques se rend compte que changer le nom dans tous ses scripts Python va être très long, et que son camarade risque de lui demander ça d'autres fois.

Le mieux est donc de créer une fonction qui change le nom d'une classe donnée (les nouveaux noms ne doivent comporter que des lettres peu importe la casse, mais en commençant toujours par une majuscule).

Résultat attendu dans le terminal:

En lançant ces quelques lignes,

un_joueur = Joueur("Harry")
print(un_joueur.__repr__)
change_nom_classe(Joueur, "SuperJoueur")
print(un_joueur.__repr__)

, le terminal doit renvoyer:

<method-wrapper '__repr__' of Joueur object at 0x0000022256F84D90>
<method-wrapper '__repr__' of SuperJoueur object at 0x0000022256F84D90>

Type de rendu possible :

APP-14 : Héritage de classe

Le camarade dit à Jacques que sa fonction est vraiment super, mais il lui demande si ce ne serait pas possible de cacher cette fonction dans les classes elles-mêmes. Jacques se souvient qu'il a entendu parler de l'héritage de classe, et se dit que ce serait sûrement le bon moment de le faire!

Résultat attendu dans le terminal:

En lançant ces quelques lignes,

un_joueur = Joueur("Harry")
print(str(un_joueur))
un_joueur.change_nom_classe(Joueur, "SuperJoueur")
print(str(un_joueur))

, le terminal doit renvoyer:

Le nom de la classe est : Joueur
Le nom de la classe est : SuperJoueur

Type de rendu possible :

APP-15 : En voyage scolaire

La professeure qui emmène ses étudiants en voyage gère leur argent de poche. Pour lui faciliter la vie dans les comptes des étudiants, elle a besoin de savoir lequel d'entre eux a le plus d'argent.

Résultat attendu dans le terminal:

En lançant ces quelques lignes,

andy = Etudiant("Andy", 0, 0, 2)          
stephen = Etudiant("Stephen", 0, 4, 0)    
eric = Etudiant("Eric", 8, 1, 0)          
david = Etudiant("David", 2, 0, 1)        
phil = Etudiant("Phil", 0, 2, 1)          
cam = Etudiant("Cameron", 2, 2, 0)        
geoff = Etudiant("Geoff", 0, 3, 0) 


print(plus_argent([cam, geoff, andy, stephen, eric, david, phil])) 
print(plus_argent([andy]))
print(plus_argent([cam, geoff])) 

, le terminal doit renvoyer:

Eric
Andy
tous

Type de rendu possible :

APP-16 : Des potions magiques

C'est votre premier cours de potions magiques à Poudlard, et le professeur vous a donné un devoir pour comprendre quelle couleur aura la potion si elle est mélangée avec une autre potion. Toutes les potions ont une couleur qui est notée comme une couleur RVB de [0, 0, 0] à [255, 255, 255]. Pour rendre la tâche plus compliquée, le professeur fera quelques mélanges et vous demandera ensuite la couleur finale. En plus de la couleur, vous devez également comprendre quel volume aura la potion après le mélange final.

Après avoir mélangé deux potions, les couleurs se mélangeront comme si vous mélangez deux couleurs RVB. Par exemple, si vous mélangez une potion qui a la couleur [255, 255, 0] et un volume de 10 avec une autre qui a la couleur [0, 254, 0] et un volume de 5, vous obtiendrez une nouvelle potion avec la couleur [170, 255, 0] et un volume de 15. Vous avez donc décidé de créer une classe Potion qui aura deux propriétés : couleur (une liste avec 3 entiers) et volume (un nombre), et une méthode mix qui acceptera une autre Potion et renverra une Potion mélangée.

Résultat attendu dans le terminal:

En lançant ces quelques lignes,

felix_felicis  =  Potion([255, 255, 255],  7)
miseria_miseris =  Potion([ 51, 102,  51], 12)
nouvelle_potion =  felix_felicis.mix(miseria_miseris)

print("La nouvelle potion est de couleur " +str(nouvelle_potion.color) + " et son volume est de " + str(nouvelle_potion.volume))

, le terminal doit renvoyer:

La nouvelle potion est de couleur (127, 159, 127) et son volume est de 19

Type de rendu possible :