Coverage for src/teachpyx/examples/classiques.py: 100%
41 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-07-19 05:40 +0200
« prev ^ index » next coverage.py v7.1.0, created at 2023-07-19 05:40 +0200
1# -*- coding: utf-8 -*-
2# pylint: disable=W4701
3"""
4@file
5@brief quelques fonctions à propos de la première séance
7"""
9import datetime
12def commentaire_accentues():
13 """
14 L'aide de cette fonction contient assuréments des accents.
16 .. faqref::
17 :tag: python
18 :title: Python n'accepte pas les accents
20 .. index:: accent, accents, utf8, encoding
22 Le langage Python a été conçu en langage anglais. Dès qu'on on ajoute un caractère
23 qui ne fait pas partie de l'alphabet anglais (ponctuation comprise), il déclenche une erreur :
25 ::
27 File "faq_cvxopt.py", line 3
28 SyntaxError: Non-UTF-8 code starting with '\xe8' in file faq_cvxopt.py on line 4, but no encoding declared;
29 see http://python.org/dev/peps/pep-0263/ for details
31 Pour la résoudre, il faut dire à l'interpréteur que des caractères non anglais peuvent apparaître
32 et écrire sur la première ligne du programme :
34 ::
36 # -*- coding: latin-1 -*-
38 Ou pour tout caractère y compris chinois :
40 ::
42 # -*- coding: utf-8 -*-
44 Si vous utilisez l'éditeur `SciTE <http://www.scintilla.org/SciTE.html>`_ sous Windows,
45 après avoir ajouté cette ligne avec l'encoding `utf-8`,
46 il est conseillé de fermer le fichier puis de le réouvrir.
47 SciTE le traitera différemment.
49 **L'encodage ``utf-8`` est la norme sur Internet.** C'est pourquoi il est préférable d'utiliser celui-ci pour
50 partager son code via une page Web.
51 """
52 pass
55def dix_entiers_carre():
56 """
57 fait la somme des dix premiers entiers au carré
59 :returns: nombre réel
61 .. faqref::
62 :tag: python
63 :title: Quelle est la différence entre return et print ?
65 La fonction ``print`` sert à afficher un résultat sur la sortie standard.
66 Elle peut être utilisée à tout moment
67 mais elle n'a pas d'impact sur le déroulement programme. Le mot-clé ``return``
68 n'est utilisé que dans une fonction. Lorsque le programme rencontre
69 une instruction commençant par ``return``, il quitte la fonction
70 et transmet le résultat à l'instruction qui a appelé la fonction.
71 La fonction ``print`` ne modifie pas votre algorithme. La fonction ``return``
72 spécifie le résultat de votre fonction : elle modifie l'algorithme.
74 .. exref::
75 :title: calcul de la somme des dix premiers entiers au carré
76 :tag: Base
78 Ce calcul simple peut s'écrire de diffèrentes manières.
80 ::
82 s = 0
83 for i in range(1, 11):
84 s += i**2
86 D'une façon abrégée :
88 ::
90 s = sum ( [ i**2 for i in range(1, 11) ] )
91 """
92 s = 0
93 for i in range(1, 11):
94 s += i ** 2
95 return s
98def repetition_a_eviter(serie, a_eviter=False):
99 """
100 Une répétition à éviter.
102 .. exref::
103 :title: Eviter d'effectuer le même appel deux fois
104 :tag: Base -
106 Dans cette fonction on calcule la variance d'une série d'observations.
108 ::
110 def moyenne(serie):
111 return sum(serie) / len(serie)
113 def variance_a_eviter(serie):
114 s = 0
115 for obs in serie :
116 s += (obs-moyenne(serie))**2
117 return s / len(serie)
119 La fonction ``variance_a_eviter`` appelle la fonction ``moyenne`` à chaque passage
120 dans la boucle. Or, rien ne change d'un passage à l'autre. Il vaut mieux stocker
121 le résultat dans une variable :
123 ::
125 def moyenne(serie):
126 return sum(serie) / len(serie)
128 def variance(serie):
129 s = 0
130 moy = moyenne(serie)
131 for obs in serie :
132 s += (obs-moy)**2
133 return s / len(serie)
135 Le coût de la variance passe alors d'un coût en :math:`O(n^2)` à :math:`O(n)`.
136 Ce n'est pas le seul endroit où cette erreur survient. Dans le code suivant,
137 on appelle deux fois la fonction ``major`` avec le même argument.
138 C'est à éviter.
140 ::
142 meilleur = major(data)[0] # retourne ("quelque chose", True)
143 if major(data)[1]:
144 return {"leaf":guess}
145 """
147 def moyenne(serie):
148 "moyenne"
149 return sum(serie) / len(serie)
151 def variance_a_eviter(serie):
152 "variance longue"
153 s = 0
154 for obs in serie:
155 s += (obs - moyenne(serie)) ** 2
156 return s / len(serie)
158 def variance(serie):
159 "variance courte"
160 s = 0
161 moy = moyenne(serie)
162 for obs in serie:
163 s += (obs - moy) ** 2
164 return s / len(serie)
166 if a_eviter:
167 return variance_a_eviter(serie)
168 else:
169 return variance(serie)
172def dictionnaire_modifie_dans_la_boucle():
173 """
174 Dictionnaires, listes modifiés dans la boucle qui les parcourt.
176 .. exref::
177 :title: Modifier un dictionnaire en le parcourant
178 :tag: Base -
180 Il faut éviter de modifier un container lorsqu'on le parcourt.
181 Lorsqu'on supprime un élément d'un dictionnaire, la structure de celui-ci
182 s'en trouve modifiée et affecte la boucle qui le parcourt. La boucle parcourt
183 toujours l'ancienne structure du dictionnaire, celle qui existait au début
184 au début de la boucle.
186 ::
188 d = { k: k for k in range(10) }
189 for k, v in d.items():
190 if k == 4 :
191 del d[k]
193 En Python, cela produit l'erreur qui suit mais d'autres langages ne préviennent
194 pas (C++) et cela aboutit à une erreur qui intervient plus tard dans le code
195 (comme une valeur numérique inattendue).
197 ::
199 Traceback (most recent call last):
200 File "session1.py", line 176, in <module>
201 l = liste_modifie_dans_la_boucle()
202 File "session1.py", line 169, in liste_modifie_dans_la_boucle
203 for k,v in d.items():
204 RuntimeError: dictionary changed size during iteration
206 Il faut pour éviter cela stocker les éléments qu'on veut modifier pour les supprimer
207 ensuite.
209 ::
211 d = { k:k for k in l }
212 rem = [ ]
213 for k,v in d.items():
214 if k == 4 :
215 rem.append(k)
216 for r in rem :
217 del d[r]
219 Même si Python autorise cela pour les listes,
220 il est conseillé de s'en abstenir ainsi que pour tout type d'objets qui en contient d'autres.
221 C'est une habitude qui vous servira pour la plupart des autres langages.
222 """
223 liste = [0, 1, 2, 3, 4, 5, 6]
224 for i in liste:
225 if i == 2:
226 liste.remove(3)
228 d = {k: k for k in liste}
229 rem = []
230 for k in d:
231 if k == 4:
232 rem.append(k)
233 for r in rem:
234 del d[r]
236 return liste, d
239def str2date(s, format="%d/%m/%Y"):
240 """
241 convertit une chaîne de caractères en datetime
243 @param s chaîne de caractères
244 @param format format de la conversion
247 .. exref::
248 :title: conversion d'une chaîne de caractère en datetime
249 :tag: Base
251 C'est le genre de fonction qu'on n'utilise pas souvent mais qu'on peine à retrouver
252 lorsqu'on en a besoin.
253 Il faut utiliser la fonction `strftime <https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior>`_.
255 ::
257 import datetime
258 dt = datetime.datetime.strptime ("16/01/2014", "%d/%m/%Y")
259 """
260 return datetime.datetime.strptime(s, format)