Premiers pas avec Python un corrigé 1 Présentation de Pyzo 2

publicité
Premiers pas avec Python
un corrigé
1
Présentation de Pyzo
Q.1. On pourrait prendre la partie entière dans la division de 2014 par 73 mais le plus simple est
d’utiliser la “division entière” qui donne le quotient.
2014//73
De même % est l’opérateur donnant le reste.
2014%73
Q.2. La fonction donne le maximum des arguments proposés selon l’ordre “naturel”
max(2,-1,3)
max([1.1,2.4,5.7],[1.1,2.4,4.3,7.1])
Dans le cas des listes, l’ordre utilisé est l’ordre “lexicographique”. Comme pour l’ordre alphabétique, on compare les premiers éléments et, en cas d’égalité, les seconds etc.
Q.3. L’opérateur d’exponentiation est ∗∗
(6/5)**1.1
2
Variables
Q.4. Dans un tableau, on donne la valeur des variables à chaque étape (le tableau se lit de gauche
à droite). Une case blanche signifie que la variable n’est pas définie (aucune valeur donc).
- Série 1.
a 4 4 4 4
b
2 2 4
c
2 2
- Série 2.
a 2 2 2 2 2
b
4 4 2 2
c
2 2 0
- Série 3.
x 5 5 100
y
13 13
- Série 4.
a 4 4 4 4 2
b
2 2 4 4
c
2 2 2
- Série 5.
a1 1 1 1 1 1
i
1 1 3 3
ai
3 3 6
Il faut ici comprendre que ai et a1 sont les noms de variables. Introduire une variable i ne
change rien à l’affaire (dans ai, on ne remplace pas i par la valeur d’une éventuelle variable
i).
- Série 6.
a 3 3 3 4 4
b
4 4 4 4
x
3 3 3
c
3
1
Q.5. Dans la série 1, la commande 2=a n’a pas de sens car 2 n’est pas un nom de variable.
Dans la série 2, la commande b=a n’a pas de sens car a n’est pas une variable définie (et n’a
donc pas de valeur).
Dans la série 3, la commande b=2*a3=a n’a pas de sens car a3 n’est pas une variable définie
(on a ai, i seulement).
3
Premières fonctions
Q.6. def f(x):
return(3*x/(1+8*x**3))
print(f(1), f(10**6), f(10**20), f(10**25), f(10**(-2)), f(10**(-8)), f(10**(-13)))
L’instruction f(-1/2) amène une division par 0 qui est notée par l’interpréteur Python.
Q.7. On calcule le discriminant et on distingue les cas.
def racine(a,b,c):
delta=b**2-4*a*c
if delta<0:
return([])
elif delta==0:
return([-b/(2*a)])
else:
d=delta**(1/2)
return([(-b+d)/(2*a),(-b-d)/(2*a)])
print(racine(1,4,4))
print(racine(1,1,1))
print(racine(1,-5,6))
Q.8. La version la plus efficace utilise les opérateurs booléens
def bissextile(a):
return((a%4==0 and a%100!=0) or (a%400==0))
On pourrait imaginer découper avec des if mais c’est une mauvaise idée. Cela pourrait donner
(c’est l’une des versions possibles où l’on teste la divisibilité de plus en plus finement)
def bissextile(a)
if a%4<>0:
return(False)
elif a%100<>0:
return(True)
elif a%400<>0:
return(False)
else:
return(True)
4
Premières boucles
Q.9. Dans l’appel mystere(4) les variables évoluent ainsi :
Init.
Iter. 1
Iter. 2
Iter. 3
2
f
1
1
2
6
k
1
2
3
4
L’itération 4 ne s’effectue pas (car k = 4 ≥ n) et on renvoie 6.
De façon générale, mystere(n) renvoie (n − 1)! si n ≥ 1 et 1 si n = 0.
Q.10. On procède comme dans le cours en remplaçant somme par produit. Si on note n le nombre
des éléments de la liste, on veut donc obtenir l[0].l[1] . . . l[n − 1]. L’idée est de gérer une
variable p que l’on fait évoluer en partant de 1 et en multipliant successivement par l[0] puis
l[1] etc. A chaque étape, on “fait la même chose” qui est “multiplier par un élément de l”. Il
faut cependant savoir à chaque moment quel est le prochain élément multiplicateur. Comme les
éléments de l sont numérotés, on gère une autre variable i qui donne le numéro du prochain
élément ; i est initialement nul et augmente d’une unité à chaque étape. On obtient la fonction
suivante.
def produit(l):
#Calcul du produit des éléments d’une liste de nombres
p=1
#variable pour stocker les produits successifs
i=0
#numéro du prochain élément à ajouter
while i<len(l):
p=p*l[i]
i+=1
return(p)
#Test de la fonction
print(produit([1,2,-3,4]))
Q.11. On gère deux variables. La première u contiendra successivement les termes de la suite. La
seconde k correspond à l’indice du dernier terme calculé. A tout instant, on aura donc u = uk .
def premierNeg(a):
u=a
k=0
while u>0:
u=u/2-3*k
k+=1
return(k)
Pour que la boucle se termine, il faut être sûr que l’un des termes de la suite finit par être
négatif. Il y a donc une étude théorique de la suite à faire. On pourrait montrer que la suite
tend vers −∞ (quelle que soit la valeur initiale de a).
3
Téléchargement