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
result
En 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 loop
La 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)**
2
VI-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>>>
from
mathimport
log# import de log du module math
>>>
liste1=
[log
(
n)for
nin
range(
1
,21
)]>>>
print
liste1 [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=
[nfor
nin
range(
0
,101
)if
(
n%
2
==
0
)and
(
n%
3
!=
0
)]>>>
print
liste2 [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=
[nfor
nin
range(
0
,101
,2
)if
(
n%
3
!=
0
)]>>>
print
liste2 [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+
'@'
for
nin
range(
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
result
Exemple 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
]