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–