Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# -*- coding: utf-8 -*- 

2""" 

3@file 

4@brief quelques fonctions à propos de la première séance 

5 

6""" 

7 

8import datetime 

9 

10 

11def commentaire_accentues(): 

12 """ 

13 L'aide de cette fonction contient assuréments des accents. 

14 

15 .. faqref:: 

16 :tag: python 

17 :title: Python n'accepte pas les accents 

18 

19 .. index:: accent, accents, utf8, encoding 

20 

21 Le langage Python a été conçu en langage anglais. Dès qu'on on ajoute un caractère 

22 qui ne fait pas partie de l'alphabet anglais (ponctuation comprise), il déclenche une erreur : 

23 

24 :: 

25 

26 File "faq_cvxopt.py", line 3 

27 SyntaxError: Non-UTF-8 code starting with '\xe8' in file faq_cvxopt.py on line 4, but no encoding declared; 

28 see http://python.org/dev/peps/pep-0263/ for details 

29 

30 Pour la résoudre, il faut dire à l'interpréteur que des caractères non anglais peuvent apparaître 

31 et écrire sur la première ligne du programme : 

32 

33 :: 

34 

35 # -*- coding: latin-1 -*- 

36 

37 Ou pour tout caractère y compris chinois : 

38 

39 :: 

40 

41 # -*- coding: utf-8 -*- 

42 

43 Si vous utilisez l'éditeur `SciTE <http://www.scintilla.org/SciTE.html>`_ sous Windows, 

44 après avoir ajouté cette ligne avec l'encoding `utf-8`, 

45 il est conseillé de fermer le fichier puis de le réouvrir. 

46 SciTE le traitera différemment. 

47 

48 **L'encodage ``utf-8`` est la norme sur Internet.** C'est pourquoi il est préférable d'utiliser celui-ci pour 

49 partager son code via une page Web. 

50 """ 

51 pass 

52 

53 

54def dix_entiers_carre(): 

55 """ 

56 fait la somme des dix premiers entiers au carré 

57 

58 :returns: nombre réel 

59 

60 .. faqref:: 

61 :tag: python 

62 :title: Quelle est la différence entre return et print ? 

63 

64 La fonction ``print`` sert à afficher un résultat sur la sortie standard. 

65 Elle peut être utilisée à tout moment 

66 mais elle n'a pas d'impact sur le déroulement programme. Le mot-clé ``return`` 

67 n'est utilisé que dans une fonction. Lorsque le programme rencontre 

68 une instruction commençant par ``return``, il quitte la fonction 

69 et transmet le résultat à l'instruction qui a appelé la fonction. 

70 La fonction ``print`` ne modifie pas votre algorithme. La fonction ``return`` 

71 spécifie le résultat de votre fonction : elle modifie l'algorithme. 

72 

73 .. exref:: 

74 :title: calcul de la somme des dix premiers entiers au carré 

75 :tag: Base 

76 

77 Ce calcul simple peut s'écrire de diffèrentes manières. 

78 

79 :: 

80 

81 s = 0 

82 for i in range(1, 11): 

83 s += i**2 

84 

85 D'une façon abrégée : 

86 

87 :: 

88 

89 s = sum ( [ i**2 for i in range(1, 11) ] ) 

90 """ 

91 s = 0 

92 for i in range(1, 11): 

93 s += i ** 2 

94 return s 

95 

96 

97def repetition_a_eviter(serie, a_eviter=False): 

98 """ 

99 Une répétition à éviter. 

100 

101 .. exref:: 

102 :title: Eviter d'effectuer le même appel deux fois 

103 :tag: Base - 

104 

105 Dans cette fonction on calcule la variance d'une série d'observations. 

106 

107 :: 

108 

109 def moyenne(serie): 

110 return sum(serie) / len(serie) 

111 

112 def variance_a_eviter(serie): 

113 s = 0 

114 for obs in serie : 

115 s += (obs-moyenne(serie))**2 

116 return s / len(serie) 

117 

118 La fonction ``variance_a_eviter`` appelle la fonction ``moyenne`` à chaque passage 

119 dans la boucle. Or, rien ne change d'un passage à l'autre. Il vaut mieux stocker 

120 le résultat dans une variable : 

121 

122 :: 

123 

124 def moyenne(serie): 

125 return sum(serie) / len(serie) 

126 

127 def variance(serie): 

128 s = 0 

129 moy = moyenne(serie) 

130 for obs in serie : 

131 s += (obs-moy)**2 

132 return s / len(serie) 

133 

134 Le coût de la variance passe alors d'un coût en :math:`O(n^2)` à :math:`O(n)`. 

135 Ce n'est pas le seul endroit où cette erreur survient. Dans le code suivant, 

136 on appelle deux fois la fonction ``major`` avec le même argument. 

137 C'est à éviter. 

138 

139 :: 

140 

141 meilleur = major(data)[0] # retourne ("quelque chose", True) 

142 if major(data)[1]: 

143 return {"leaf":guess} 

144 """ 

145 

146 def moyenne(serie): 

147 "moyenne" 

148 return sum(serie) / len(serie) 

149 

150 def variance_a_eviter(serie): 

151 "variance longue" 

152 s = 0 

153 for obs in serie: 

154 s += (obs - moyenne(serie)) ** 2 

155 return s / len(serie) 

156 

157 def variance(serie): 

158 "variance courte" 

159 s = 0 

160 moy = moyenne(serie) 

161 for obs in serie: 

162 s += (obs - moy) ** 2 

163 return s / len(serie) 

164 

165 if a_eviter: 

166 return variance_a_eviter(serie) 

167 else: 

168 return variance(serie) 

169 

170 

171def dictionnaire_modifie_dans_la_boucle(): 

172 """ 

173 Dictionnaires, listes modifiés dans la boucle qui les parcourt. 

174 

175 .. exref:: 

176 :title: Modifier un dictionnaire en le parcourant 

177 :tag: Base - 

178 

179 Il faut éviter de modifier un container lorsqu'on le parcourt. 

180 Lorsqu'on supprime un élément d'un dictionnaire, la structure de celui-ci 

181 s'en trouve modifiée et affecte la boucle qui le parcourt. La boucle parcourt 

182 toujours l'ancienne structure du dictionnaire, celle qui existait au début 

183 au début de la boucle. 

184 

185 :: 

186 

187 d = { k: k for k in range(10) } 

188 for k, v in d.items(): 

189 if k == 4 : 

190 del d[k] 

191 

192 En Python, cela produit l'erreur qui suit mais d'autres langages ne préviennent 

193 pas (C++) et cela aboutit à une erreur qui intervient plus tard dans le code 

194 (comme une valeur numérique inattendue). 

195 

196 :: 

197 

198 Traceback (most recent call last): 

199 File "session1.py", line 176, in <module> 

200 l = liste_modifie_dans_la_boucle() 

201 File "session1.py", line 169, in liste_modifie_dans_la_boucle 

202 for k,v in d.items(): 

203 RuntimeError: dictionary changed size during iteration 

204 

205 Il faut pour éviter cela stocker les éléments qu'on veut modifier pour les supprimer 

206 ensuite. 

207 

208 :: 

209 

210 d = { k:k for k in l } 

211 rem = [ ] 

212 for k,v in d.items(): 

213 if k == 4 : 

214 rem.append(k) 

215 for r in rem : 

216 del d[r] 

217 

218 Même si Python autorise cela pour les listes, 

219 il est conseillé de s'en abstenir ainsi que pour tout type d'objets qui en contient d'autres. 

220 C'est une habitude qui vous servira pour la plupart des autres langages. 

221 """ 

222 li = [0, 1, 2, 3, 4, 5, 6] 

223 for i in li: 

224 if i == 2: 

225 li.remove(3) 

226 

227 d = {k: k for k in li} 

228 rem = [] 

229 for k in d: 

230 if k == 4: 

231 rem.append(k) 

232 for r in rem: 

233 del d[r] 

234 

235 return li, d 

236 

237 

238def str2date(s, format="%d/%m/%Y"): 

239 """ 

240 convertit une chaîne de caractères en datetime 

241 

242 @param s chaîne de caractères 

243 @param format format de la conversion 

244 

245 

246 .. exref:: 

247 :title: conversion d'une chaîne de caractère en datetime 

248 :tag: Base 

249 

250 C'est le genre de fonction qu'on n'utilise pas souvent mais qu'on peine à retrouver 

251 lorsqu'on en a besoin. 

252 Il faut utiliser la fonction `strftime <https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior>`_. 

253 

254 :: 

255 

256 import datetime 

257 dt = datetime.datetime.strptime ("16/01/2014", "%d/%m/%Y") 

258 """ 

259 return datetime.datetime.strptime(s, format)