(C) Copyright Franck CHEVRIER 2019-2021 http://www.python-lycee.com/
Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.
Le but de l'activité est :(extrait du programme d'enseignement scientifique en Terminale)
- étant donné un programme très simple, de proposer des jeux de données d'entrée permettant d'en tester toutes les lignes ;
- de corriger un algorithme ou un programme bogué simple.
1. On fournit ci-dessous une fonction Python inverse qui doit renvoyer l'inverse d'un nombre x entré en argument.
$\quad$Afin de tester cette fonction, on fournit un jeu de données sous forme d'une liste nommée Tests.
a. Observer la construction de la liste Tests. Quelles sont les valeurs de ce jeu de données ?
b. Exécuter les trois cellules suivantes, et vérifier la réponse à la question a.
$\quad$Expliquer l'erreur obtenue dans la 3ème cellule : À quoi correspond-t-elle ?
# Exécuter les 3 cellules suivantes (Sélectionner les cellules puis SHIFT+Entrée)
def inverse(x):
"""
fonction qui renvoie l'inverse de x
"""
return 1/x
Tests = [ 0.1*k for k in range(-10,11) ]
Tests
[-1.0, -0.9, -0.8, -0.7000000000000001, -0.6000000000000001, -0.5, -0.4, -0.30000000000000004, -0.2, -0.1, 0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9, 1.0]
for x in Tests:
print(inverse(x))
-1.0 -1.1111111111111112 -1.25 -1.4285714285714284 -1.6666666666666665 -2.0 -2.5 -3.333333333333333 -5.0 -10.0
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-3-e84761558f62> in <module> 1 for x in Tests: ----> 2 print(inverse(x)) <ipython-input-1-e633d0afc7b2> in inverse(x) 5 fonction qui renvoie l'inverse de x 6 """ ----> 7 return 1/x ZeroDivisionError: float division by zero
# Écrire ici la fonction inverse modifiée
def inverse(x):
"""
fonction qui renvoie l'inverse de x
"""
if x==0 : return None
return 1/x
#Effectuer ici le test
for x in Tests:
print( inverse(x) )
-1.0 -1.1111111111111112 -1.25 -1.4285714285714284 -1.6666666666666665 -2.0 -2.5 -3.333333333333333 -5.0 -10.0 None 10.0 5.0 3.333333333333333 2.5 2.0 1.6666666666666665 1.4285714285714284 1.25 1.1111111111111112 1.0
# Sélectionner cette zone puis SHIFT+ENTREE
def moyenne(L):
"""
fonction qui renvoie la moyenne d'une liste de valeurs
"""
return sum(L)/len(L)
from random import randint
Tests = [ [ randint(0,20) for j in range(randint(0,6)) ] for k in range(30)]
Tests
[[0, 12, 1, 20, 4], [10], [13, 3, 10, 11, 0], [], [], [2], [13, 11], [12, 19, 2], [8, 4, 4, 16], [7, 5, 18], [3, 1], [9], [16, 16, 6], [17, 9, 2, 13, 9], [9, 8], [5, 11, 7], [], [14, 13, 20, 11], [8, 15], [0, 13, 5], [], [3, 14, 13, 20], [4], [], [10], [1, 13, 20, 12, 0], [5], [15, 6, 8, 7, 20], [15, 1], [10, 17, 11, 4]]
# Effectuer ici la saisie pour tester la fonction moyenne avec le jeu de données Tests
for liste in Tests:
print( moyenne(liste) )
7.4 10.0 7.4
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-7-0479bd5e03ad> in <module> 2 3 for liste in Tests: ----> 4 print( moyenne(liste) ) <ipython-input-6-e0a0c8114274> in moyenne(L) 5 fonction qui renvoie la moyenne d'une liste de valeurs 6 """ ----> 7 return sum(L)/len(L) 8 9 ZeroDivisionError: division by zero
# Écrire ici la fonction moyenne déboguée
def moyenne(L):
"""
fonction qui renvoie la moyenne d'une liste de valeurs
"""
if len(L) == 0 : return None
return sum(L)/len(L)
# Effectuer ici la saisie pour tester la nouvelle fonction moyenne avec le jeu de données Tests
for liste in Tests:
print( moyenne(liste) )
7.4 10.0 7.4 None None 2.0 12.0 11.0 8.0 10.0 2.0 9.0 12.666666666666666 10.0 8.5 7.666666666666667 None 14.5 11.5 6.0 None 12.5 4.0 None 10.0 9.2 5.0 11.2 8.0 10.5
def resolution(a,b,c):
"""
fonction qui renvoie la solution de l'équation ax+b = c
"""
return (c-b)/a
Tests = [ (randint(-10,10),randint(-10,10),randint(-10,10)) for k in range(30)]
Tests
for valeurs in Tests:
print( resolution(*valeurs) )
0.8333333333333334 1.1 -0.0 -0.8571428571428571 -0.6666666666666666 1.1 -1.5 -0.2857142857142857 -0.2 -2.75 -0.4 2.3333333333333335 1.0 0.25 2.0 -0.6666666666666666 -0.5 0.16666666666666666 -0.6 -2.3333333333333335 1.2857142857142858 0.7777777777777778 0.2222222222222222 -3.0 1.3333333333333333 -0.8333333333333334 -0.8333333333333334 -1.0 0.0 -3.25
def resolution(a,b,c):
"""
fonction qui renvoie la solution de l'équation ax+b = c
"""
if a==0 :
if b==c:
return "All"
else:
return None
return (c-b)/a
for valeurs in Tests:
print( resolution(*valeurs) )
0.8333333333333334 1.1 -0.0 -0.8571428571428571 -0.6666666666666666 1.1 -1.5 -0.2857142857142857 -0.2 -2.75 -0.4 2.3333333333333335 1.0 0.25 2.0 -0.6666666666666666 -0.5 0.16666666666666666 -0.6 -2.3333333333333335 1.2857142857142858 0.7777777777777778 0.2222222222222222 -3.0 1.3333333333333333 -0.8333333333333334 -0.8333333333333334 -1.0 0.0 -3.25
# Utiliser ces zones pour définir la fonction, la tester et la déboguer
def vitesse(d,t):
return d/t
Tests = [ (randint(0,100),randint(0,10)) for k in range(30)]
Tests
for valeurs in Tests:
print( vitesse(*valeurs) )
3.2222222222222223 9.7 5.333333333333333 12.0 4.625 2.5 2.0 5.571428571428571 5.0 13.666666666666666 6.0 25.0 6.111111111111111 18.8 93.0 3.5 50.0 11.166666666666666 8.3 13.6 11.428571428571429 27.666666666666668 15.5 3.6666666666666665 3.6 6.7 10.857142857142858 0.2222222222222222 13.6 3.857142857142857
#version déboguée
def vitesse(d,t):
if t==0: return None
return d/t
for valeurs in Tests:
print( vitesse(*valeurs) )
3.2222222222222223 9.7 5.333333333333333 12.0 4.625 2.5 2.0 5.571428571428571 5.0 13.666666666666666 6.0 25.0 6.111111111111111 18.8 93.0 3.5 50.0 11.166666666666666 8.3 13.6 11.428571428571429 27.666666666666668 15.5 3.6666666666666665 3.6 6.7 10.857142857142858 0.2222222222222222 13.6 3.857142857142857
def diagnostic(m,t):
"""
fonction effectuant le diagnostic à partir de la masse et de la taille
"""
IMC = m/t**2
if IMC<18.5:
bilan = "maigreur"
if IMC<25:
bilan = "dans la norme"
if IMC>25:
bilan = "surpoids"
return bilan
# Quelques tests:
from random import randint
Tests = [ ( randint(45,110) , randint(130,200)/100) for k in range(30) ]
for donnees in Tests:
print( donnees,diagnostic(*donnees) )
(101, 1.6) surpoids (65, 1.37) surpoids (46, 1.52) dans la norme (108, 1.3) surpoids (76, 1.41) surpoids (78, 1.56) surpoids (97, 1.78) surpoids (48, 1.57) dans la norme (109, 1.88) surpoids (102, 1.58) surpoids (108, 1.57) surpoids (84, 1.58) surpoids (55, 1.38) surpoids (54, 1.33) surpoids (86, 1.85) surpoids (100, 1.35) surpoids (104, 1.7) surpoids (59, 1.4) surpoids (71, 1.64) surpoids (83, 1.67) surpoids (72, 1.9) dans la norme (104, 1.8) surpoids (66, 1.44) surpoids (57, 1.88) dans la norme (109, 1.84) surpoids (65, 1.52) surpoids (66, 1.71) dans la norme (88, 1.6) surpoids (105, 1.8) surpoids (110, 1.73) surpoids
# Fonction déboguée
def diagnostic(m,t):
"""
fonction effectuant le diagnostic à partir de la masse et de la taille
"""
IMC = m/t**2
if IMC<18.5:
bilan = "maigreur"
elif IMC<25:
bilan = "IMC dans la norme"
else:
bilan = "surpoids"
return bilan
for donnees in Tests:
print( donnees,diagnostic(*donnees) )
(101, 1.6) surpoids (65, 1.37) surpoids (46, 1.52) IMC dans la norme (108, 1.3) surpoids (76, 1.41) surpoids (78, 1.56) surpoids (97, 1.78) surpoids (48, 1.57) IMC dans la norme (109, 1.88) surpoids (102, 1.58) surpoids (108, 1.57) surpoids (84, 1.58) surpoids (55, 1.38) surpoids (54, 1.33) surpoids (86, 1.85) surpoids (100, 1.35) surpoids (104, 1.7) surpoids (59, 1.4) surpoids (71, 1.64) surpoids (83, 1.67) surpoids (72, 1.9) IMC dans la norme (104, 1.8) surpoids (66, 1.44) surpoids (57, 1.88) maigreur (109, 1.84) surpoids (65, 1.52) surpoids (66, 1.71) IMC dans la norme (88, 1.6) surpoids (105, 1.8) surpoids (110, 1.73) surpoids
(C) Copyright Franck CHEVRIER 2019-2021 http://www.python-lycee.com/