Python : fonctions, tests et documentation (corrigé)

Transcription

Python : fonctions, tests et documentation (corrigé)
ISBS B1-ST01
TP no 4 (corrigé)
2016-2017
Python : fonctions, tests et documentation (corrigé)
Toutes les fonctions de ce TP devront être documentées et testées.
Exercice 1. Fonctions avec valeur par défaut et paramètres par mots-clés
Soient les définitions de fonctions suivantes :
• fonction sans valeur par défaut
def fonction_sans_defaut(a,b,c) :
""" retourne a^b+c
"""
return a**b+c
Exécutez-la avec les invocations suivantes. Comprenez les affichages.
fonction_sans_defaut(2,31,-1)
fonction_sans_defaut(a=2,31,-1)
fonction_sans_defaut(31,-1,a=2)
fonction_sans_defaut(2,c=-1,b=31)
fonction_sans_defaut(c=-1,a=2,b=31)
fonction_sans_defaut([2,31,-1])
fonction_sans_defaut(*[2,31,-1])
Corrigé
***************************************************************************
>>> fonction_sans_defaut(2,31,-1)
2147483647
>>> fonction_sans_defaut(a=2,31,-1)
SyntaxError: non-keyword arg after keyword arg
>>> fonction_sans_defaut(31,-1,a=2)
Traceback (most recent call last):
File "<pyshell#75>", line 1, in <module>
fonction_sans_defaut(31,-1,a=2)
TypeError: fonction_sans_defaut() got multiple values for keyword argument
'a'
>>> fonction_sans_defaut(2,c=-1,b=31)
2147483647
>>> fonction_sans_defaut(c=-1,a=2,b=31)
2147483647
>>> fonction_sans_defaut([2,31,-1])
Traceback (most recent call last):
File "<pyshell#79>", line 1, in <module>
fonction_sans_defaut([2,31,-1])
TypeError: fonction_sans_defaut() takes exactly 3 positional arguments (1
given)
>>> fonction_sans_defaut(*[2,31,-1])
2147483647
***************************************************************************
• fonction avec valeurs par défaut
def fonction_avec_defaut(a,b=5,c=1) :
""" retourne a^b+c
"""
return a**b+c
Exécutez-la avec les invocations suivantes. Comprenez les affichages.
–1/7–
ISBS B1-ST01
TP no 4 (corrigé)
2016-2017
fonction_avec_defaut(2,31,-1)
fonction_avec_defaut(2,31)
fonction_avec_defaut(2)
fonction_avec_defaut(2,a=31,-1)
fonction_avec_defaut(2,a=31,-1)
fonction_avec_defaut(2,a=31,c=-1)
Corrigé
***************************************************************************
>>> fonction_avec_defaut(2,31,-1)
2147483647
>>> fonction_avec_defaut(2,31)
2147483649
>>> fonction_avec_defaut(2)
33
>>> fonction_avec_defaut(2,a=31,-1)
SyntaxError: non-keyword arg after keyword arg
>>> fonction_avec_defaut(2,a=31,-1)
SyntaxError: non-keyword arg after keyword arg
>>> fonction_avec_defaut(2,a=31,c=-1)
Traceback (most recent call last):
File "<pyshell#121>", line 1, in <module>
fonction_avec_defaut(2,a=31,c=-1)
TypeError: fonction_avec_defaut() got multiple values for keyword argument
'a'
***************************************************************************
Exercice 2. Fonctions avec nombre variable d’arguments
à rendre
Écrire une fonction qui calcule la moyenne d’un nombre variable d’arguments.
Élaborer un jeu de test pour cette fonction (on ne testera pas les types et on supposera que le nombre d’arguments est au moins égal à 1)
à rendre
Corrigé
***************************************************************************
def moyenne(*arguments) :
l=len(arguments)
s=sum(arguments)
return s/l
***************************************************************************
–2/7–
ISBS B1-ST01
TP no 4 (corrigé)
2016-2017
Exercice 3. Les puissances de 2 forment un nombre univers
Un nombre est dit nombre univers si son écriture contient tout nombre fini. Le nombre
formé de la concaténation des puissances de 2 est un nombre univers (tout nombre apparaît
dans au moins une puissance de 2)
à rendre
Créer un générateur des puissances de n.
Utiliser ce générateur pour vérifier que votre date de naissance (sous la
forme 051110) apparaît dans une puissance de 2. Laquelle ?
à rendre
Exercice 4. La loi de Benford
D’après :
Stewart (Ian), " 1 est plus probable que 9 ! ", L’univers des nombres, Belin Pour la
science, 2000
En 1938, le physicien Frank Benford découvrit que les nombres utilisés par les physiciens et les ingénieurs dans leurs calculs ont plus de chances de commencer par un 1
(d’avoir leur premier chiffre significatif égal à 1) que par un 2. Selon lui, la fréquence
d’apparition d’un premier chiffre décroît régulièrement pour les valeurs de 1 à 9. En
analysant vingt ensembles différents de données, de la surface de lacs aux poids moléculaires, il établit empiriquement que la probabilité que le premier chiffre soit n était de
log10 (n + 1) − log10 (n).
Le but de cet exercice est de visualiser expérimentalement la loi de Benford.
à rendre
Premier chiffre d’un nombre
Écrire la fonction qui retourne le premier chiffre significatif d’un nombre
def premierChiffre(x) :
Par exemple,
>>> premierChiffre(2013)
2
>>> premierChiffre(-0.0618)
6
Corrigé
***************************************************************************
def premierChiffre(x) :
x=abs(x)
s=str(x)
for c in s :
if c in "123456789" :
return ord(c)-ord('0')
return None
***************************************************************************
à rendre
Fréquence des premiers chiffres dans une liste
Écrire une fonction
–3/7–
ISBS B1-ST01
TP no 4 (corrigé)
2016-2017
def frequence_des_premiers_chiffres(liste) :
qui à partir d’une liste de nombres retourne un dictionnaire avec des clés de 1 à 9 où
chaque clé est associée au nombre de nombres de la liste commençant par le chiffre clé.
Par exemple, pour la liste de 12 données suivante :
>>> frequence_des_premiers_chiffres([1, 4 ,9 ,16 ,25 ,36 ,49 ,64 ,100 ,121
,144])
{1: 5, 2: 1, 3: 1, 4: 2, 5: 0, 6: 1, 7: 0, 8: 0, 9: 1}
ce qui signifie que cinq nombres de la liste initiale commencent par 1, que un nombre
de la liste initiale commence par 2, etc. ou bien :
>>> frequence_des_premiers_chiffres([4430.1261, 2987.0548, 98.4003, 4470.5923,
-3509.3805, -2486.3027, -3513.7711, -4925.4763, -1558.9943, -4688.8701, -2288.5406,
-2879.0072, -3475.7485, -2517.1945, 422.7507, -3201.8649, 2357.0262, 4152.7797,
-43.1212, 3750.0442, -2248.8903, 4937.6798, 1289.0227, -3739.6873, -2841.0526,
751.3825, 90.5007, -4125.1818, -3401.5071, -1773.0148, 3580.9504, -1026.1515,
-4575.1955, -4528.9902, -4734.4462, -3113.3524, -3921.1825, -1359.2626, -4439.4477,
-2605.3200])
{1: 5, 2: 9, 3: 10, 4: 13, 5: 0, 6: 0, 7: 1, 8: 0, 9: 2}
(cinq nombres de la liste commencent par 1, neuf nombres commencent par 2, etc.)
Corrigé
***************************************************************************
def frequence_des_premiers_chiffres(liste) :
d={c:0 for c in range(1,10)}
for x in liste :
c=premierChiffre(x)
if c != 0 :
d[premierChiffre(x)] += 1
return d
***************************************************************************
à rendre
Normalisation de la fréquence
Écrire une fonction
def pourcentage(dictionnaire) :
qui prend en argument un dictionnaire de nombres représentant une répartition de nombres
en plusieurs catégories (par exemple, les voix à une élection réparties par candidat, les
individus d’une population répartis par catégorie d’âge, des données numériques réparties
par premier chiffre significatif, etc.) et retourne un dictionnaire résultat contennant les
pourcentages correspondant à chacune de ces catégories.
Par exemple, pour le dictionnaire des résultats au premier tout des élections présidentielles de 2007 :
>>> pourcentage({"BESANCENOT":1498581, "BUFFET":707268, "SCHIVARDI":123540,
"BAYROU": 6820119, "BOVÉ": 483008, "VOYNET": 576666,
"VILLIERS": 818407, "ROYAL": 9500112, "NIHOUS": 420645,
"LE PEN": 3834530,"LAGUILLER": 487857,"SARKOZY": 11448663})
{'LE PEN': 10.44, 'LAGUILLER': 1.33, 'NIHOUS': 1.15, 'BESANCENOT': 4.08, '
SCHIVARDI': 0.34, 'ROYAL': 25.87, 'BUFFET': 1.93, 'SARKOZY': 31.18, 'BAYROU':
18.57, 'VOYNET': 1.57, 'VILLIERS': 2.23, 'BOVÉ': 1.32}
Corrigé
***************************************************************************
–4/7–
ISBS B1-ST01
TP no 4 (corrigé)
2016-2017
def pourcentage(dico) :
s=sum(dico[k] for k in dico.keys())
return {k:round(dico[k]*100/s,2) for k in dico.keys()}
***************************************************************************
à rendre
Histogramme
Écrire une fonction
def histo(dico)
qui affichera l’histogramme horizontal en pourcentages du dictionnaire argument. Par
exemple,
histo({'BESANCENOT': 1498581, 'SCHIVARDI': 123540, 'ROYAL': 9500112, 'BUFFET':
707268, 'BAYROU': 6820119, 'VOYNET': 576666, 'VILLIERS': 818407, 'LE PEN': 3834530,
'NIHOUS': 420645, 'LAGUILLER': 487857, 'BOVÉ': 483008, 'SARKOZY': 11448663})
BAYROU
(18.57%): ****************************
BESANCENOT ( 4.08%): ******
BOVÉ
( 1.32%): **
BUFFET
( 1.93%): ***
LAGUILLER ( 1.33%): **
LE PEN
(10.44%): ****************
NIHOUS
( 1.15%): **
ROYAL
(25.87%): ***************************************
SARKOZY
(31.18%): ***********************************************
SCHIVARDI ( 0.34%): *
VILLIERS
( 2.23%): ***
VOYNET
( 1.57%): **
Corrigé
***************************************************************************
def histo(dico) :
d=pourcentage(dico)
l=max(len(str(k)) for k in d.keys())
for k in sorted(d.keys()) :
print(("%-"+str(l)+"s (%5.2f%%): ")
print("*"*round(1.5*d[k]))
% (str(k),d[k]),end='')
***************************************************************************
Exercice 5. Vérification expérimentale de la loi de Benford
Laquelle des listes suivantes ne vérifie pas du tout le loi de Benford ?
Pourquoi ?
à rendre
superficie_pays_monde = [17075400, 9970610, 9596961, 9363520, 8547403, 7741220,
3287263, 2780400, 2724900, 2505813, 2381741, 2344858, 2149690, 1958201, 1919443,
1759540, 1633188, 1566500, 1285216, 1284000, 1267000, 1246700, 1240192, 1221037,
1138914, 1104300, 1098581, 1025520, 1001449, 923768, 912050, 883749, 824292,
801590, 796095, 774815, 756626, 752618, 676578, 652090, 637657, 622984, 603700,
587041, 581730, 580367, 551500, 537968, 513115, 505992, 488100, 475442, 462840,
449964, 447400, 446550, 438317, 406752, 390757, 377829, 357022, 342000, 338145,
331689, 329758, 323877, 323250, 322463, 301318, 300000, 283561, 274000, 270534,
267668, 245857, 242900, 241038, 238533, 238391, 236800, 214969, 212457, 207600,
199900, 196722, 185180, 181035, 175016, 163610, 163265, 147181, 143998, 143100,
–5/7–
ISBS B1-ST01
TP no 4 (corrigé)
2016-2017
131957, 130000, 120538, 118484, 117600, 112622, 112088, 111369, 110912, 110861,
108889, 103000, 102173, 99268, 97740, 93032, 91982, 86600, 83859, 83600, 78866,
75517, 71740, 70273, 69700, 65610, 65200, 64600, 56785, 56538, 51197, 51100, 49012,
48511, 47000, 45100, 43094, 41526, 41284, 36125, 36000, 33851, 30528, 30355,
29800, 28896, 28748, 28051, 27834, 27750, 26338, 25713, 23200, 22696, 21056, 21041,
20256, 18274, 17818, 17364, 13878, 12189, 11295, 11000, 10990, 10400, 9251, 5765,
5130, 4033, 2831, 2586, 2235, 2040, 964, 751, 747, 726, 702, 694, 622, 618, 468,
459, 455, 442, 430, 388, 344, 316, 298, 261, 181, 160, 61, 26, 21, 1, 0.44]
histo(frequence_des_premiers_chiffres(superficie_pays_monde))
1 (27.23%): *****************************************
2 (20.94%): *******************************
3 (10.99%): ****************
4 (10.99%): ****************
5 ( 6.81%): **********
6 ( 6.81%): **********
7 ( 6.81%): **********
8 ( 3.66%): *****
9 ( 5.76%): *********
population_pays_monde = [23897000, 45026000, 3166000, 31800000, 82476000,
13625000, 24217000, 38428000, 3061000, 19731000, 8116000, 8370000, 314000, 724000,
146736000, 270000, 10318000, 256000, 6736000, 2257000, 9895000, 49485000, 8808000,
4161000, 1785000, 178470000, 358000, 7897000, 13002000, 6825000, 14144000,
16018000, 31510000, 463000, 3865000, 15805000, 1304196000, 802000, 44222000,
768000, 52771000, 3724000, 22664000, 47700000, 4173000, 16631000, 4428000,
11300000, 5364000, 703000, 8745000, 71931000, 2995000, 13003000, 4141000, 41060000,
1323000, 294043000, 70678000, 839000, 5207000, 61911000, 1329000, 1426000,
5126000, 20922000, 59251000, 10976000, 12347000, 8480000, 1493000, 494000, 765000,
8326000, 6941000, 9877000, 1065462000, 219883000, 68920000, 25175000, 3956000,
290000, 6433000, 57423000, 2651000, 127654000, 5473000, 15433000, 31987000,
5138000, 2521000, 5657000, 1802000, 2307000, 3653000, 3367000, 5551000, 3444000,
453000, 2056000, 17404000, 24425000, 12105000, 318000, 13007000, 394000, 30566000,
1221000, 2893000, 103457000, 109000, 4267000, 2594000, 18863000, 1987000,
25164000, 5466000, 11972000, 124009000, 4533000, 3875000, 2851000, 25827000,
26093000, 153578000, 3120000, 5711000, 5878000, 16149000, 27167000, 79999000,
38587000, 10062000, 610000, 22334000, 143246000, 8387000, 149000, 120000, 477000,
6515000, 178000, 161000, 10095000, 10527000, 4971000, 4253000, 5402000, 1984000,
9890000, 33610000, 19065000, 8876000, 7169000, 436000, 1077000, 17800000, 6245000,
36977000, 8598000, 10236000, 62833000, 778000, 4909000, 104000, 1303000, 9832000,
4867000, 71325000, 48523000, 3415000, 212000, 25699000, 81377000, 20010000,
10812000, 12891000]
pib_par_habitant = [40756, 37100, 32988, 32918, 30449, 29926, 28811, 26673,
26226, 26012, 25587, 24323, 24322, 24249, 23967, 22982, 22119, 20349, 19291, 19162,
17340, 16858, 15407, 14052, 13935, 13489, 11939, 11481, 10704, 9851, 9229, 9207,
8540, 8320, 8253, 7118, 6989, 6908, 6803, 6500, 6257, 6215, 5476, 5312, 4966, 4833,
4727, 4692, 4675, 4106, 4101, 4092, 4088, 4011, 3777, 3621, 3588, 3569, 3424,
3308, 3268, 3224, 3134, 3123, 2972, 2899, 2850, 2794, 2612, 2530, 2522, 2492, 2203,
2138, 1996, 1959, 1921, 1883, 1875, 1860, 1826, 1819, 1754, 1751, 1696, 1649,
1620, 1582, 1508, 1485, 1409, 1402, 1347, 1315, 1280, 1240, 1235, 1192, 1140, 1080,
1058, 1038, 942, 913, 873, 867, 866, 849, 848, 836, 814, 774, 759, 723, 705, 623,
608, 542, 524, 524, 518, 508, 506, 502, 501, 496, 482, 462, 439, 419, 406, 403,
395, 391, 388, 385, 376, 370, 366, 363, 355, 354, 347, 342, 342, 340, 339, 324,
304, 288, 260, 257, 254, 254, 250, 250, 250, 240, 233, 230, 209, 202, 177, 168,
160, 144, 135, 133, 107]
production_ble = [275, 75, 153, 0.55, 144, 21348, 19007, 1760, 1120, 0.75, 4476,
2.8, 90, 362, 4745, 0.3, 515, 2345, 303, 0.9, 180, 1894, 2530, 8.27, 46871, 7735,
0.16, 159, 9283, 182, 991, 359, 19024, 3786, 14, 1.43, 364, 252, 51, 6.3, 1158,
–6/7–
ISBS B1-ST01
TP no 4 (corrigé)
2016-2017
6.12, 1, 139, 1180, 3275, 0.4, 3316, 9.6, 9.13, 2.24, 9, 246, 1076, 130, 61, 452,
51, 0.597, 1191, 180, 12500, 19.3, 700, 6510, 190, 760, 900, 9459, 68763, 5197, 1,
9.53, 2084, 11570, 306, 31572, 489, 1571, 53262, 133, 4938, 25.4, 19.6, 0.159,
6255, 4886, 965, 3, 117, 8.9, 27.5, 10.5, 93873, 1780, 20568, 0.4, 8.67, 3800,
3261, 0.5, 270, 117, 103, 1050, 20, 1442, 1673, 1500, 1508, 23760, 242, 15300,
1780, 4.2, 22838, 2011, 282, 2504]
superficie_departements = [5762, 7369, 7340, 6925, 5549, 4299, 5529, 5229, 4890,
6004, 6139, 8735, 609, 5087, 5548, 5726, 5956, 6864, 7235, 5857, 4014, 4666, 8763,
6878, 5565, 9060, 5324, 6530, 1804, 6040, 5880, 6733, 5853, 6309, 6257, 10000,
176, 6101, 6775, 6791, 6127, 7431, 4999, 9243, 6343, 4781, 4977, 6815, 6775, 5217,
5361, 5167, 7166, 5938, 8162, 6211, 5175, 5241, 6216, 6823, 6216, 6817, 5742, 5860,
6103, 105, 6672, 7970, 7645, 4464, 4116, 4755, 3525, 3249, 5360, 8627, 6206,
6028, 4388, 6278, 5915, 236, 5999, 6170, 5758, 3718, 245, 1246, 5973, 3567, 6720,
6990, 5520, 5875, 7427, 2284]
population_departements = [515270, 535842, 344721, 139561, 121419, 1011326,
286023, 290130, 137205, 292131, 309770, 263808, 137408, 1835719, 648385, 150778,
339628, 557024, 314428, 232576, 118593, 141603, 506755, 542373, 124470, 388293,
499062, 437778, 1134238, 541054, 407665, 852418, 623125, 1046338, 172335, 1287334,
1428881, 896441, 867533, 231139, 554003, 1094006, 250857, 327334, 314968, 728524,
209113, 1134266, 618126, 160197, 305380, 73509, 732942, 481471, 565229, 194873,
285338, 713779, 192198, 643873, 1023447, 225198, 2555020, 766441, 292337, 2125246,
1441568, 604266, 600018, 222368, 392803, 1026120, 708025, 1578869, 229732, 544893,
529851, 373258, 631679, 1239138, 1193767, 1382861, 344392, 555551, 343402, 206034,
1227250, 1105464, 898441, 499685, 539664, 399024, 353893, 380952, 333221, 1354304]
taux_inflation = [5.7, 3.1, 4.2, 1.1, 152.6, 1, -0.8, -1.1, 3.2, 1.5, 2, -1.2,
1.9, 2.2, 1.2, 4, 5, 61.3, 15, 1.6, 3.3, 7.2, 6.8, 1.1, 7.5, 4.9, 9.3, 0.2, 2.8,
2.1, 3.7, 3.8, 3.6, 0.7, 8, 5, 357.9, -0.5, 11.3, 4.4, 4.9, 1.8, 8.9, 1.8, 2.4,
0.9, 37.7, 14.6, 5.8, 2.3, -7.1, 2.3, 1.4, 2.1, 4, 4.7, 32.9, 2.1, 2.5, 8.7, 5.4,
3.3, 12, 2.7, 16.7, 9.7, 9.2, 3.8, 11.5, 11.4, 1.8, 5, -0.6, 1.8, 8.3, 5.8, 7, 7.7,
2.5, 8, 6.9, 2.5, -0.4, -8.5, 1.3, 5.3, 5, 1.4, 27.2, 3.7,
5.2, 2.9, 0.6, 4.4, 4.7, 6.4, 9.8, 8, 9, 13.4, 2.4, 7.4, 4, 18.9, -1.1, 4.6,
27.2, 3.1, 10.2, 7.7, 2, 6.1, 5.5, -0.7, 34.5, 20.7, 3.4, 2.5, 2.1, 0.8, 7, 0.1, 4,
9.5, 3, -0.1, 2.2, 7.3, 8.4, 5, 14.2, 42.3, 7.5, 1, 38.6, 5.2, 12.4, 4.7, 1.7,
6.8, 7, 2.5, 1.9, 11.3, 54.4, 12, 4.4, 2, 12.5, 0.1, 11.9, 21.7, 76.7]
Source : Encyclopédie Universelle Larousse 2003 — www.statistiques-mondiales.com
–7/7–

Documents pareils