VI. Corrigés des exercices▲
VI-A. Suite arithmétique : solution▲
À l'aide d'une boucle :
def suite1(n) :
result = []
for i in range(n) :
result.append(12*i+1)
return resultEn compréhension de liste :
def suite2(n) :
return [12*i+1 for i in range(n)]Dans une console IPython :
%timeit(suite1(1000000))
1 loops, best of 3: 140 ms per loop
%timeit(suite2(1000000))
10 loops, best of 3: 93.4 ms per loopLa fonction avec la définition de la liste en compréhension est plus rapide.
VI-B. Moyenne et variance : solution▲
- Calcul de la moyenne :
>>> from random import random
>>> L = [random() for i in range(100)]
>>> moyenne(L)
0.49407951863783545- Calcul de la variance, à l'aide de la définition kitxmlcodeinlinelatexdvpV(X)=E((X-E(X))^2finkitxmlcodeinlinelatexdvp
def variance(liste) :
if (liste != []) :
esp = moyenne(liste)
liste2 = [(x-esp)**2 for x in liste]
return moyenne(liste2)- Calcul de la variance, à l'aide de la formule de König-Huygens : kitxmlcodeinlinelatexdvpV(X)=E(X^2)-E(X)^2finkitxmlcodeinlinelatexdvp
def variance(liste) :
return moyenne([x**2 for x in liste]) - moyenne(x)**2VI-C. Listes définies en compréhension : solution▲
-
La liste des logarithmes népériens (ln) des entiers compris entre 1 et 20 :
Sélectionnez>>>frommathimportlog# import de log du module math>>>liste1=[log(n)forninrange(1,21)]>>>printliste1 [0.0,0.6931471805599453,1.0986122886681098,1.3862943611198906,1.6094379124341003,1.791759469228055,1.9459101490553132,2.0794415416798357,2.1972245773362196,2.302585092994046,2.3978952727983707,2.4849066497880004,2.5649493574615367,2.6390573296152584,2.70805020110221,2.772588722239781,2.833213344056216,2.8903717578961645,2.9444389791664403,2.995732273553991] -
La liste des entiers compris entre 0 et 100 qui sont pairs et qui ne sont pas des multiples de 3 :
Sélectionnez>>>liste2=[nforninrange(0,101)if(n%2==0)and(n%3!=0)]>>>printliste2 [2,4,8,10,14,16,20,22,26,28,32,34,38,40,44,46,50,52,56,58,62,64,68,70,74,76,80,82,86,88,92,94,98,100] -
Une alternative plus rapide :
Sélectionnez>>>liste2=[nforninrange(0,101,2)if(n%3!=0)]>>>printliste2 [2,4,8,10,14,16,20,22,26,28,32,34,38,40,44,46,50,52,56,58,62,64,68,70,74,76,80,82,86,88,92,94,98,100] -
La liste ['@-@', '@--@', '@---@', '@----@', '@-----@'] :
Sélectionnez>>>['@'+'-'*n+'@'forninrange(1,6)] ['@-@','@--@','@---@','@----@','@-----@'] -
La liste des couples d'entiers entre 0 et 10 dont la somme est un multiple de 5 :
- Écrire une fonction qui prend pour paramètre un entier n et retourne sous forme d'une liste de listes la matrice identité de rang n :
def IdMat(n):
return [[0 for j in range(k)]+[1]+[0 for j in range(n-1-k)] for k in range(n)]>>> IdMat(2)
[[1, 0], [0, 1]]
>>> IdMat(3)
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
>>> IdMat(4)
[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]VI-D. Chiffrement de César : solution▲
- Fonction de chiffrement :
>>> def cesar_crypt(ch, n) :
... result = ''
... for i in range(len(ch)) :
... result += chr((ord(ch[i]) + n-ord('A')) % 26 + ord('A'))
... return result
...
>>> print cesar_crypt('BONJOUR',1)
CPOKPVS- Fonction de déchiffrement :
>>> def cesar_decrypt(ch, n) :
... return cesar_crypt(ch, -n)
...
>>> cesar_decrypt('CPOKPVS',1)
'BONJOUR'VI-E. Triangle de Pascal : solution▲
def pascal_triangle(n) :
result = []
for i in range(n+1) :
temp = []
for k in range(i+1):
if k == 0:
temp.append(1)
elif k == i:
temp.append(1)
else:
temp.append(result[i-1][k-1] + result[i-1][k])
result.append(temp)
return resultExemple d'utilisation :
>>> liste = pascal_triangle(6)
>>> for x in liste :
... print x
...
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]

