2. Séances dirigées 48Lorsque le nombre d’éléments dont il faut calculer <strong>la</strong> <strong>fr</strong>équence est assez grand, <strong>la</strong> secon<strong>de</strong> solution estpréférable. La première solution est efficace dans <strong>de</strong>s cas particuliers comme celui-ci. On s’aperçoit égalementque <strong>la</strong> fonction compte_l<strong>et</strong>tre est plus rapi<strong>de</strong> pour c<strong>et</strong>te secon<strong>de</strong> expérience (0.133 < 0.174) maisc<strong>et</strong>te observation est peu pertinente car c<strong>et</strong>te fonction n’a été exécutée qu’une fois. Il y a en eff<strong>et</strong> peu <strong>de</strong>chance pour que <strong>la</strong> fonction s’exécute à chaque fois à <strong>la</strong> même vitesse car l’ordinateur exécute un grandnombre <strong>de</strong> tâches simultanément.Pour obtenir un temps d’exécution fiable, il faut appeler <strong>la</strong> fonction un grand nombre <strong>de</strong> fois. Le tableausuivant montre le temps moyen total passé dans chaque fonction après 100 appels à <strong>la</strong> fonction comparaison.fonction 26 l<strong>et</strong>tres tous les caractèrescompte_l<strong>et</strong>tre 0.087 0.061compte_l<strong>et</strong>tre_count 0.017 0.073La fonction compte_l<strong>et</strong>tre est effectivement plus rapi<strong>de</strong> dans le second cas. Comme on s’intéresse maintenantà tous les caractères, le test if not (”A”
2. Séances dirigées 49<strong>de</strong>f <strong>la</strong>ngue_l<strong>et</strong>tre (texte) :if "http" in texte : s = lit_url (texte)else : s = lit_fichier (texte)c = compte_l<strong>et</strong>tre (s)r<strong>et</strong>urn c ["W"], c ["H"]# cas URL# cas fichier# on compte les l<strong>et</strong>tres# on r<strong>et</strong>ourne <strong>de</strong>ux <strong>fr</strong>équencesLa <strong>de</strong>rnière instruction <strong>de</strong> c<strong>et</strong>te fonction suppose que tous les textes incluent au moins un W <strong>et</strong> un H. Dansle cas contraire, <strong>la</strong> fonction produirait une erreur car elle ne pourrait pas trouver <strong>la</strong> clé ”W” ou ”H” dans ledictionnaire c. Pour remédier à ce<strong>la</strong>, on utilise <strong>la</strong> métho<strong>de</strong> g<strong>et</strong> <strong>de</strong>s dictionnaires qui perm<strong>et</strong> <strong>de</strong> r<strong>et</strong>ournerune valeur lorsqu’une clé est introuvable.<strong>de</strong>f <strong>la</strong>ngue_l<strong>et</strong>tre (texte) :... # lignes inchangéesr<strong>et</strong>urn c.g<strong>et</strong> ("W", 0.0), c.g<strong>et</strong> ("H", 0.0) # on r<strong>et</strong>ourne <strong>de</strong>ux <strong>fr</strong>équencesAprès c<strong>et</strong>te correction, <strong>la</strong> fonction r<strong>et</strong>ourne une valeur nulle lorsque les l<strong>et</strong>tres W ou H n’apparaissent pas.La fonction suivante perm<strong>et</strong> <strong>de</strong> construire <strong>de</strong>ux listes cx <strong>et</strong> cy qui contiennent les <strong>fr</strong>équences <strong>de</strong>s l<strong>et</strong>tres W<strong>et</strong> H pour une liste <strong>de</strong> textes.<strong>de</strong>f curve (li) :cx,cy = [], []for l in li :x,y = <strong>la</strong>ngue_l<strong>et</strong>tre (l)cx.append (x)cy.append (y)r<strong>et</strong>urn cx,cy# pour tous les textes <strong>de</strong> <strong>la</strong> liste# coordonnées d’un texte, <strong>fr</strong>équence W <strong>et</strong> H# on ajoute x à <strong>la</strong> liste <strong>de</strong>s abscisses# on ajoute y à <strong>la</strong> liste <strong>de</strong>s ordonnéesOn utilise c<strong>et</strong>te <strong>de</strong>rnière fonction pour faire apparaître sur un graphique plusieurs textes ang<strong>la</strong>is <strong>et</strong> <strong>fr</strong>ançais.Chaque texte est représenté par <strong>de</strong>ux coordonnées : <strong>la</strong> <strong>fr</strong>équence <strong>de</strong>s l<strong>et</strong>tres W <strong>et</strong> H. On obtient un nuage<strong>de</strong> points dans un p<strong>la</strong>n ce que montre le graphe <strong>de</strong> <strong>la</strong> figure 2.2. Ce <strong>de</strong>rnier a été tracé à l’ai<strong>de</strong> du modulematplotlib 6 . Il s’inspire du logiciel Mat<strong>la</strong>b dans <strong>la</strong> manière <strong>de</strong> constuire <strong>de</strong>s graphes 7 .<strong>fr</strong>cx,<strong>fr</strong>cy = curve (<strong>fr</strong>)encx,ency = curve (en)# on récupère les coordonnées <strong>de</strong>s textes <strong>fr</strong>ançais# on récupère les coordonnées <strong>de</strong>s textes ang<strong>la</strong>isimport py<strong>la</strong>b# import du module matplotlibpy<strong>la</strong>b.plot (<strong>fr</strong>cx, <strong>fr</strong>cy, "rx",ms=10,\mew=2.5) # on trace <strong>la</strong> courbe <strong>de</strong>s textes <strong>fr</strong>ançaispy<strong>la</strong>b.plot (encx, ency, "bv") # on trace <strong>la</strong> courbe <strong>de</strong>s textes ang<strong>la</strong>ispy<strong>la</strong>b.legend (("<strong>fr</strong>ancais", "ang<strong>la</strong>is"), loc=2) # légen<strong>de</strong> (sans accent)py<strong>la</strong>b.title ("<strong>la</strong>ngue")# titrepy<strong>la</strong>b.x<strong>la</strong>bel ("<strong>fr</strong>equence <strong>de</strong> W") # légen<strong>de</strong> <strong>de</strong> l’axe <strong>de</strong>s abscissespy<strong>la</strong>b.y<strong>la</strong>bel ("<strong>fr</strong>equence <strong>de</strong> H") # légen<strong>de</strong> <strong>de</strong> l’axe <strong>de</strong>s ordonnéespy<strong>la</strong>b.savefig ("graphe.png") # enregistrement sous forme d’imagepy<strong>la</strong>b.show ()# on fait apparaître le graphiqueLa figure 2.2 montre qu’au <strong>de</strong>là d’une <strong>fr</strong>équence <strong>de</strong> 1% pour <strong>la</strong> l<strong>et</strong>tre W, le texte est ang<strong>la</strong>is. On en déduit<strong>la</strong> fonction qui perm<strong>et</strong> <strong>de</strong> déterminer <strong>la</strong> <strong>la</strong>ngue d’un texte.<strong>de</strong>f est_ang<strong>la</strong>is (texte) :w,h = <strong>la</strong>ngue_l<strong>et</strong>tre (texte)r<strong>et</strong>urn w > 0.016. http://matplotlib.sourceforge.n<strong>et</strong>/7. Il a l’inconvénient <strong>de</strong> ne pas supporter les accents <strong>fr</strong>ançais mais il est possible <strong>de</strong> contourner c<strong>et</strong> obstacle en associantMatPlotLib <strong>et</strong> Latex qui perm<strong>et</strong> également d’afficher <strong>de</strong>s formules mathématiques sur le graphique. L’utilisation <strong>de</strong> ce genre<strong>de</strong> modules est plutôt facile, <strong>de</strong> nombreux exemples <strong>de</strong> graphiques sont proposés avec le programme Python qui a permis <strong>de</strong>les réaliser. Il suffit souvent <strong>de</strong>s recopier <strong>et</strong> <strong>de</strong> les adapter. Une autre solution consiste à écrire les courbes dans un fichier textepuis à les récupérer avec un tableur tel que OpenOffice pour les représenter sous forme <strong>de</strong> graphe (voir l’exemple page ??).