[{"data":1,"prerenderedAt":1056},["ShallowReactive",2],{"page-\u002Fpython\u002Ffichiers-et-exceptions":3,"pieces-python":1013,"autour-\u002Fpython\u002Ffichiers-et-exceptions":1038,"prerequis-\u002Fpython\u002Ffichiers-et-exceptions":1043,"plan-python":1045},{"id":4,"title":5,"body":6,"description":980,"extension":981,"ligne":57,"meta":982,"motsCles":983,"navigation":748,"niveau":986,"path":987,"prerequis":988,"ressources":990,"seo":1002,"sources":1003,"stem":1011,"__hash__":1012},"docs\u002Fpython\u002F05.fichiers-et-exceptions.md","Fichiers, exceptions et JSON",{"type":7,"value":8,"toc":969},"minimark",[9,14,36,40,52,140,159,168,172,226,241,257,261,268,285,292,296,305,387,394,398,409,472,475,550,554,567,648,655,716,720,731,893,911,915,965],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,21,33],"ul",{},[18,19,20],"li",{},"Lire et écrire un fichier texte sans risquer de le laisser ouvert.",[18,22,23,24,28,29,32],{},"Intercepter une erreur avec ",[25,26,27],"code",{},"try"," et ",[25,30,31],{},"except"," au lieu de planter.",[18,34,35],{},"Enregistrer et recharger un dictionnaire au format JSON.",[10,37,39],{"id":38},"écrire-un-fichier","Écrire un fichier",[41,42,43,44,47,48,51],"p",{},"On ouvre un fichier avec ",[25,45,46],{},"open()",". Le mot-clé ",[25,49,50],{},"with"," garantit qu'il est refermé à la fin du bloc, même en cas d'erreur.",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-python shiki shiki-themes github-light-default github-dark-default github-dark-default","with open(\"courses.txt\", \"w\", encoding=\"utf-8\") as f:\n    f.write(\"farine\\n\")\n    f.write(\"oeufs\\n\")\n","python","",[25,60,61,108,126],{"__ignoreMap":58},[62,63,66,69,73,77,81,84,87,89,93,96,99,102,105],"span",{"class":64,"line":65},"line",1,[62,67,50],{"class":68},"sOnC1",[62,70,72],{"class":71},"s5iOY"," open",[62,74,76],{"class":75},"scfrF","(",[62,78,80],{"class":79},"shWOn","\"courses.txt\"",[62,82,83],{"class":75},", ",[62,85,86],{"class":79},"\"w\"",[62,88,83],{"class":75},[62,90,92],{"class":91},"sIXEE","encoding",[62,94,95],{"class":68},"=",[62,97,98],{"class":79},"\"utf-8\"",[62,100,101],{"class":75},") ",[62,103,104],{"class":68},"as",[62,106,107],{"class":75}," f:\n",[62,109,111,114,117,120,123],{"class":64,"line":110},2,[62,112,113],{"class":75},"    f.write(",[62,115,116],{"class":79},"\"farine",[62,118,119],{"class":68},"\\n",[62,121,122],{"class":79},"\"",[62,124,125],{"class":75},")\n",[62,127,129,131,134,136,138],{"class":64,"line":128},3,[62,130,113],{"class":75},[62,132,133],{"class":79},"\"oeufs",[62,135,119],{"class":68},[62,137,122],{"class":79},[62,139,125],{"class":75},[41,141,142,143,147,148,150,151,154,155,158],{},"Le deuxième argument est le ",[144,145,146],"strong",{},"mode"," : ",[25,149,86],{}," écrit en effaçant le contenu existant, ",[25,152,153],{},"\"a\""," ajoute à la fin, ",[25,156,157],{},"\"r\""," lit. Le mode par défaut est la lecture.",[41,160,161,164,165,167],{},[25,162,163],{},"encoding=\"utf-8\""," évite les problèmes avec les accents. Le ",[25,166,119],{}," marque un retour à la ligne.",[10,169,171],{"id":170},"lire-un-fichier","Lire un fichier",[53,173,175],{"className":55,"code":174,"language":57,"meta":58,"style":58},"with open(\"courses.txt\", \"r\", encoding=\"utf-8\") as f:\n    for ligne in f:\n        print(ligne.strip())\n",[25,176,177,205,218],{"__ignoreMap":58},[62,178,179,181,183,185,187,189,191,193,195,197,199,201,203],{"class":64,"line":65},[62,180,50],{"class":68},[62,182,72],{"class":71},[62,184,76],{"class":75},[62,186,80],{"class":79},[62,188,83],{"class":75},[62,190,157],{"class":79},[62,192,83],{"class":75},[62,194,92],{"class":91},[62,196,95],{"class":68},[62,198,98],{"class":79},[62,200,101],{"class":75},[62,202,104],{"class":68},[62,204,107],{"class":75},[62,206,207,210,213,216],{"class":64,"line":110},[62,208,209],{"class":68},"    for",[62,211,212],{"class":75}," ligne ",[62,214,215],{"class":68},"in",[62,217,107],{"class":75},[62,219,220,223],{"class":64,"line":128},[62,221,222],{"class":71},"        print",[62,224,225],{"class":75},"(ligne.strip())\n",[41,227,228,229,232,233,236,237,240],{},"Le fichier se parcourt ligne par ligne avec ",[25,230,231],{},"for",". ",[25,234,235],{},"strip()"," retire le retour à la ligne de fin. Pour tout récupérer d'un coup, ",[25,238,239],{},"f.read()"," renvoie un seul texte.",[242,243,244],"note",{},[41,245,246,247,249,250,252,253,256],{},"Le chemin ",[25,248,80],{}," est relatif au dossier d'où tu lances ",[25,251,57],{},", pas à celui du script. Le module ",[25,254,255],{},"pathlib"," offre une manière plus sûre de construire des chemins.",[10,258,260],{"id":259},"les-exceptions","Les exceptions",[41,262,263,264,267],{},"Quand quelque chose échoue, Python lève une ",[144,265,266],{},"exception"," et arrête le programme. Essaie de lire un fichier absent :",[53,269,271],{"className":55,"code":270,"language":57,"meta":58,"style":58},"open(\"inconnu.txt\")\n",[25,272,273],{"__ignoreMap":58},[62,274,275,278,280,283],{"class":64,"line":65},[62,276,277],{"class":71},"open",[62,279,76],{"class":75},[62,281,282],{"class":79},"\"inconnu.txt\"",[62,284,125],{"class":75},[41,286,287,288,291],{},"Python s'arrête avec une erreur ",[25,289,290],{},"FileNotFoundError",". Le nom de l'exception dit ce qui s'est passé : lis toujours la dernière ligne du message.",[10,293,295],{"id":294},"try-et-except","try et except",[41,297,298,299,301,302,304],{},"Un bloc ",[25,300,27],{}," tente une action, et ",[25,303,31],{}," réagit si une exception précise survient.",[53,306,308],{"className":55,"code":307,"language":57,"meta":58,"style":58},"try:\n    with open(\"recettes.txt\", encoding=\"utf-8\") as f:\n        contenu = f.read()\nexcept FileNotFoundError:\n    print(\"Le fichier n'existe pas encore\")\n    contenu = \"\"\n",[25,309,310,317,343,353,363,376],{"__ignoreMap":58},[62,311,312,314],{"class":64,"line":65},[62,313,27],{"class":68},[62,315,316],{"class":75},":\n",[62,318,319,322,324,326,329,331,333,335,337,339,341],{"class":64,"line":110},[62,320,321],{"class":68},"    with",[62,323,72],{"class":71},[62,325,76],{"class":75},[62,327,328],{"class":79},"\"recettes.txt\"",[62,330,83],{"class":75},[62,332,92],{"class":91},[62,334,95],{"class":68},[62,336,98],{"class":79},[62,338,101],{"class":75},[62,340,104],{"class":68},[62,342,107],{"class":75},[62,344,345,348,350],{"class":64,"line":128},[62,346,347],{"class":75},"        contenu ",[62,349,95],{"class":68},[62,351,352],{"class":75}," f.read()\n",[62,354,356,358,361],{"class":64,"line":355},4,[62,357,31],{"class":68},[62,359,360],{"class":71}," FileNotFoundError",[62,362,316],{"class":75},[62,364,366,369,371,374],{"class":64,"line":365},5,[62,367,368],{"class":71},"    print",[62,370,76],{"class":75},[62,372,373],{"class":79},"\"Le fichier n'existe pas encore\"",[62,375,125],{"class":75},[62,377,379,382,384],{"class":64,"line":378},6,[62,380,381],{"class":75},"    contenu ",[62,383,95],{"class":68},[62,385,386],{"class":79}," \"\"\n",[41,388,389,390,393],{},"Le programme continue au lieu de planter. Nomme toujours l'exception attendue : un ",[25,391,392],{},"except:"," seul masquerait aussi tes vraies erreurs.",[10,395,397],{"id":396},"saisie-invalide","Saisie invalide",[41,399,400,401,404,405,408],{},"Reprenons le ",[25,402,403],{},"int(input())"," du premier cours. Une saisie incorrecte lève une ",[25,406,407],{},"ValueError",".",[53,410,412],{"className":55,"code":411,"language":57,"meta":58,"style":58},"try:\n    portions = int(input(\"Portions ? \"))\nexcept ValueError:\n    print(\"Entre un nombre entier\")\n    portions = 4\n",[25,413,414,420,443,452,463],{"__ignoreMap":58},[62,415,416,418],{"class":64,"line":65},[62,417,27],{"class":68},[62,419,316],{"class":75},[62,421,422,425,427,430,432,435,437,440],{"class":64,"line":110},[62,423,424],{"class":75},"    portions ",[62,426,95],{"class":68},[62,428,429],{"class":71}," int",[62,431,76],{"class":75},[62,433,434],{"class":71},"input",[62,436,76],{"class":75},[62,438,439],{"class":79},"\"Portions ? \"",[62,441,442],{"class":75},"))\n",[62,444,445,447,450],{"class":64,"line":128},[62,446,31],{"class":68},[62,448,449],{"class":71}," ValueError",[62,451,316],{"class":75},[62,453,454,456,458,461],{"class":64,"line":355},[62,455,368],{"class":71},[62,457,76],{"class":75},[62,459,460],{"class":79},"\"Entre un nombre entier\"",[62,462,125],{"class":75},[62,464,465,467,469],{"class":64,"line":365},[62,466,424],{"class":75},[62,468,95],{"class":68},[62,470,471],{"class":71}," 4\n",[41,473,474],{},"Quelques exceptions courantes :",[476,477,478,491],"table",{},[479,480,481],"thead",{},[482,483,484,488],"tr",{},[485,486,487],"th",{},"Exception",[485,489,490],{},"Cause typique",[492,493,494,508,521,531,541],"tbody",{},[482,495,496,501],{},[497,498,499],"td",{},[25,500,407],{},[497,502,503,504,507],{},"Valeur du bon type mais inutilisable (",[25,505,506],{},"int(\"abc\")",").",[482,509,510,515],{},[497,511,512],{},[25,513,514],{},"TypeError",[497,516,517,518,507],{},"Opération sur un mauvais type (",[25,519,520],{},"\"a\" + 1",[482,522,523,528],{},[497,524,525],{},[25,526,527],{},"KeyError",[497,529,530],{},"Clé absente d'un dictionnaire.",[482,532,533,538],{},[497,534,535],{},[25,536,537],{},"IndexError",[497,539,540],{},"Indice hors de la liste.",[482,542,543,547],{},[497,544,545],{},[25,546,290],{},[497,548,549],{},"Fichier introuvable.",[10,551,553],{"id":552},"else-finally-et-raise","else, finally et raise",[41,555,556,557,232,559,562,563,566],{},"Deux clauses facultatives complètent ",[25,558,27],{},[25,560,561],{},"else"," s'exécute si aucune exception n'a eu lieu, ",[25,564,565],{},"finally"," s'exécute dans tous les cas.",[53,568,570],{"className":55,"code":569,"language":57,"meta":58,"style":58},"try:\n    portions = int(\"4\")\nexcept ValueError:\n    print(\"Invalide\")\nelse:\n    print(\"Conversion réussie\")\nfinally:\n    print(\"Terminé\")\n",[25,571,572,578,593,601,612,618,629,636],{"__ignoreMap":58},[62,573,574,576],{"class":64,"line":65},[62,575,27],{"class":68},[62,577,316],{"class":75},[62,579,580,582,584,586,588,591],{"class":64,"line":110},[62,581,424],{"class":75},[62,583,95],{"class":68},[62,585,429],{"class":71},[62,587,76],{"class":75},[62,589,590],{"class":79},"\"4\"",[62,592,125],{"class":75},[62,594,595,597,599],{"class":64,"line":128},[62,596,31],{"class":68},[62,598,449],{"class":71},[62,600,316],{"class":75},[62,602,603,605,607,610],{"class":64,"line":355},[62,604,368],{"class":71},[62,606,76],{"class":75},[62,608,609],{"class":79},"\"Invalide\"",[62,611,125],{"class":75},[62,613,614,616],{"class":64,"line":365},[62,615,561],{"class":68},[62,617,316],{"class":75},[62,619,620,622,624,627],{"class":64,"line":378},[62,621,368],{"class":71},[62,623,76],{"class":75},[62,625,626],{"class":79},"\"Conversion réussie\"",[62,628,125],{"class":75},[62,630,632,634],{"class":64,"line":631},7,[62,633,565],{"class":68},[62,635,316],{"class":75},[62,637,639,641,643,646],{"class":64,"line":638},8,[62,640,368],{"class":71},[62,642,76],{"class":75},[62,644,645],{"class":79},"\"Terminé\"",[62,647,125],{"class":75},[41,649,650,651,654],{},"Pour signaler toi-même une erreur, utilise ",[25,652,653],{},"raise"," :",[53,656,658],{"className":55,"code":657,"language":57,"meta":58,"style":58},"def diviser_recette(portions):\n    if portions \u003C= 0:\n        raise ValueError(\"Il faut au moins une portion\")\n    return 1 \u002F portions\n",[25,659,660,672,688,702],{"__ignoreMap":58},[62,661,662,665,669],{"class":64,"line":65},[62,663,664],{"class":68},"def",[62,666,668],{"class":667},"syCW7"," diviser_recette",[62,670,671],{"class":75},"(portions):\n",[62,673,674,677,680,683,686],{"class":64,"line":110},[62,675,676],{"class":68},"    if",[62,678,679],{"class":75}," portions ",[62,681,682],{"class":68},"\u003C=",[62,684,685],{"class":71}," 0",[62,687,316],{"class":75},[62,689,690,693,695,697,700],{"class":64,"line":128},[62,691,692],{"class":68},"        raise",[62,694,449],{"class":71},[62,696,76],{"class":75},[62,698,699],{"class":79},"\"Il faut au moins une portion\"",[62,701,125],{"class":75},[62,703,704,707,710,713],{"class":64,"line":355},[62,705,706],{"class":68},"    return",[62,708,709],{"class":71}," 1",[62,711,712],{"class":68}," \u002F",[62,714,715],{"class":75}," portions\n",[10,717,719],{"id":718},"sauvegarder-en-json","Sauvegarder en JSON",[41,721,722,723,726,727,730],{},"Le ",[144,724,725],{},"JSON"," est un format texte pour échanger des données, très répandu sur le web. Le module ",[25,728,729],{},"json"," convertit un dictionnaire en JSON et inversement.",[53,732,734],{"className":55,"code":733,"language":57,"meta":58,"style":58},"import json\n\nrecette = {\"nom\": \"Crêpes\", \"portions\": 4}\n\nwith open(\"recette.json\", \"w\", encoding=\"utf-8\") as f:\n    json.dump(recette, f, ensure_ascii=False, indent=2)\n\nwith open(\"recette.json\", encoding=\"utf-8\") as f:\n    relue = json.load(f)\nprint(relue[\"nom\"])\n",[25,735,736,744,750,782,786,815,840,844,868,879],{"__ignoreMap":58},[62,737,738,741],{"class":64,"line":65},[62,739,740],{"class":68},"import",[62,742,743],{"class":75}," json\n",[62,745,746],{"class":64,"line":110},[62,747,749],{"emptyLinePlaceholder":748},true,"\n",[62,751,752,755,757,760,763,766,769,771,774,776,779],{"class":64,"line":128},[62,753,754],{"class":75},"recette ",[62,756,95],{"class":68},[62,758,759],{"class":75}," {",[62,761,762],{"class":79},"\"nom\"",[62,764,765],{"class":75},": ",[62,767,768],{"class":79},"\"Crêpes\"",[62,770,83],{"class":75},[62,772,773],{"class":79},"\"portions\"",[62,775,765],{"class":75},[62,777,778],{"class":71},"4",[62,780,781],{"class":75},"}\n",[62,783,784],{"class":64,"line":355},[62,785,749],{"emptyLinePlaceholder":748},[62,787,788,790,792,794,797,799,801,803,805,807,809,811,813],{"class":64,"line":365},[62,789,50],{"class":68},[62,791,72],{"class":71},[62,793,76],{"class":75},[62,795,796],{"class":79},"\"recette.json\"",[62,798,83],{"class":75},[62,800,86],{"class":79},[62,802,83],{"class":75},[62,804,92],{"class":91},[62,806,95],{"class":68},[62,808,98],{"class":79},[62,810,101],{"class":75},[62,812,104],{"class":68},[62,814,107],{"class":75},[62,816,817,820,823,825,828,830,833,835,838],{"class":64,"line":378},[62,818,819],{"class":75},"    json.dump(recette, f, ",[62,821,822],{"class":91},"ensure_ascii",[62,824,95],{"class":68},[62,826,827],{"class":71},"False",[62,829,83],{"class":75},[62,831,832],{"class":91},"indent",[62,834,95],{"class":68},[62,836,837],{"class":71},"2",[62,839,125],{"class":75},[62,841,842],{"class":64,"line":631},[62,843,749],{"emptyLinePlaceholder":748},[62,845,846,848,850,852,854,856,858,860,862,864,866],{"class":64,"line":638},[62,847,50],{"class":68},[62,849,72],{"class":71},[62,851,76],{"class":75},[62,853,796],{"class":79},[62,855,83],{"class":75},[62,857,92],{"class":91},[62,859,95],{"class":68},[62,861,98],{"class":79},[62,863,101],{"class":75},[62,865,104],{"class":68},[62,867,107],{"class":75},[62,869,871,874,876],{"class":64,"line":870},9,[62,872,873],{"class":75},"    relue ",[62,875,95],{"class":68},[62,877,878],{"class":75}," json.load(f)\n",[62,880,882,885,888,890],{"class":64,"line":881},10,[62,883,884],{"class":71},"print",[62,886,887],{"class":75},"(relue[",[62,889,762],{"class":79},[62,891,892],{"class":75},"])\n",[41,894,895,898,899,902,903,906,907,910],{},[25,896,897],{},"json.dump"," écrit, ",[25,900,901],{},"json.load"," lit. ",[25,904,905],{},"indent=2"," rend le fichier lisible et ",[25,908,909],{},"ensure_ascii=False"," garde les accents tels quels. Le programme affiche « Crêpes ».",[10,912,914],{"id":913},"à-retenir","À retenir",[15,916,917,923,935,944,958],{},[18,918,919,922],{},[25,920,921],{},"with open(chemin, mode, encoding=\"utf-8\") as f:"," ouvre un fichier et le referme tout seul.",[18,924,925,926,928,929,931,932,934],{},"Les modes courants sont ",[25,927,157],{}," (lire), ",[25,930,86],{}," (écrire en effaçant) et ",[25,933,153],{}," (ajouter).",[18,936,937,939,940,943],{},[25,938,27],{}," tente une action, ",[25,941,942],{},"except NomErreur"," la rattrape ; nomme toujours l'exception.",[18,945,946,948,949,951,952,954,955,957],{},[25,947,561],{}," suit un ",[25,950,27],{}," réussi, ",[25,953,565],{}," s'exécute dans tous les cas, ",[25,956,653],{}," lève une erreur.",[18,959,960,28,962,964],{},[25,961,897],{},[25,963,901],{}," sauvegardent et rechargent un dictionnaire.",[966,967,968],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}",{"title":58,"searchDepth":110,"depth":128,"links":970},[971,972,973,974,975,976,977,978,979],{"id":12,"depth":110,"text":13},{"id":38,"depth":110,"text":39},{"id":170,"depth":110,"text":171},{"id":259,"depth":110,"text":260},{"id":294,"depth":110,"text":295},{"id":396,"depth":110,"text":397},{"id":552,"depth":110,"text":553},{"id":718,"depth":110,"text":719},{"id":913,"depth":110,"text":914},"Lire et écrire des fichiers avec with open, gérer les erreurs avec try et except, et sauvegarder des données au format JSON.","md",{},[984,985,27,31,565,653,729,255,290,266],"with open","encodage","intermediaire","\u002Fpython\u002Ffichiers-et-exceptions",[989],"\u002Fpython\u002Fcollections",[991,995,998],{"nom":992,"url":993,"type":994},"Le tutoriel officiel Python, erreurs et exceptions","https:\u002F\u002Fdocs.python.org\u002Ffr\u002F3\u002Ftutorial\u002Ferrors.html","doc",{"nom":996,"url":997,"type":994},"Le tutoriel officiel Python, lire et écrire des fichiers","https:\u002F\u002Fdocs.python.org\u002Ffr\u002F3\u002Ftutorial\u002Finputoutput.html",{"nom":999,"url":1000,"type":1001},"OpenClassrooms, Apprenez les bases du langage Python","https:\u002F\u002Fopenclassrooms.com\u002Ffr\u002Fcourses\u002F7168871-apprenez-les-bases-du-langage-python","cours",{"title":5,"description":980},[1004,1006,1008],{"nom":1005,"url":997},"Documentation de Python, lire et écrire des fichiers",{"nom":1007,"url":993},"Documentation de Python, erreurs et exceptions",{"nom":1009,"url":1010},"Documentation de Python, le module json","https:\u002F\u002Fdocs.python.org\u002Ffr\u002F3\u002Flibrary\u002Fjson.html","python\u002F05.fichiers-et-exceptions","mnwkUzTpcRrG8-Ee0-q-czVs_itZVy-C-6LDUUjk7Pc",[1014,1018,1022,1026,1029,1030,1034],{"path":1015,"title":1016,"stem":1017},"\u002Fpython\u002Fpremiers-pas","Premiers pas avec Python","python\u002F01.premiers-pas",{"path":1019,"title":1020,"stem":1021},"\u002Fpython\u002Fconditions-et-boucles","Conditions et boucles","python\u002F02.conditions-et-boucles",{"path":1023,"title":1024,"stem":1025},"\u002Fpython\u002Ffonctions-et-modules","Fonctions et modules","python\u002F03.fonctions-et-modules",{"path":989,"title":1027,"stem":1028},"Listes, dictionnaires et tuples","python\u002F04.collections",{"path":987,"title":5,"stem":1011},{"path":1031,"title":1032,"stem":1033},"\u002Fpython\u002Fclasses-et-environnements","Classes, annotations et environnements virtuels","python\u002F06.classes-et-environnements",{"path":1035,"title":1036,"stem":1037},"\u002Fpython","Python","python\u002Findex",[1039,1041],{"title":1027,"path":989,"stem":1028,"description":1040,"children":-1},"Regrouper des valeurs avec les listes, les dictionnaires et les tuples, puis les transformer avec les compréhensions.",{"title":1032,"path":1031,"stem":1033,"description":1042,"children":-1},"Modéliser des objets avec les classes, documenter les types avec les annotations, et isoler chaque projet avec venv et pip.",[1044],{"path":989,"title":1027,"ligne":57},[1046,1048,1049,1050,1051,1052,1054],{"path":1015,"title":1016,"niveau":1047,"stem":1017},"debutant",{"path":1019,"title":1020,"niveau":1047,"stem":1021},{"path":1023,"title":1024,"niveau":1047,"stem":1025},{"path":989,"title":1027,"niveau":986,"stem":1028},{"path":987,"title":5,"niveau":986,"stem":1011},{"path":1031,"title":1032,"niveau":1053,"stem":1033},"avance",{"path":1035,"title":1036,"niveau":1055,"stem":1037},"memo",1794583459927]