MENU DE CE MODULE
Nous voici arrivé au module 5 de notre cours. Ce module contient deux parties importantes à la fois au niveau de leur contenu et au niveau de leur volume.
Nous allons parler de structures de données plus complexes que ce que nous avons vu jusqu’à présent. En clair, nous allons analyser de façon fouillée les trois types de données chaînes de caractères, tuples et listes.
Mais dans ce module, nous allons aussi réaliser le projet associé au cours. Ce projet, dont nous avons déjà parlé et pour lequel nous avons déjà encodé des bribes, demande d’écrire un code plus volumineux que les exercices accompagnés ou autonomes UpyLaB que vous avez déjà réalisés. Grosso modo, nous estimons qu’un tiers du temps consacré à ce module le sera pour la réalisation de votre projet, même si cela peut être fort variable pour chacun de vous, en fonction de votre facilité à réaliser un projet plus important que d’habitude. C’est pour ces raisons que la période de temps dédiée au module 5 est deux fois plus grande que pour les modules 2 à 4 et 6.
Indication
Si vous travaillez séquentiellement sur la matière, la première section ainsi que le projet devraient idéalement être terminés avant le tiers du temps imparti.
LES CHAÎNES DE CARACTÈRES
Télécharger la vidéo en qualité : Haute (1080p) / Normale (720p) / Mobile (480p) / UL
LES TUPLES ET LES LISTES
Télécharger la vidéo en qualité : Haute (1080p) / Normale (720p) / Mobile (480p) / UL
TESTS ÉLÉMENTAIRES ET INSTRUCTION FOR
Télécharger la vidéo en qualité : Haute (1080p) / Normale (720p) / Mobile (480p) / UL
CODIFICATION UTILISÉE PAR PYTHON POUR LES TEXTES
Dans les vidéos que nous venons de présenter, nous avons parlé de comparaison entre caractères. Mais, par exemple, quel est le résultat du code ?
c1 = '#'
c2 = '€'
if c1 < c2:
print("Ce code est juste un exemple")
Pour le savoir nous devons nous pencher sur la codification des caractères en Python.
En fait, Python encode ces caractères grâce à la codification UTF-8. Regardons ce que cela veut dire.
D’après l’entrée UTF-8 de wikipedia : « UTF-8 (abréviation de l’anglais Universal Character Set Transformation Format 1 - 8 bits) est un codage de caractères informatiques conçu pour coder l’ensemble des caractères du « répertoire universel de caractères codés » … Il s’agit du codage le plus utilisé dans les systèmes GNU, Linux et compatibles pour gérer le plus simplement possible des textes et leurs traductions dans tous les systèmes d’écritures et tous les alphabets du monde. »
En clair, à chaque caractère est attribué, par la norme UTF-8, un numéro qui lui est propre et que Python utilise pour le stocker mais aussi pour le comparer aux autres caractères. UTF-8 essaye de donner un numéro à tous les caractères de tous les alphabets connus.
ORD(C)
En Python, la fonction prédéfinie ord(x)
donne le numéro dans le classement UTF-8 du caractère x
.
Ainsi '#' < '€'
est vrai car ord('#')
vaut 35 et ord('€')
vaut 8364. Une des seules choses que vous devez retenir est que :
- les caractères qui correspondent aux chiffres
'0'
à'9'
ont des numéros contigus (ord('0')
vaut 48,ord('1')
vaut 49, …) ; - idem pour les lettres minuscules
'a'
..'z'
(ord('a')
vaut 97,ord('b')
vaut 98, …) ; et pour les lettres majuscules'A'.. 'Z'
(ord('A')
vaut 65, …).
Ainsi ayant un caractère dans la variable c
, le test Python
'a' <= c and c <= 'z'
teste bien si c
est une lettre de l’alphabet en minuscule. On peut faire la même chose avec les caractères majuscules ou les caractères qui correspondent à des chiffres. Attention à ne pas mélanger la valeur 0
et le caractère '0'
dont la codification UTF-8 (ord('0')
) vaut 48.
CHR(V)
La fonction prédéfinie chr(v)
est l’inverse de ord( )
: chr(v)
reçoit en paramètre un nombre entier positif v
, et renvoie la caractère UTF-8 correspondant. Par exemple chr(65)
renvoie 'A'
.
TEMPÊTE OU CYCLONE
Même si nous n’avons pas encore suffisamment vu comment manipuler les séquences pour faire énormément de programmes intéressants, nous allons quand même imaginer deux petits exercices, que nous allons réaliser ensemble, pour illustrer ce que nous avons déjà vu.
D’après l’échelle de Saffir-Simpson, une tempête est définie si les vents enregistrés (vents moyens pendant une minute à une hauteur de 10 mètres) sont de 64 à 118 km/h. Au delà de 118 km/h, selon l’endroit dans le monde où l’on se trouve, on parle d’ouragan, de typhon ou de cyclone.
Les cyclones sont classés suivant leur force, par l’échelle de Saffir-Simpson allant de 1 à 5 :
- Catégorie 1 : Vents de 119 à 153 km/h
- Catégorie 2 : Vents de 154 à 177 km/h
- Catégorie 3 : Vents de 178 à 209 km/h
- Catégorie 4 : Vents de 210 à 250 km/h
- Catégorie 5 : Vents supérieurs à 250 km/h
Un territoire qui subit des vents de catégorie 5 subira des dégâts considérables.
Supposons que l’on ait une liste mes_valeurs
de valeurs entières positives correspondant aux vents maximums enregistrés aux Bermudes chaque année depuis l’an 2000 ; la composante 0 désignant l’an 2000, 1, 2001, ….
Par exemple, avec des chiffres totalement inventés:
mes_valeurs = [75, 200, 230, 260, 100, 80, 50, 45, 180, 100, 200, 63, 64, 65,\
118, 119, 153, 154, 280]
HISTORIQUE_TEMPETES
Ecrivons une fonction historique_tempetes
qui reçoit en paramètre formel la liste vent_max
de ces valeurs et imprime pour chaque année si les îles ont subi une tempête ou un cyclone et si c’est le cas, de quelle catégorie.
Découpe de la fonction historique_tempetes
La fonction doit traiter chaque élément de la liste séquentiellement. Une instruction for
est donc adaptée. Pour chaque élément, il faut tester dans quelle catégorie se trouve la valeur. Remarquons que l’on peut découper la valeur en 3 classes : 1) pas de tempête, 2) tempête, 3) cyclone d’une certaine catégorie. Pour ne pas avoir à plusieurs endroits dans le programme du code assez semblable, une fonction categorie semble indiquée : qui reçoit une valeur de vent supérieure à 118 km/h et renvoit un nombre entre 1 et 5 suivant la catégorie.
def categorie(vent):
"""renvoit la catégorie de cyclone enregistré en fonction du vent"""
assert vent > 118 # sinon provoque une erreur dans le code
if vent < 154:
res = 1
elif vent < 178:
res = 2
elif vent < 210:
res = 3
elif vent < 251:
res = 4
else: # catégorie 5
res = 5
return res
La fonction historique_tempetes
peut par exemple être encodé comme suit :
def historique_tempetes(vent_max):
"""Affiche pour chaque année la catégorie de vents subis cette année là
entrée : vent_max: liste des vents maximums enregistrés en km/h
chaque année (composante 0 étant pour l'an 2000)"""
annee = 2000
for vent in vent_max:
if vent < 64:
print("En", annee, ": pas de tempête enregistrée")
elif vent < 119:
print("En", annee, ": il y a eu au moins une tempête mais pas de cyclone")
else:
print("En", annee, ": le plus gros cyclone enregistré était de catégorie",
categorie(vent))
annee += 1
qui peut être appelée avec la liste des valeurs :
historique_tempetes(mes_valeurs)
CYCLONE_ANNEE
Avec la même liste mes_valeurs
des vitesses de vents maximums, écrivons une autre fonction : tempete_annee
qui reçoit en paramètre, la liste vent_max
et annee
entre 2000 et 2018, et qui renvoie la catégorie de cyclone auquel a été confronté les îles cette année.
Nous supposons comme résultat possible, 0 pour aucun cyclone, et une valeur entre 1 à 5 comprises pour donner la catégorie de cyclone.
La fonction peut se définir comme suit :
def cyclone_annee(vent_max, annee):
"""renvoie la catégorie de cyclone à laquelle les îles ont été confrontées
pour l'année annee à partir de 2000)"""
assert annee >= 2000 # si annee est inférieur à 2000, provoque une erreur
vent = vent_max[annee - 2000] # valeur de vent pour cette année
if vent < 119: # pas de cyclone
res = 0
else:
res = categorie(vent) # appel la fonction categorie pour déterminer la catégorie
return res
qui peut être testée comme suit pour les années 2001 à 2003 et 2009 :
for i in (2001, 2002, 2003, 2009):
print(cyclone_annee(mes_valeurs, i))
Ces deux exemples illustrent bien ce que nous avons vu jusqu’ici sur les séquences de données Python. L’activité suivante demande que vous codiez de façon autonome pour résoudre des problèmes qui se résolvent en utilisant des séquences. A vous de jouer!