Python : fonctions, tests et documentation
Transcription
Python : fonctions, tests et documentation
TP no 4 ISBS B1-ST01 2016-2017 Python : fonctions, tests et documentation 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]) • 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. 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) 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 –1/5– ISBS B1-ST01 TP no 4 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 à rendre Fréquence des premiers chiffres dans une liste Écrire une fonction 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} –2/5– ISBS B1-ST01 TP no 4 2016-2017 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.) à 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} à 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%): ** –3/5– ISBS B1-ST01 TP no 4 2016-2017 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, 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] –4/5– ISBS B1-ST01 TP no 4 2016-2017 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.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 –5/5–