[{"data":1,"prerenderedAt":2731},["ShallowReactive",2],{"navigation":3,"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point":585,"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point__counterpart":1542,"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point__slides":1819,"annexes-memo:\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point":2202,"annexes-slides:\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point":2416},[4,224,440],{"title":5,"path":6,"stem":7,"children":8},"SNT — Seconde","\u002Fsnt-2nde","0.snt-2nde\u002F0.index",[9,10,14,36,66,92,118,144,162,184,206],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"REVIEW pédagogique — SNT 2nde","\u002Fsnt-2nde\u002Freview","0.snt-2nde\u002FREVIEW",{"title":15,"path":16,"stem":17,"children":18},"Internet","\u002Fsnt-2nde\u002Fsa-internet","0.snt-2nde\u002Fsa-internet\u002F0.index",[19,20,24,28,32],{"title":15,"path":16,"stem":17},{"title":21,"path":22,"stem":23},"Adresses symboliques et DNS","\u002Fsnt-2nde\u002Fsa-internet\u002Fadresses-dns","0.snt-2nde\u002Fsa-internet\u002F1.adresses-dns",{"title":25,"path":26,"stem":27},"Internet et les réseaux physiques","\u002Fsnt-2nde\u002Fsa-internet\u002Freseaux-physiques","0.snt-2nde\u002Fsa-internet\u002F2.reseaux-physiques",{"title":29,"path":30,"stem":31},"Protocoles TCP\u002FIP et routage des paquets","\u002Fsnt-2nde\u002Fsa-internet\u002Ftcp-ip-routage","0.snt-2nde\u002Fsa-internet\u002F3.tcp-ip-routage",{"title":33,"path":34,"stem":35},"Réseaux pair-à-pair","\u002Fsnt-2nde\u002Fsa-internet\u002Fpair-a-pair","0.snt-2nde\u002Fsa-internet\u002F4.pair-a-pair",{"title":37,"path":38,"stem":39,"children":40},"Le Web","\u002Fsnt-2nde\u002Fsb-web","0.snt-2nde\u002Fsb-web\u002F0.index",[41,42,46,50,54,58,62],{"title":37,"path":38,"stem":39},{"title":43,"path":44,"stem":45},"Histoire du Web","\u002Fsnt-2nde\u002Fsb-web\u002Fhistoire-web","0.snt-2nde\u002Fsb-web\u002F1.histoire-web",{"title":47,"path":48,"stem":49},"URL et hypertexte","\u002Fsnt-2nde\u002Fsb-web\u002Furl-hypertexte","0.snt-2nde\u002Fsb-web\u002F2.url-hypertexte",{"title":51,"path":52,"stem":53},"HTML et CSS — le contenu et la présentation","\u002Fsnt-2nde\u002Fsb-web\u002Fhtml-css","0.snt-2nde\u002Fsb-web\u002F3.html-css",{"title":55,"path":56,"stem":57},"Client-serveur et requêtes HTTP","\u002Fsnt-2nde\u002Fsb-web\u002Fclient-serveur-http","0.snt-2nde\u002Fsb-web\u002F4.client-serveur-http",{"title":59,"path":60,"stem":61},"Moteurs de recherche","\u002Fsnt-2nde\u002Fsb-web\u002Fmoteurs-recherche","0.snt-2nde\u002Fsb-web\u002F5.moteurs-recherche",{"title":63,"path":64,"stem":65},"Sécurité du navigateur et notions juridiques","\u002Fsnt-2nde\u002Fsb-web\u002Fsecurite-droits","0.snt-2nde\u002Fsb-web\u002F6.securite-droits",{"title":67,"path":68,"stem":69,"children":70},"Les réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F0.index",[71,72,76,80,84,88],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75},"Panorama des réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fpanorama-rs","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F1.panorama-rs",{"title":77,"path":78,"stem":79},"Identité numérique et authentification","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fidentite-numerique","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F2.identite-numerique",{"title":81,"path":82,"stem":83},"Le modèle économique des réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fmodele-economique","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F3.modele-economique",{"title":85,"path":86,"stem":87},"Petit monde et graphes","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fpetit-monde-graphes","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F4.petit-monde-graphes",{"title":89,"path":90,"stem":91},"La cyberviolence","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fcyberviolence","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F5.cyberviolence",{"title":93,"path":94,"stem":95,"children":96},"Les données structurées et leur traitement","\u002Fsnt-2nde\u002Fsd-donnees-structurees","0.snt-2nde\u002Fsd-donnees-structurees\u002F0.index",[97,98,102,106,110,114],{"title":93,"path":94,"stem":95},{"title":99,"path":100,"stem":101},"Données et formats","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fdonnees-formats","0.snt-2nde\u002Fsd-donnees-structurees\u002F1.donnees-formats",{"title":103,"path":104,"stem":105},"Données structurées","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fdonnees-structurees","0.snt-2nde\u002Fsd-donnees-structurees\u002F2.donnees-structurees",{"title":107,"path":108,"stem":109},"Métadonnées","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fmetadonnees","0.snt-2nde\u002Fsd-donnees-structurees\u002F3.metadonnees",{"title":111,"path":112,"stem":113},"Traitement de tables","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Ftraitement-tables","0.snt-2nde\u002Fsd-donnees-structurees\u002F4.traitement-tables",{"title":115,"path":116,"stem":117},"Le cloud","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fcloud","0.snt-2nde\u002Fsd-donnees-structurees\u002F5.cloud",{"title":119,"path":120,"stem":121,"children":122},"Localisation, cartographie et mobilité","\u002Fsnt-2nde\u002Fse-localisation-cartographie","0.snt-2nde\u002Fse-localisation-cartographie\u002F0.index",[123,124,128,132,136,140],{"title":119,"path":120,"stem":121},{"title":125,"path":126,"stem":127},"GPS et Galileo — se situer grâce aux satellites","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fgps-galileo","0.snt-2nde\u002Fse-localisation-cartographie\u002F1.gps-galileo",{"title":129,"path":130,"stem":131},"Décoder une trame NMEA","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Ftrame-nmea","0.snt-2nde\u002Fse-localisation-cartographie\u002F2.trame-nmea",{"title":133,"path":134,"stem":135},"Cartes numériques — GeoPortail et OpenStreetMap","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fcartes-numeriques","0.snt-2nde\u002Fse-localisation-cartographie\u002F3.cartes-numeriques",{"title":137,"path":138,"stem":139},"Itinéraires et graphes","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fitineraires-graphes","0.snt-2nde\u002Fse-localisation-cartographie\u002F4.itineraires-graphes",{"title":141,"path":142,"stem":143},"Confidentialité de la position","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fconfidentialite-position","0.snt-2nde\u002Fse-localisation-cartographie\u002F5.confidentialite-position",{"title":145,"path":146,"stem":147,"children":148},"Informatique embarquée et objets connectés","\u002Fsnt-2nde\u002Fsf-info-embarquee","0.snt-2nde\u002Fsf-info-embarquee\u002F0.index",[149,150,154,158],{"title":145,"path":146,"stem":147},{"title":151,"path":152,"stem":153},"Systèmes informatiques embarqués","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fsystemes-embarques","0.snt-2nde\u002Fsf-info-embarquee\u002F1.systemes-embarques",{"title":155,"path":156,"stem":157},"Capteurs et actionneurs","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fcapteurs-actionneurs","0.snt-2nde\u002Fsf-info-embarquee\u002F2.capteurs-actionneurs",{"title":159,"path":160,"stem":161},"IHM et objets connectés","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fihm-objet-connecte","0.snt-2nde\u002Fsf-info-embarquee\u002F3.ihm-objet-connecte",{"title":163,"path":164,"stem":165,"children":166},"Photographie numérique","\u002Fsnt-2nde\u002Fsg-photo-numerique","0.snt-2nde\u002Fsg-photo-numerique\u002F0.index",[167,168,172,176,180],{"title":163,"path":164,"stem":165},{"title":169,"path":170,"stem":171},"Photosites, pixels et résolution","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Fpixels-resolution","0.snt-2nde\u002Fsg-photo-numerique\u002F1.pixels-resolution",{"title":173,"path":174,"stem":175},"Les algorithmes de l'appareil photo","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Falgorithmes-photo","0.snt-2nde\u002Fsg-photo-numerique\u002F2.algorithmes-photo",{"title":177,"path":178,"stem":179},"Les métadonnées EXIF","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Fmetadonnees-exif","0.snt-2nde\u002Fsg-photo-numerique\u002F3.metadonnees-exif",{"title":181,"path":182,"stem":183},"Traiter une image en Python","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Ftraitement-rgb","0.snt-2nde\u002Fsg-photo-numerique\u002F4.traitement-rgb",{"title":185,"path":186,"stem":187,"children":188},"Notions transversales de programmation","\u002Fsnt-2nde\u002Fsh-prog-notions","0.snt-2nde\u002Fsh-prog-notions\u002F0.index",[189,190,194,198,202],{"title":185,"path":186,"stem":187},{"title":191,"path":192,"stem":193},"Séquences d'instructions et variables","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fsequences-affectations","0.snt-2nde\u002Fsh-prog-notions\u002F1.sequences-affectations",{"title":195,"path":196,"stem":197},"Instructions conditionnelles","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fconditionnelles","0.snt-2nde\u002Fsh-prog-notions\u002F2.conditionnelles",{"title":199,"path":200,"stem":201},"Boucles bornées et non bornées","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fboucles","0.snt-2nde\u002Fsh-prog-notions\u002F3.boucles",{"title":203,"path":204,"stem":205},"Définitions et appels de fonctions","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Ffonctions","0.snt-2nde\u002Fsh-prog-notions\u002F4.fonctions",{"title":207,"path":208,"stem":209,"children":210},"Démo des widgets MDC","\u002Fsnt-2nde\u002Fzz-demo-widgets","0.snt-2nde\u002Fzz-demo-widgets\u002F0.index",[211,212,216,220],{"title":207,"path":208,"stem":209},{"title":213,"path":214,"stem":215},"Démo statique — callouts, code, BO, illustration","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Fstatique","0.snt-2nde\u002Fzz-demo-widgets\u002F1.statique",{"title":217,"path":218,"stem":219},"Démo interactive — self-eval et python-snippet","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Finteractif","0.snt-2nde\u002Fzz-demo-widgets\u002F2.interactif",{"title":221,"path":222,"stem":223},"Démo · 14 widgets de manipulation NSI","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Fwidgets-manipulation","0.snt-2nde\u002Fzz-demo-widgets\u002F3.widgets-manipulation",{"title":225,"path":226,"stem":227,"children":228},"NSI — Première","\u002Fnsi-1ere","1.nsi-1ere\u002F0.index",[229,230,234,256,282,304,328,354,380,410],{"title":225,"path":226,"stem":227},{"title":231,"path":232,"stem":233},"Relecture pédagogique — 8 chapitres NSI 1ère (PA → PH)","\u002Fnsi-1ere\u002Freview","1.nsi-1ere\u002FREVIEW",{"title":235,"path":236,"stem":237,"children":238},"Histoire de l'informatique","\u002Fnsi-1ere\u002Fpa-histoire-info","1.nsi-1ere\u002Fpa-histoire-info\u002F0.index",[239,240,244,248,252],{"title":235,"path":236,"stem":237},{"title":241,"path":242,"stem":243},"De la préantiquité aux machines à calculer","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fpreantiquite-aux-machines","1.nsi-1ere\u002Fpa-histoire-info\u002F1.preantiquite-aux-machines",{"title":245,"path":246,"stem":247},"La machine universelle (1930-1950)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fmachine-universelle","1.nsi-1ere\u002Fpa-histoire-info\u002F2.machine-universelle",{"title":249,"path":250,"stem":251},"Les ordinateurs modernes (1947-1990)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fordinateurs-modernes","1.nsi-1ere\u002Fpa-histoire-info\u002F3.ordinateurs-modernes",{"title":253,"path":254,"stem":255},"Réseaux, Web et IA (1969 à aujourd'hui)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Freseaux-et-web","1.nsi-1ere\u002Fpa-histoire-info\u002F4.reseaux-et-web",{"title":257,"path":258,"stem":259,"children":260},"Représentation des données — types et valeurs","\u002Fnsi-1ere\u002Fpb-types-valeurs","1.nsi-1ere\u002Fpb-types-valeurs\u002F0.index",[261,262,266,270,274,278],{"title":257,"path":258,"stem":259},{"title":263,"path":264,"stem":265},"Bases de numération et entiers positifs","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fbases-entiers-positifs","1.nsi-1ere\u002Fpb-types-valeurs\u002F1.bases-entiers-positifs",{"title":267,"path":268,"stem":269},"Entiers relatifs et complément à deux","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fentiers-relatifs","1.nsi-1ere\u002Fpb-types-valeurs\u002F2.entiers-relatifs",{"title":271,"path":272,"stem":273},"Nombres flottants et virgule flottante","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fflottants","1.nsi-1ere\u002Fpb-types-valeurs\u002F3.flottants",{"title":275,"path":276,"stem":277},"Textes et encodages — ASCII, ISO-8859-1, Unicode","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Ftextes-encodages","1.nsi-1ere\u002Fpb-types-valeurs\u002F4.textes-encodages",{"title":279,"path":280,"stem":281},"Valeurs booléennes et opérateurs logiques","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fbooleens","1.nsi-1ere\u002Fpb-types-valeurs\u002F5.booleens",{"title":283,"path":284,"stem":285,"children":286},"Représentation des données : types construits","\u002Fnsi-1ere\u002Fpc-types-construits","1.nsi-1ere\u002Fpc-types-construits\u002F0.index",[287,288,292,296,300],{"title":283,"path":284,"stem":285},{"title":289,"path":290,"stem":291},"Tableaux et listes","\u002Fnsi-1ere\u002Fpc-types-construits\u002Ftableaux-listes","1.nsi-1ere\u002Fpc-types-construits\u002F1.tableaux-listes",{"title":293,"path":294,"stem":295},"Listes en compréhension","\u002Fnsi-1ere\u002Fpc-types-construits\u002Fcomprehension","1.nsi-1ere\u002Fpc-types-construits\u002F2.comprehension",{"title":297,"path":298,"stem":299},"Tuples et p-uplets nommés","\u002Fnsi-1ere\u002Fpc-types-construits\u002Ftuples","1.nsi-1ere\u002Fpc-types-construits\u002F3.tuples",{"title":301,"path":302,"stem":303},"Dictionnaires","\u002Fnsi-1ere\u002Fpc-types-construits\u002Fdictionnaires","1.nsi-1ere\u002Fpc-types-construits\u002F4.dictionnaires",{"title":305,"path":306,"stem":307,"children":308},"Traitement de données en tables","\u002Fnsi-1ere\u002Fpd-tables-donnees","1.nsi-1ere\u002Fpd-tables-donnees\u002F0.index",[309,310,314,318,322],{"title":305,"path":306,"stem":307},{"title":311,"path":312,"stem":313},"Tables et CSV","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ftables-csv","1.nsi-1ere\u002Fpd-tables-donnees\u002F1.tables-csv",{"title":315,"path":316,"stem":317},"Recherche et filtrage","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Frecherche","1.nsi-1ere\u002Fpd-tables-donnees\u002F2.recherche",{"title":319,"path":320,"stem":321},"Trier une table","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ftri","1.nsi-1ere\u002Fpd-tables-donnees\u002F3.tri",{"title":323,"path":324,"stem":325,"children":326},"Fusion et indexation","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ffusion-indexation","1.nsi-1ere\u002Fpd-tables-donnees\u002F4.fusion-indexation",[327],{"title":323,"path":324,"stem":325},{"title":329,"path":330,"stem":331,"children":332},"IHM sur le Web","\u002Fnsi-1ere\u002Fpe-ihm-web","1.nsi-1ere\u002Fpe-ihm-web\u002F0.index",[333,334,338,342,346,350],{"title":329,"path":330,"stem":331},{"title":335,"path":336,"stem":337},"HTML et CSS — rappel de structure","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fhtml-css-bases","1.nsi-1ere\u002Fpe-ihm-web\u002F1.html-css-bases",{"title":339,"path":340,"stem":341},"Formulaires HTML","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fformulaires","1.nsi-1ere\u002Fpe-ihm-web\u002F2.formulaires",{"title":343,"path":344,"stem":345},"Événements JavaScript","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fevenements-js","1.nsi-1ere\u002Fpe-ihm-web\u002F3.evenements-js",{"title":347,"path":348,"stem":349},"Manipulation du DOM","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fdom-interaction","1.nsi-1ere\u002Fpe-ihm-web\u002F4.dom-interaction",{"title":351,"path":352,"stem":353},"Client, serveur et HTTP","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fclient-serveur-http","1.nsi-1ere\u002Fpe-ihm-web\u002F5.client-serveur-http",{"title":355,"path":356,"stem":357,"children":358},"Architectures matérielles et systèmes d'exploitation","\u002Fnsi-1ere\u002Fpf-archi-os","1.nsi-1ere\u002Fpf-archi-os\u002F0.index",[359,360,364,368,372,376],{"title":355,"path":356,"stem":357},{"title":361,"path":362,"stem":363},"Le modèle de von Neumann","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fvon-neumann","1.nsi-1ere\u002Fpf-archi-os\u002F1.von-neumann",{"title":365,"path":366,"stem":367},"Périphériques et interface homme-machine","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fperipheriques-ihm","1.nsi-1ere\u002Fpf-archi-os\u002F2.peripheriques-ihm",{"title":369,"path":370,"stem":371},"Les systèmes d'exploitation","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fsystemes-exploitation","1.nsi-1ere\u002Fpf-archi-os\u002F3.systemes-exploitation",{"title":373,"path":374,"stem":375},"Linux et le shell","\u002Fnsi-1ere\u002Fpf-archi-os\u002Flinux-shell","1.nsi-1ere\u002Fpf-archi-os\u002F4.linux-shell",{"title":377,"path":378,"stem":379},"Réseaux et protocoles","\u002Fnsi-1ere\u002Fpf-archi-os\u002Freseaux","1.nsi-1ere\u002Fpf-archi-os\u002F5.reseaux",{"title":381,"path":382,"stem":383,"children":384},"Langages et programmation","\u002Fnsi-1ere\u002Fpg-langages-prog","1.nsi-1ere\u002Fpg-langages-prog\u002F0.index",[385,386,390,394,398,402,406],{"title":381,"path":382,"stem":383},{"title":387,"path":388,"stem":389},"Diversité et unité des langages de programmation","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fdiversite-langages","1.nsi-1ere\u002Fpg-langages-prog\u002F1.diversite-langages",{"title":391,"path":392,"stem":393},"Constructions élémentaires","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fconstructions-elementaires","1.nsi-1ere\u002Fpg-langages-prog\u002F2.constructions-elementaires",{"title":395,"path":396,"stem":397},"Fonctions","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Ffonctions","1.nsi-1ere\u002Fpg-langages-prog\u002F3.fonctions",{"title":399,"path":400,"stem":401},"Spécification d'une fonction","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fspecification","1.nsi-1ere\u002Fpg-langages-prog\u002F4.specification",{"title":403,"path":404,"stem":405},"Mise au point des programmes","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fmise-au-point","1.nsi-1ere\u002Fpg-langages-prog\u002F5.mise-au-point",{"title":407,"path":408,"stem":409},"Utilisation de bibliothèques","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fbibliotheques","1.nsi-1ere\u002Fpg-langages-prog\u002F6.bibliotheques",{"title":411,"path":412,"stem":413,"children":414},"Algorithmique","\u002Fnsi-1ere\u002Fph-algorithmique","1.nsi-1ere\u002Fph-algorithmique\u002F0.index",[415,416,420,424,428,432,436],{"title":411,"path":412,"stem":413},{"title":417,"path":418,"stem":419},"Parcours séquentiel d'un tableau","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fparcours-sequentiel","1.nsi-1ere\u002Fph-algorithmique\u002F1.parcours-sequentiel",{"title":421,"path":422,"stem":423},"Bases de la complexité","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fcomplexite-bases","1.nsi-1ere\u002Fph-algorithmique\u002F2.complexite-bases",{"title":425,"path":426,"stem":427},"Tris par sélection et par insertion","\u002Fnsi-1ere\u002Fph-algorithmique\u002Ftris","1.nsi-1ere\u002Fph-algorithmique\u002F3.tris",{"title":429,"path":430,"stem":431},"Recherche dichotomique","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fdichotomie","1.nsi-1ere\u002Fph-algorithmique\u002F4.dichotomie",{"title":433,"path":434,"stem":435},"Algorithmes gloutons","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fgloutons","1.nsi-1ere\u002Fph-algorithmique\u002F5.gloutons",{"title":437,"path":438,"stem":439},"Les k plus proches voisins (k-NN)","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fknn","1.nsi-1ere\u002Fph-algorithmique\u002F6.knn",{"title":441,"path":442,"stem":443,"children":444},"NSI — Terminale","\u002Fnsi-tale","2.nsi-tale\u002F0.index",[445,446,450,476,498,536,560],{"title":441,"path":442,"stem":443},{"title":447,"path":448,"stem":449},"Review pédagogique — chapitres NSI Terminale (TA, TB, TC, TD, TE)","\u002Fnsi-tale\u002Freview","2.nsi-tale\u002FREVIEW",{"title":451,"path":452,"stem":453,"children":454},"Structures de données","\u002Fnsi-tale\u002Fta-structures-donnees","2.nsi-tale\u002Fta-structures-donnees\u002F0.index",[455,456,460,464,468,472],{"title":451,"path":452,"stem":453},{"title":457,"path":458,"stem":459},"Objet, classe, interface","\u002Fnsi-tale\u002Fta-structures-donnees\u002Finterface-implementation","2.nsi-tale\u002Fta-structures-donnees\u002F1.interface-implementation",{"title":461,"path":462,"stem":463},"Implémenter une structure — l'exemple de la file FIFO","\u002Fnsi-tale\u002Fta-structures-donnees\u002Fimplementer-une-structure","2.nsi-tale\u002Fta-structures-donnees\u002F2.implementer-une-structure",{"title":465,"path":466,"stem":467},"Listes, piles, files, dictionnaires","\u002Fnsi-tale\u002Fta-structures-donnees\u002Flistes-piles-files-dict","2.nsi-tale\u002Fta-structures-donnees\u002F3.listes-piles-files-dict",{"title":469,"path":470,"stem":471},"Arbres binaires","\u002Fnsi-tale\u002Fta-structures-donnees\u002Farbres-binaires","2.nsi-tale\u002Fta-structures-donnees\u002F4.arbres-binaires",{"title":473,"path":474,"stem":475},"Graphes","\u002Fnsi-tale\u002Fta-structures-donnees\u002Fgraphes","2.nsi-tale\u002Fta-structures-donnees\u002F5.graphes",{"title":477,"path":478,"stem":479,"children":480},"Bases de données","\u002Fnsi-tale\u002Ftb-bases-de-donnees","2.nsi-tale\u002Ftb-bases-de-donnees\u002F0.index",[481,482,486,490,494],{"title":477,"path":478,"stem":479},{"title":483,"path":484,"stem":485},"Le modèle relationnel","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fmodele-relationnel","2.nsi-tale\u002Ftb-bases-de-donnees\u002F1.modele-relationnel",{"title":487,"path":488,"stem":489},"Bases de données relationnelles et anomalies de schéma","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fbase-relationnelle","2.nsi-tale\u002Ftb-bases-de-donnees\u002F2.base-relationnelle",{"title":491,"path":492,"stem":493},"Le langage SQL","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fsql","2.nsi-tale\u002Ftb-bases-de-donnees\u002F3.sql",{"title":495,"path":496,"stem":497},"Les systèmes de gestion de bases de données","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fsgbd","2.nsi-tale\u002Ftb-bases-de-donnees\u002F4.sgbd",{"title":499,"path":500,"stem":501,"children":502},"Architectures matérielles, systèmes d'exploitation et réseaux","\u002Fnsi-tale\u002Ftc-archi-os-reseaux","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F0.index",[503,504,508,512,516,520,524,528,532],{"title":499,"path":500,"stem":501},{"title":505,"path":506,"stem":507},"Le système sur puce (SoC)","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fsysteme-sur-puce","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F1.systeme-sur-puce",{"title":509,"path":510,"stem":511},"Processus et ordonnancement par l'OS","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fprocessus-os","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F2.processus-os",{"title":513,"path":514,"stem":515},"L'interblocage (deadlock)","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Finterblocage","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F3.interblocage",{"title":517,"path":518,"stem":519},"Principes du routage","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Froutage-principes","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F4.routage-principes",{"title":521,"path":522,"stem":523},"Protocoles de routage RIP et OSPF","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fprotocoles-rip-ospf","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F5.protocoles-rip-ospf",{"title":525,"path":526,"stem":527},"Chiffrement symétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fchiffrement-symetrique","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F6.chiffrement-symetrique",{"title":529,"path":530,"stem":531},"Chiffrement asymétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fchiffrement-asymetrique","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F7.chiffrement-asymetrique",{"title":533,"path":534,"stem":535},"HTTPS — l'échange de clé symétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fhttps-tls","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F8.https-tls",{"title":381,"path":537,"stem":538,"children":539},"\u002Fnsi-tale\u002Ftd-langages-prog","2.nsi-tale\u002Ftd-langages-prog\u002F0.index",[540,541,544,548,552,556],{"title":381,"path":537,"stem":538},{"title":403,"path":542,"stem":543},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point","2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point",{"title":545,"path":546,"stem":547},"Modularité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmodularite","2.nsi-tale\u002Ftd-langages-prog\u002F2.modularite",{"title":549,"path":550,"stem":551},"Récursivité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Frecursivite","2.nsi-tale\u002Ftd-langages-prog\u002F3.recursivite",{"title":553,"path":554,"stem":555},"Paradigmes de programmation","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fparadigmes","2.nsi-tale\u002Ftd-langages-prog\u002F4.paradigmes",{"title":557,"path":558,"stem":559},"Programme comme donnée — calculabilité et indécidabilité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fprogramme-comme-donnee","2.nsi-tale\u002Ftd-langages-prog\u002F5.programme-comme-donnee",{"title":411,"path":561,"stem":562,"children":563},"\u002Fnsi-tale\u002Fte-algorithmique","2.nsi-tale\u002Fte-algorithmique\u002F0.index",[564,565,569,573,577,581],{"title":411,"path":561,"stem":562},{"title":566,"path":567,"stem":568},"Algorithmes sur les arbres binaires","\u002Fnsi-tale\u002Fte-algorithmique\u002Farbres-binaires-algos","2.nsi-tale\u002Fte-algorithmique\u002F1.arbres-binaires-algos",{"title":570,"path":571,"stem":572},"Parcours de graphes — DFS, BFS, cycles, chemins","\u002Fnsi-tale\u002Fte-algorithmique\u002Fgraphes-parcours","2.nsi-tale\u002Fte-algorithmique\u002F2.graphes-parcours",{"title":574,"path":575,"stem":576},"Diviser pour régner","\u002Fnsi-tale\u002Fte-algorithmique\u002Fdiviser-pour-regner","2.nsi-tale\u002Fte-algorithmique\u002F3.diviser-pour-regner",{"title":578,"path":579,"stem":580},"Programmation dynamique","\u002Fnsi-tale\u002Fte-algorithmique\u002Fprogrammation-dynamique","2.nsi-tale\u002Fte-algorithmique\u002F4.programmation-dynamique",{"title":582,"path":583,"stem":584},"Recherche textuelle — l'algorithme de Boyer-Moore","\u002Fnsi-tale\u002Fte-algorithmique\u002Frecherche-textuelle","2.nsi-tale\u002Fte-algorithmique\u002F5.recherche-textuelle",{"id":586,"title":403,"bo":587,"body":589,"description":1528,"eval":1529,"extension":1530,"labo":1529,"meta":1531,"navigation":1122,"path":542,"quizzes":1532,"readingTime":804,"seo":1540,"stem":543,"tp":1529,"__hash__":1541},"cours\u002F2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point.md",[588],"TD01",{"type":590,"value":591,"toc":1515},"minimark",[592,597,614,617,632,636,639,774,788,893,918,922,933,1041,1044,1064,1074,1082,1085,1090,1184,1195,1201,1355,1368,1393,1397,1484,1488,1509,1511],[593,594,596],"h2",{"id":595},"introduction","Introduction",[598,599,600,601,605,606,609,610,613],"p",{},"Un programme qui « tourne » n'est pas un programme qui ",[602,603,604],"strong",{},"fonctionne",". Entre les\ndeux, il y a tout un travail d'",[602,607,608],{},"ingénierie défensive"," : anticiper les cas\nlimites, expliciter les hypothèses, instrumenter le code pour que la moindre\nincohérence se signale d'elle-même. Ce travail est l'objet de l'item\n",[611,612],"bo-ref",{"code":588},".",[598,615,616],{},"Une image utile : du code sans tests, c'est un numéro de trapèze sans filet.\nTant que rien ne dérape, tout va bien — au premier faux pas, plus rien ne\nrattrape. Tests et assertions servent précisément à tendre ce filet.",[598,618,619,620,623,624,627,628,631],{},"Vous connaissez déjà la spécification d'une fonction (chapitre PG) et l'usage\nponctuel des assertions. En Terminale, on systématise : chaque fonction\nexposée doit avoir un ",[602,621,622],{},"contrat"," vérifiable, un ",[602,625,626],{},"jeu de tests"," qui exerce\nses cas limites, et le développeur doit savoir reconnaître les ",[602,629,630],{},"familles de\nbugs récurrentes"," avant qu'elles n'apparaissent en production.",[593,633,635],{"id":634},"les-bugs-typiques-à-reconnaître","Les bugs typiques à reconnaître",[598,637,638],{},"Cinq familles reviennent en boucle :",[640,641,642,658],"table",{},[643,644,645],"thead",{},[646,647,648,652,655],"tr",{},[649,650,651],"th",{},"Famille",[649,653,654],{},"Symptôme",[649,656,657],{},"Exemple",[659,660,661,692,707,730,753],"tbody",{},[646,662,663,669,683],{},[664,665,666],"td",{},[602,667,668],{},"Typage",[664,670,671,672,676,677,676,680,613],{},"Mélange d'",[673,674,675],"code",{},"int",", ",[673,678,679],{},"float",[673,681,682],{},"str",[664,684,685,688,689,613],{},[673,686,687],{},"\"3\" + 4"," lève ",[673,690,691],{},"TypeError",[646,693,694,699,702],{},[664,695,696],{},[602,697,698],{},"Effets de bord",[664,700,701],{},"Une fonction modifie ses arguments mutables.",[664,703,704],{},[673,705,706],{},"def f(l): l.append(0)",[646,708,709,714,721],{},[664,710,711],{},[602,712,713],{},"Hors-bornes",[664,715,716,717,720],{},"Indice de tableau ou borne ",[673,718,719],{},"range"," mal placée.",[664,722,723,726,727,613],{},[673,724,725],{},"range(5)"," produit ",[673,728,729],{},"0..4",[646,731,732,737,743],{},[664,733,734],{},[602,735,736],{},"Conditionnelle non-exhaustive",[664,738,739,740,613],{},"Un cas oublié dans une cascade ",[673,741,742],{},"if\u002Felif",[664,744,745,748,749,752],{},[673,746,747],{},"elif"," sans ",[673,750,751],{},"else"," final.",[646,754,755,760,765],{},[664,756,757],{},[602,758,759],{},"Flottants",[664,761,762,763,613],{},"Comparaison d'égalité entre ",[673,764,679],{},[664,766,767,770,771,613],{},[673,768,769],{},"0.1 + 0.2 == 0.3"," est ",[602,772,773],{},"faux",[775,776,777],"warning",{},[598,778,779,780,783,784,787],{},"La comparaison d'égalité entre flottants est l'un des pièges les plus\nclassiques. Préférez ",[673,781,782],{},"abs(a - b) \u003C epsilon"," pour un ",[673,785,786],{},"epsilon"," adapté à votre\nprécision attendue.",[789,790,791],"python-snippet",{},[792,793,798],"pre",{"className":794,"code":795,"language":796,"meta":797,"style":797},"language-python shiki shiki-themes github-light github-light github-dark","print(0.1 + 0.2)            # 0.30000000000000004\nprint(0.1 + 0.2 == 0.3)     # False\nprint(abs(0.1 + 0.2 - 0.3) \u003C 1e-9)  # True\n","python","",[673,799,800,830,855],{"__ignoreMap":797},[801,802,805,809,813,816,820,823,826],"span",{"class":803,"line":804},"line",1,[801,806,808],{"class":807},"sBjJW","print",[801,810,812],{"class":811},"sxrX7","(",[801,814,815],{"class":807},"0.1",[801,817,819],{"class":818},"s8jYJ"," +",[801,821,822],{"class":807}," 0.2",[801,824,825],{"class":811},")            ",[801,827,829],{"class":828},"sCsY4","# 0.30000000000000004\n",[801,831,833,835,837,839,841,843,846,849,852],{"class":803,"line":832},2,[801,834,808],{"class":807},[801,836,812],{"class":811},[801,838,815],{"class":807},[801,840,819],{"class":818},[801,842,822],{"class":807},[801,844,845],{"class":818}," ==",[801,847,848],{"class":807}," 0.3",[801,850,851],{"class":811},")     ",[801,853,854],{"class":828},"# False\n",[801,856,858,860,862,865,867,869,871,873,876,878,881,884,887,890],{"class":803,"line":857},3,[801,859,808],{"class":807},[801,861,812],{"class":811},[801,863,864],{"class":807},"abs",[801,866,812],{"class":811},[801,868,815],{"class":807},[801,870,819],{"class":818},[801,872,822],{"class":807},[801,874,875],{"class":818}," -",[801,877,848],{"class":807},[801,879,880],{"class":811},") ",[801,882,883],{"class":818},"\u003C",[801,885,886],{"class":807}," 1e-9",[801,888,889],{"class":811},")  ",[801,891,892],{"class":828},"# True\n",[894,895,898,904],"self-eval-qcm",{"correct":896,"slug":897},"1","mise-au-point-c1",[899,900,901],"template",{"v-slot:question":797},[598,902,903],{},"Quelle expression renvoie True ?",[899,905,906],{"v-slot:choices":797},[907,908,909,912,915],"ul",{},[910,911,769],"li",{},[910,913,914],{},"abs(0.1 + 0.2 - 0.3) \u003C 1e-9",[910,916,917],{},"0.1 == 0.10000001",[593,919,921],{"id":920},"les-assertions-durcir-une-fonction","Les assertions — durcir une fonction",[598,923,924,925,928,929,932],{},"Une ",[602,926,927],{},"assertion"," vérifie qu'une condition est vraie à un endroit donné du\nprogramme. Si elle est fausse, Python lève une ",[673,930,931],{},"AssertionError"," immédiatement —\nle bug est attrapé au plus tôt, à l'endroit même où la violation a eu lieu.",[792,934,936],{"className":794,"code":935,"language":796,"meta":797,"style":797},"def division_entiere(a: int, b: int) -> int:\n    \"\"\"Retourne le quotient entier de a par b.\"\"\"\n    assert isinstance(a, int), \"a doit être un entier\"\n    assert isinstance(b, int), \"b doit être un entier\"\n    assert b != 0, \"division par zéro interdite\"\n    return a \u002F\u002F b\n",[673,937,938,965,971,990,1007,1026],{"__ignoreMap":797},[801,939,940,943,947,950,952,955,957,960,962],{"class":803,"line":804},[801,941,942],{"class":818},"def",[801,944,946],{"class":945},"snPdu"," division_entiere",[801,948,949],{"class":811},"(a: ",[801,951,675],{"class":807},[801,953,954],{"class":811},", b: ",[801,956,675],{"class":807},[801,958,959],{"class":811},") -> ",[801,961,675],{"class":807},[801,963,964],{"class":811},":\n",[801,966,967],{"class":803,"line":832},[801,968,970],{"class":969},"sIIMD","    \"\"\"Retourne le quotient entier de a par b.\"\"\"\n",[801,972,973,976,979,982,984,987],{"class":803,"line":857},[801,974,975],{"class":818},"    assert",[801,977,978],{"class":807}," isinstance",[801,980,981],{"class":811},"(a, ",[801,983,675],{"class":807},[801,985,986],{"class":811},"), ",[801,988,989],{"class":969},"\"a doit être un entier\"\n",[801,991,993,995,997,1000,1002,1004],{"class":803,"line":992},4,[801,994,975],{"class":818},[801,996,978],{"class":807},[801,998,999],{"class":811},"(b, ",[801,1001,675],{"class":807},[801,1003,986],{"class":811},[801,1005,1006],{"class":969},"\"b doit être un entier\"\n",[801,1008,1010,1012,1015,1018,1021,1023],{"class":803,"line":1009},5,[801,1011,975],{"class":818},[801,1013,1014],{"class":811}," b ",[801,1016,1017],{"class":818},"!=",[801,1019,1020],{"class":807}," 0",[801,1022,676],{"class":811},[801,1024,1025],{"class":969},"\"division par zéro interdite\"\n",[801,1027,1029,1032,1035,1038],{"class":803,"line":1028},6,[801,1030,1031],{"class":818},"    return",[801,1033,1034],{"class":811}," a ",[801,1036,1037],{"class":818},"\u002F\u002F",[801,1039,1040],{"class":811}," b\n",[598,1042,1043],{},"Les assertions se placent typiquement :",[907,1045,1046,1052,1058],{},[910,1047,1048,1051],{},[602,1049,1050],{},"en entrée de fonction"," pour valider les pré-conditions (typage, plages\nde valeurs) ;",[910,1053,1054,1057],{},[602,1055,1056],{},"en sortie"," pour vérifier une post-condition (invariant attendu) ;",[910,1059,1060,1063],{},[602,1061,1062],{},"dans une boucle"," pour matérialiser un invariant.",[1065,1066,1067],"tip",{},[598,1068,1069,1070,1073],{},"Une assertion documente le contrat ",[602,1071,1072],{},"et"," le vérifie. Quand un nouvel\nutilisateur appelle votre fonction avec un mauvais argument, l'erreur indique\nexactement quelle hypothèse a été violée.",[593,1075,1077,1078,1081],{"id":1076},"doctests-et-pytest-un-jeu-de-tests-automatisé","Doctests et ",[673,1079,1080],{},"pytest"," — un jeu de tests automatisé",[598,1083,1084],{},"Vérifier à la main qu'une fonction marche après chaque modification est\ninefficace. On automatise.",[1086,1087,1089],"h3",{"id":1088},"doctests-tests-dans-la-docstring","Doctests — tests dans la docstring",[792,1091,1093],{"className":794,"code":1092,"language":796,"meta":797,"style":797},"def double(n: int) -> int:\n    \"\"\"Retourne le double de n.\n\n    >>> double(3)\n    6\n    >>> double(-2)\n    -4\n    >>> double(0)\n    0\n    \"\"\"\n    return 2 * n\n",[673,1094,1095,1113,1118,1124,1132,1137,1144,1150,1158,1164,1170],{"__ignoreMap":797},[801,1096,1097,1099,1102,1105,1107,1109,1111],{"class":803,"line":804},[801,1098,942],{"class":818},[801,1100,1101],{"class":945}," double",[801,1103,1104],{"class":811},"(n: ",[801,1106,675],{"class":807},[801,1108,959],{"class":811},[801,1110,675],{"class":807},[801,1112,964],{"class":811},[801,1114,1115],{"class":803,"line":832},[801,1116,1117],{"class":969},"    \"\"\"Retourne le double de n.\n",[801,1119,1120],{"class":803,"line":857},[801,1121,1123],{"emptyLinePlaceholder":1122},true,"\n",[801,1125,1126,1129],{"class":803,"line":992},[801,1127,1128],{"class":818},"    >>> ",[801,1130,1131],{"class":969},"double(3)\n",[801,1133,1134],{"class":803,"line":1009},[801,1135,1136],{"class":969},"    6\n",[801,1138,1139,1141],{"class":803,"line":1028},[801,1140,1128],{"class":818},[801,1142,1143],{"class":969},"double(-2)\n",[801,1145,1147],{"class":803,"line":1146},7,[801,1148,1149],{"class":969},"    -4\n",[801,1151,1153,1155],{"class":803,"line":1152},8,[801,1154,1128],{"class":818},[801,1156,1157],{"class":969},"double(0)\n",[801,1159,1161],{"class":803,"line":1160},9,[801,1162,1163],{"class":969},"    0\n",[801,1165,1167],{"class":803,"line":1166},10,[801,1168,1169],{"class":969},"    \"\"\"\n",[801,1171,1173,1175,1178,1181],{"class":803,"line":1172},11,[801,1174,1031],{"class":818},[801,1176,1177],{"class":807}," 2",[801,1179,1180],{"class":818}," *",[801,1182,1183],{"class":811}," n\n",[598,1185,1186,1187,1190,1191,1194],{},"Exécution : ",[673,1188,1189],{},"python -m doctest mon_fichier.py -v",". Chaque ligne ",[673,1192,1193],{},">>>"," est\nexécutée et le résultat est comparé à la ligne suivante. Léger et intégré à\nla documentation.",[1086,1196,1198,1200],{"id":1197},"pytest-la-solution-industrielle",[673,1199,1080],{}," — la solution industrielle",[792,1202,1204],{"className":794,"code":1203,"language":796,"meta":797,"style":797},"# fichier test_calculs.py\nfrom calculs import division_entiere\n\ndef test_division_simple():\n    assert division_entiere(10, 3) == 3\n\ndef test_division_negative():\n    assert division_entiere(-7, 2) == -4   # division Python arrondit vers -inf\n\ndef test_division_par_zero():\n    import pytest\n    with pytest.raises(AssertionError):\n        division_entiere(10, 0)\n",[673,1205,1206,1211,1225,1229,1239,1262,1266,1275,1304,1308,1317,1325,1339],{"__ignoreMap":797},[801,1207,1208],{"class":803,"line":804},[801,1209,1210],{"class":828},"# fichier test_calculs.py\n",[801,1212,1213,1216,1219,1222],{"class":803,"line":832},[801,1214,1215],{"class":818},"from",[801,1217,1218],{"class":811}," calculs ",[801,1220,1221],{"class":818},"import",[801,1223,1224],{"class":811}," division_entiere\n",[801,1226,1227],{"class":803,"line":857},[801,1228,1123],{"emptyLinePlaceholder":1122},[801,1230,1231,1233,1236],{"class":803,"line":992},[801,1232,942],{"class":818},[801,1234,1235],{"class":945}," test_division_simple",[801,1237,1238],{"class":811},"():\n",[801,1240,1241,1243,1246,1249,1251,1254,1256,1259],{"class":803,"line":1009},[801,1242,975],{"class":818},[801,1244,1245],{"class":811}," division_entiere(",[801,1247,1248],{"class":807},"10",[801,1250,676],{"class":811},[801,1252,1253],{"class":807},"3",[801,1255,880],{"class":811},[801,1257,1258],{"class":818},"==",[801,1260,1261],{"class":807}," 3\n",[801,1263,1264],{"class":803,"line":1028},[801,1265,1123],{"emptyLinePlaceholder":1122},[801,1267,1268,1270,1273],{"class":803,"line":1146},[801,1269,942],{"class":818},[801,1271,1272],{"class":945}," test_division_negative",[801,1274,1238],{"class":811},[801,1276,1277,1279,1281,1284,1287,1289,1292,1294,1296,1298,1301],{"class":803,"line":1152},[801,1278,975],{"class":818},[801,1280,1245],{"class":811},[801,1282,1283],{"class":818},"-",[801,1285,1286],{"class":807},"7",[801,1288,676],{"class":811},[801,1290,1291],{"class":807},"2",[801,1293,880],{"class":811},[801,1295,1258],{"class":818},[801,1297,875],{"class":818},[801,1299,1300],{"class":807},"4",[801,1302,1303],{"class":828},"   # division Python arrondit vers -inf\n",[801,1305,1306],{"class":803,"line":1160},[801,1307,1123],{"emptyLinePlaceholder":1122},[801,1309,1310,1312,1315],{"class":803,"line":1166},[801,1311,942],{"class":818},[801,1313,1314],{"class":945}," test_division_par_zero",[801,1316,1238],{"class":811},[801,1318,1319,1322],{"class":803,"line":1172},[801,1320,1321],{"class":818},"    import",[801,1323,1324],{"class":811}," pytest\n",[801,1326,1328,1331,1334,1336],{"class":803,"line":1327},12,[801,1329,1330],{"class":818},"    with",[801,1332,1333],{"class":811}," pytest.raises(",[801,1335,931],{"class":807},[801,1337,1338],{"class":811},"):\n",[801,1340,1342,1345,1347,1349,1352],{"class":803,"line":1341},13,[801,1343,1344],{"class":811},"        division_entiere(",[801,1346,1248],{"class":807},[801,1348,676],{"class":811},[801,1350,1351],{"class":807},"0",[801,1353,1354],{"class":811},")\n",[598,1356,1186,1357,1359,1360,1363,1364,1367],{},[673,1358,1080],{},". Le framework découvre tous les fichiers ",[673,1361,1362],{},"test_*.py",",\nexécute toutes les fonctions ",[673,1365,1366],{},"test_*",", et affiche un rapport.",[894,1369,1371,1380],{"correct":896,"slug":1370},"mise-au-point-c2",[899,1372,1373],{"v-slot:question":797},[598,1374,1375,1376,1379],{},"Que vérifie le test ",[673,1377,1378],{},"test_division_par_zero"," ?",[899,1381,1382],{"v-slot:choices":797},[907,1383,1384,1387,1390],{},[910,1385,1386],{},"Que la fonction renvoie 0",[910,1388,1389],{},"Que la fonction lève une AssertionError",[910,1391,1392],{},"Que la fonction renvoie None",[593,1394,1396],{"id":1395},"pièges-récurrents-à-connaître","Pièges récurrents à connaître",[907,1398,1399,1416,1425,1438,1475],{},[910,1400,1401,1410,1411,726,1413,613],{},[602,1402,1403,1406,1407],{},[673,1404,1405],{},"range(n)"," est exclusif sur ",[673,1408,1409],{},"n"," : ",[673,1412,725],{},[673,1414,1415],{},"0, 1, 2, 3, 4",[910,1417,1418,1410,1421,1424],{},[602,1419,1420],{},"Indices Python à partir de 0",[673,1422,1423],{},"t[len(t)]"," est toujours hors-bornes.",[910,1426,1427,1410,1430,1433,1434,1437],{},[602,1428,1429],{},"Comparaison de chaînes vs nombres",[673,1431,1432],{},"\"10\" \u003C \"9\""," vaut ",[673,1435,1436],{},"True"," (ordre\nlexicographique).",[910,1439,1440,1410,1443,1446,1447,1450,1451,1454,1455,1458,1459,1462,1463,1466,1467,1470,1471,1474],{},[602,1441,1442],{},"Argument mutable par défaut",[673,1444,1445],{},"def f(l=[])"," partage la ",[602,1448,1449],{},"même"," liste\nentre tous les appels. Le pattern canonique est ",[673,1452,1453],{},"def f(l=None)"," puis, dans\nle corps, ",[673,1456,1457],{},"if l is None: l = []",". (À éviter : l'idiome raccourci\n",[673,1460,1461],{},"l = l or []"," traite ",[602,1464,1465],{},"toute"," valeur falsy — y compris une liste vide\npassée volontairement par l'appelant — comme un cas « non fourni » et\nla remplace par une ",[602,1468,1469],{},"nouvelle"," liste. C'est rarement ce qu'on veut\nquand ",[673,1472,1473],{},"l"," doit être muté en place.)",[910,1476,1477,1483],{},[602,1478,1479,748,1481],{},[673,1480,747],{},[673,1482,751],{}," : un cas oublié = comportement silencieux indéfini.",[593,1485,1487],{"id":1486},"pour-aller-plus-loin","Pour aller plus loin",[598,1489,1490,1491,1494,1495,1497,1498,1501,1502,1505,1506,1508],{},"Le module standard ",[673,1492,1493],{},"logging"," permet d'instrumenter un programme sans recourir\nà des ",[673,1496,808],{}," qu'on devra supprimer. Le typage est renforcé statiquement par\n",[673,1499,1500],{},"mypy",", qui détecte les erreurs de type ",[602,1503,1504],{},"avant l'exécution",". Et ",[673,1507,1080],{},"\ngère paramétrisation, fixtures et couverture de code.",[611,1510],{"code":588},[1512,1513,1514],"style",{},"html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":797,"searchDepth":832,"depth":832,"links":1516},[1517,1518,1519,1520,1526,1527],{"id":595,"depth":832,"text":596},{"id":634,"depth":832,"text":635},{"id":920,"depth":832,"text":921},{"id":1076,"depth":832,"text":1521,"children":1522},"Doctests et pytest — un jeu de tests automatisé",[1523,1524],{"id":1088,"depth":857,"text":1089},{"id":1197,"depth":857,"text":1525},"pytest — la solution industrielle",{"id":1395,"depth":832,"text":1396},{"id":1486,"depth":832,"text":1487},"Anticiper les bugs typiques, durcir le code par des assertions, des doctests et des jeux de tests automatisés.",null,"md",{},[1533,1537],{"slug":897,"kind":1534,"question":903,"choices":1535,"correct":896,"multi":1536,"explanation":797},"qcm",[769,914,917],false,{"slug":1370,"kind":1534,"question":1538,"choices":1539,"correct":896,"multi":1536,"explanation":797},"Que vérifie le test test_division_par_zero ?",[1386,1389,1392],{"title":403,"description":1528},"_qfFbhGjENLt0a2Y1MxB1d3kgUILW-p3MNca_HFtwuE",{"id":1543,"title":1544,"bo":1545,"body":1546,"description":1812,"eval":1529,"extension":1530,"labo":1529,"meta":1813,"navigation":1536,"path":1814,"quizzes":1815,"readingTime":804,"seo":1816,"stem":1817,"tp":1529,"__hash__":1818},"coursMemo\u002F2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point.memo.md","Mise au point des programmes — l'essentiel",[588],{"type":590,"value":1547,"toc":1805},[1548,1552,1557,1561,1613,1617,1695,1699,1723,1727,1802],[593,1549,1551],{"id":1550},"en-une-phrase","En une phrase",[598,1553,1554],{},[602,1555,1556],{},"Anticiper les bugs typiques (typage, hors-bornes, flottants, effets de bord, cas oubliés) et vérifier le code par assertions + jeu de tests automatisé.",[593,1558,1560],{"id":1559},"à-mémoriser","À mémoriser",[907,1562,1563,1569,1579,1589,1598],{},[910,1564,1565,1568],{},[602,1566,1567],{},"Cinq familles de bugs"," : typage, effets de bord, hors-bornes, conditionnelles non-exhaustives, comparaisons de flottants.",[910,1570,1571,688,1576,1578],{},[602,1572,1573],{},[673,1574,1575],{},"assert \u003Ccondition>, \"message\"",[673,1577,931],{}," si la condition est fausse — à utiliser en pré\u002Fpost-condition et pour les invariants.",[910,1580,1581,1586,1587,613],{},[602,1582,1583],{},[673,1584,1585],{},"0.1 + 0.2 != 0.3"," en Python (flottants binaires) — comparer via ",[673,1588,782],{},[910,1590,1591,1594,1595,613],{},[602,1592,1593],{},"Doctest"," : exemples dans la docstring, exécutés par ",[673,1596,1597],{},"python -m doctest",[910,1599,1600,1604,1605,1607,1608,1610,1611,613],{},[602,1601,1602],{},[673,1603,1080],{}," : fichiers ",[673,1606,1362],{},", fonctions ",[673,1609,1366],{},", lancement ",[673,1612,1080],{},[593,1614,1616],{"id":1615},"à-savoir-reconnaître","À savoir reconnaître",[640,1618,1619,1629],{},[643,1620,1621],{},[646,1622,1623,1626],{},[649,1624,1625],{},"Situation",[649,1627,1628],{},"Action",[659,1630,1631,1644,1662,1676],{},[646,1632,1633,1639],{},[664,1634,1635,1636,1638],{},"Comparaison ",[673,1637,1258],{}," entre flottants",[664,1640,1641,1642,613],{},"Utiliser une tolérance ",[673,1643,786],{},[646,1645,1646,1653],{},[664,1647,1648,1649,1652],{},"Argument mutable par défaut (",[673,1650,1651],{},"l=[]",")",[664,1654,1655,1656,1659,1660,613],{},"Remplacer par ",[673,1657,1658],{},"l=None"," + ",[673,1661,1457],{},[646,1663,1664,1669],{},[664,1665,1666,1668],{},[673,1667,1405],{}," qui « rate » la dernière valeur",[664,1670,1671,1672,1675],{},"Penser à ",[673,1673,1674],{},"range(n+1)"," si bornes inclusives.",[646,1677,1678,1686],{},[664,1679,1680,1681,748,1683,1685],{},"Cascade ",[673,1682,742],{},[673,1684,751],{}," final",[664,1687,1688,1689,1691,1692,613],{},"Ajouter un ",[673,1690,751],{}," ou un ",[673,1693,1694],{},"raise",[593,1696,1698],{"id":1697},"pièges-courants","Pièges courants",[907,1700,1701,1709,1712],{},[910,1702,1703,1704,1706,1707,613],{},"Comparer ",[673,1705,1432],{}," (lexicographique) au lieu de convertir en ",[673,1708,675],{},[910,1710,1711],{},"Modifier une liste qu'on parcourt en même temps.",[910,1713,1714,1715,1718,1719,1722],{},"Oublier qu'",[673,1716,1717],{},"assert"," est désactivable avec ",[673,1720,1721],{},"python -O"," — ne pas l'utiliser pour la sécurité.",[593,1724,1726],{"id":1725},"syntaxe-python","Syntaxe Python",[792,1728,1730],{"className":794,"code":1729,"language":796,"meta":797,"style":797},"def division_entiere(a: int, b: int) -> int:\n    \"\"\"Quotient entier.\n\n    >>> division_entiere(10, 3)\n    3\n    \"\"\"\n    assert b != 0, \"division par zéro\"\n    return a \u002F\u002F b\n",[673,1731,1732,1752,1757,1761,1768,1773,1777,1792],{"__ignoreMap":797},[801,1733,1734,1736,1738,1740,1742,1744,1746,1748,1750],{"class":803,"line":804},[801,1735,942],{"class":818},[801,1737,946],{"class":945},[801,1739,949],{"class":811},[801,1741,675],{"class":807},[801,1743,954],{"class":811},[801,1745,675],{"class":807},[801,1747,959],{"class":811},[801,1749,675],{"class":807},[801,1751,964],{"class":811},[801,1753,1754],{"class":803,"line":832},[801,1755,1756],{"class":969},"    \"\"\"Quotient entier.\n",[801,1758,1759],{"class":803,"line":857},[801,1760,1123],{"emptyLinePlaceholder":1122},[801,1762,1763,1765],{"class":803,"line":992},[801,1764,1128],{"class":818},[801,1766,1767],{"class":969},"division_entiere(10, 3)\n",[801,1769,1770],{"class":803,"line":1009},[801,1771,1772],{"class":969},"    3\n",[801,1774,1775],{"class":803,"line":1028},[801,1776,1169],{"class":969},[801,1778,1779,1781,1783,1785,1787,1789],{"class":803,"line":1146},[801,1780,975],{"class":818},[801,1782,1014],{"class":811},[801,1784,1017],{"class":818},[801,1786,1020],{"class":807},[801,1788,676],{"class":811},[801,1790,1791],{"class":969},"\"division par zéro\"\n",[801,1793,1794,1796,1798,1800],{"class":803,"line":1152},[801,1795,1031],{"class":818},[801,1797,1034],{"class":811},[801,1799,1037],{"class":818},[801,1801,1040],{"class":811},[1512,1803,1804],{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}",{"title":797,"searchDepth":832,"depth":832,"links":1806},[1807,1808,1809,1810,1811],{"id":1550,"depth":832,"text":1551},{"id":1559,"depth":832,"text":1560},{"id":1615,"depth":832,"text":1616},{"id":1697,"depth":832,"text":1698},{"id":1725,"depth":832,"text":1726},"Mémo de révision sur les bugs typiques et l'outillage de test.",{},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point.memo",[],{"title":1544,"description":1812},"2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point.memo","g3I2Tb8nggcC4QQ6n_IeevSVSHldiZri7FqAlK8AfN8",{"id":1820,"title":1821,"body":1822,"description":2196,"extension":1530,"meta":2197,"navigation":1536,"path":2198,"seo":2199,"stem":2200,"__hash__":2201},"coursSlides\u002F2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point.slides.md","Mise au point des programmes — diapositives",{"type":590,"value":1823,"toc":2194},[1824,1828,1834,1837,1841,1856,1858,1862,1904,1906,1910,1983,1989,1991,1995,2035,2053,2055,2057,2099,2104,2106,2110,2176,2179,2181,2185,2191],[1825,1826,403],"h1",{"id":1827},"mise-au-point-des-programmes",[598,1829,1830,1831,1833],{},"Item ",[611,1832],{"code":588}," — Anticiper, vérifier, durcir.",[1835,1836],"hr",{},[1825,1838,1840],{"id":1839},"un-programme-qui-tourne-qui-marche","Un programme qui tourne ≠ qui marche",[907,1842,1843,1846,1853],{},[910,1844,1845],{},"Tourner = pas de crash visible.",[910,1847,1848,1849,1852],{},"Marcher = respecte sa spécification sur ",[602,1850,1851],{},"tous"," les cas.",[910,1854,1855],{},"Le travail d'ingénieur consiste à fermer cet écart.",[1835,1857],{},[1825,1859,1861],{"id":1860},"les-cinq-familles-de-bugs","Les cinq familles de bugs",[907,1863,1864,1876,1881,1891,1898],{},[910,1865,1866,1868,1869,1871,1872,1871,1874,613],{},[602,1867,668],{}," — mélanges ",[673,1870,675],{}," \u002F ",[673,1873,682],{},[673,1875,679],{},[910,1877,1878,1880],{},[602,1879,698],{}," — modification cachée d'arguments mutables.",[910,1882,1883,1885,1886,676,1888,1890],{},[602,1884,713],{}," — ",[673,1887,1423],{},[673,1889,1405],{}," exclusif.",[910,1892,1893,1895,1896,613],{},[602,1894,736],{}," — cas oublié, pas de ",[673,1897,751],{},[910,1899,1900,1885,1902,613],{},[602,1901,759],{},[673,1903,1585],{},[1835,1905],{},[1825,1907,1909],{"id":1908},"flottants-le-piège-classique","Flottants — le piège classique",[792,1911,1913],{"className":794,"code":1912,"language":796,"meta":797,"style":797},">>> 0.1 + 0.2\n0.30000000000000004\n>>> 0.1 + 0.2 == 0.3\nFalse\n>>> abs(0.1 + 0.2 - 0.3) \u003C 1e-9\nTrue\n",[673,1914,1915,1927,1932,1947,1952,1978],{"__ignoreMap":797},[801,1916,1917,1919,1922,1924],{"class":803,"line":804},[801,1918,1193],{"class":818},[801,1920,1921],{"class":807}," 0.1",[801,1923,819],{"class":818},[801,1925,1926],{"class":807}," 0.2\n",[801,1928,1929],{"class":803,"line":832},[801,1930,1931],{"class":807},"0.30000000000000004\n",[801,1933,1934,1936,1938,1940,1942,1944],{"class":803,"line":857},[801,1935,1193],{"class":818},[801,1937,1921],{"class":807},[801,1939,819],{"class":818},[801,1941,822],{"class":807},[801,1943,845],{"class":818},[801,1945,1946],{"class":807}," 0.3\n",[801,1948,1949],{"class":803,"line":992},[801,1950,1951],{"class":807},"False\n",[801,1953,1954,1956,1959,1961,1963,1965,1967,1969,1971,1973,1975],{"class":803,"line":1009},[801,1955,1193],{"class":818},[801,1957,1958],{"class":807}," abs",[801,1960,812],{"class":811},[801,1962,815],{"class":807},[801,1964,819],{"class":818},[801,1966,822],{"class":807},[801,1968,875],{"class":818},[801,1970,848],{"class":807},[801,1972,880],{"class":811},[801,1974,883],{"class":818},[801,1976,1977],{"class":807}," 1e-9\n",[801,1979,1980],{"class":803,"line":1028},[801,1981,1982],{"class":807},"True\n",[598,1984,1985,1986,613],{},"Toujours comparer avec ",[602,1987,1988],{},"tolérance",[1835,1990],{},[1825,1992,1994],{"id":1993},"assertions-durcir-une-fonction","Assertions — durcir une fonction",[792,1996,1998],{"className":794,"code":1997,"language":796,"meta":797,"style":797},"def division(a, b):\n    assert b != 0, \"division par zéro\"\n    return a \u002F b\n",[673,1999,2000,2010,2024],{"__ignoreMap":797},[801,2001,2002,2004,2007],{"class":803,"line":804},[801,2003,942],{"class":818},[801,2005,2006],{"class":945}," division",[801,2008,2009],{"class":811},"(a, b):\n",[801,2011,2012,2014,2016,2018,2020,2022],{"class":803,"line":832},[801,2013,975],{"class":818},[801,2015,1014],{"class":811},[801,2017,1017],{"class":818},[801,2019,1020],{"class":807},[801,2021,676],{"class":811},[801,2023,1791],{"class":969},[801,2025,2026,2028,2030,2033],{"class":803,"line":857},[801,2027,1031],{"class":818},[801,2029,1034],{"class":811},[801,2031,2032],{"class":818},"\u002F",[801,2034,1040],{"class":811},[907,2036,2037,2040,2046],{},[910,2038,2039],{},"Pré-conditions, post-conditions, invariants.",[910,2041,2042,2043,2045],{},"Lèvent ",[673,2044,931],{}," au plus tôt.",[910,2047,2048,2049,2052],{},"Une assertion = une ",[602,2050,2051],{},"ceinture de sécurité"," : inerte tant que tout va bien, indispensable au moment où ça dérape.",[1835,2054],{},[1825,2056,1089],{"id":1088},[792,2058,2060],{"className":794,"code":2059,"language":796,"meta":797,"style":797},"def double(n):\n    \"\"\"\n    >>> double(3)\n    6\n    \"\"\"\n    return 2 * n\n",[673,2061,2062,2071,2075,2081,2085,2089],{"__ignoreMap":797},[801,2063,2064,2066,2068],{"class":803,"line":804},[801,2065,942],{"class":818},[801,2067,1101],{"class":945},[801,2069,2070],{"class":811},"(n):\n",[801,2072,2073],{"class":803,"line":832},[801,2074,1169],{"class":969},[801,2076,2077,2079],{"class":803,"line":857},[801,2078,1128],{"class":818},[801,2080,1131],{"class":969},[801,2082,2083],{"class":803,"line":992},[801,2084,1136],{"class":969},[801,2086,2087],{"class":803,"line":1009},[801,2088,1169],{"class":969},[801,2090,2091,2093,2095,2097],{"class":803,"line":1028},[801,2092,1031],{"class":818},[801,2094,1177],{"class":807},[801,2096,1180],{"class":818},[801,2098,1183],{"class":811},[598,2100,1186,2101,613],{},[673,2102,2103],{},"python -m doctest fichier.py -v",[1835,2105],{},[1825,2107,2109],{"id":2108},"pytest-loutil-industriel","Pytest — l'outil industriel",[792,2111,2113],{"className":794,"code":2112,"language":796,"meta":797,"style":797},"def test_double():\n    assert double(3) == 6\n\ndef test_division_zero():\n    with pytest.raises(AssertionError):\n        division(10, 0)\n",[673,2114,2115,2124,2140,2144,2153,2163],{"__ignoreMap":797},[801,2116,2117,2119,2122],{"class":803,"line":804},[801,2118,942],{"class":818},[801,2120,2121],{"class":945}," test_double",[801,2123,1238],{"class":811},[801,2125,2126,2128,2131,2133,2135,2137],{"class":803,"line":832},[801,2127,975],{"class":818},[801,2129,2130],{"class":811}," double(",[801,2132,1253],{"class":807},[801,2134,880],{"class":811},[801,2136,1258],{"class":818},[801,2138,2139],{"class":807}," 6\n",[801,2141,2142],{"class":803,"line":857},[801,2143,1123],{"emptyLinePlaceholder":1122},[801,2145,2146,2148,2151],{"class":803,"line":992},[801,2147,942],{"class":818},[801,2149,2150],{"class":945}," test_division_zero",[801,2152,1238],{"class":811},[801,2154,2155,2157,2159,2161],{"class":803,"line":1009},[801,2156,1330],{"class":818},[801,2158,1333],{"class":811},[801,2160,931],{"class":807},[801,2162,1338],{"class":811},[801,2164,2165,2168,2170,2172,2174],{"class":803,"line":1028},[801,2166,2167],{"class":811},"        division(",[801,2169,1248],{"class":807},[801,2171,676],{"class":811},[801,2173,1351],{"class":807},[801,2175,1354],{"class":811},[598,2177,2178],{},"Découverte auto + rapport agrégé.",[1835,2180],{},[1825,2182,2184],{"id":2183},"à-retenir","À retenir",[598,2186,2187,2190],{},[602,2188,2189],{},"Un bon code = un contrat clair + des tests qui l'attestent.","\nSans tests, toute modification ultérieure est un saut dans le vide.",[1512,2192,2193],{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":797,"searchDepth":832,"depth":832,"links":2195},[],"Deck pour la séance sur les bugs typiques et l'outillage de test.",{},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point.slides",{"title":1821,"description":2196},"2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point.slides","76UWV1hkHi1g6acI6swDZ_JzOQyqUSrlyV1itYrx4No",{"id":1543,"title":1544,"bo":2203,"body":2204,"description":1812,"eval":1529,"extension":1530,"labo":1529,"meta":2413,"navigation":1536,"path":1814,"quizzes":2414,"readingTime":804,"seo":2415,"stem":1817,"tp":1529,"__hash__":1818},[588],{"type":590,"value":2205,"toc":2406},[2206,2208,2212,2214,2254,2256,2314,2316,2332,2334,2404],[593,2207,1551],{"id":1550},[598,2209,2210],{},[602,2211,1556],{},[593,2213,1560],{"id":1559},[907,2215,2216,2220,2228,2236,2242],{},[910,2217,2218,1568],{},[602,2219,1567],{},[910,2221,2222,688,2226,1578],{},[602,2223,2224],{},[673,2225,1575],{},[673,2227,931],{},[910,2229,2230,1586,2234,613],{},[602,2231,2232],{},[673,2233,1585],{},[673,2235,782],{},[910,2237,2238,1594,2240,613],{},[602,2239,1593],{},[673,2241,1597],{},[910,2243,2244,1604,2248,1607,2250,1610,2252,613],{},[602,2245,2246],{},[673,2247,1080],{},[673,2249,1362],{},[673,2251,1366],{},[673,2253,1080],{},[593,2255,1616],{"id":1615},[640,2257,2258,2266],{},[643,2259,2260],{},[646,2261,2262,2264],{},[649,2263,1625],{},[649,2265,1628],{},[659,2267,2268,2278,2290,2300],{},[646,2269,2270,2274],{},[664,2271,1635,2272,1638],{},[673,2273,1258],{},[664,2275,1641,2276,613],{},[673,2277,786],{},[646,2279,2280,2284],{},[664,2281,1648,2282,1652],{},[673,2283,1651],{},[664,2285,1655,2286,1659,2288,613],{},[673,2287,1658],{},[673,2289,1457],{},[646,2291,2292,2296],{},[664,2293,2294,1668],{},[673,2295,1405],{},[664,2297,1671,2298,1675],{},[673,2299,1674],{},[646,2301,2302,2308],{},[664,2303,1680,2304,748,2306,1685],{},[673,2305,742],{},[673,2307,751],{},[664,2309,1688,2310,1691,2312,613],{},[673,2311,751],{},[673,2313,1694],{},[593,2315,1698],{"id":1697},[907,2317,2318,2324,2326],{},[910,2319,1703,2320,1706,2322,613],{},[673,2321,1432],{},[673,2323,675],{},[910,2325,1711],{},[910,2327,1714,2328,1718,2330,1722],{},[673,2329,1717],{},[673,2331,1721],{},[593,2333,1726],{"id":1725},[792,2335,2336],{"className":794,"code":1729,"language":796,"meta":797,"style":797},[673,2337,2338,2358,2362,2366,2372,2376,2380,2394],{"__ignoreMap":797},[801,2339,2340,2342,2344,2346,2348,2350,2352,2354,2356],{"class":803,"line":804},[801,2341,942],{"class":818},[801,2343,946],{"class":945},[801,2345,949],{"class":811},[801,2347,675],{"class":807},[801,2349,954],{"class":811},[801,2351,675],{"class":807},[801,2353,959],{"class":811},[801,2355,675],{"class":807},[801,2357,964],{"class":811},[801,2359,2360],{"class":803,"line":832},[801,2361,1756],{"class":969},[801,2363,2364],{"class":803,"line":857},[801,2365,1123],{"emptyLinePlaceholder":1122},[801,2367,2368,2370],{"class":803,"line":992},[801,2369,1128],{"class":818},[801,2371,1767],{"class":969},[801,2373,2374],{"class":803,"line":1009},[801,2375,1772],{"class":969},[801,2377,2378],{"class":803,"line":1028},[801,2379,1169],{"class":969},[801,2381,2382,2384,2386,2388,2390,2392],{"class":803,"line":1146},[801,2383,975],{"class":818},[801,2385,1014],{"class":811},[801,2387,1017],{"class":818},[801,2389,1020],{"class":807},[801,2391,676],{"class":811},[801,2393,1791],{"class":969},[801,2395,2396,2398,2400,2402],{"class":803,"line":1152},[801,2397,1031],{"class":818},[801,2399,1034],{"class":811},[801,2401,1037],{"class":818},[801,2403,1040],{"class":811},[1512,2405,1804],{},{"title":797,"searchDepth":832,"depth":832,"links":2407},[2408,2409,2410,2411,2412],{"id":1550,"depth":832,"text":1551},{"id":1559,"depth":832,"text":1560},{"id":1615,"depth":832,"text":1616},{"id":1697,"depth":832,"text":1698},{"id":1725,"depth":832,"text":1726},{},[],{"title":1544,"description":1812},{"id":1820,"title":1821,"body":2417,"description":2196,"extension":1530,"meta":2729,"navigation":1536,"path":2198,"seo":2730,"stem":2200,"__hash__":2201},{"type":590,"value":2418,"toc":2727},[2419,2421,2425,2427,2429,2439,2441,2443,2479,2481,2483,2547,2551,2553,2555,2591,2603,2605,2607,2647,2651,2653,2655,2715,2717,2719,2721,2725],[1825,2420,403],{"id":1827},[598,2422,1830,2423,1833],{},[611,2424],{"code":588},[1835,2426],{},[1825,2428,1840],{"id":1839},[907,2430,2431,2433,2437],{},[910,2432,1845],{},[910,2434,1848,2435,1852],{},[602,2436,1851],{},[910,2438,1855],{},[1835,2440],{},[1825,2442,1861],{"id":1860},[907,2444,2445,2455,2459,2467,2473],{},[910,2446,2447,1868,2449,1871,2451,1871,2453,613],{},[602,2448,668],{},[673,2450,675],{},[673,2452,682],{},[673,2454,679],{},[910,2456,2457,1880],{},[602,2458,698],{},[910,2460,2461,1885,2463,676,2465,1890],{},[602,2462,713],{},[673,2464,1423],{},[673,2466,1405],{},[910,2468,2469,1895,2471,613],{},[602,2470,736],{},[673,2472,751],{},[910,2474,2475,1885,2477,613],{},[602,2476,759],{},[673,2478,1585],{},[1835,2480],{},[1825,2482,1909],{"id":1908},[792,2484,2485],{"className":794,"code":1912,"language":796,"meta":797,"style":797},[673,2486,2487,2497,2501,2515,2519,2543],{"__ignoreMap":797},[801,2488,2489,2491,2493,2495],{"class":803,"line":804},[801,2490,1193],{"class":818},[801,2492,1921],{"class":807},[801,2494,819],{"class":818},[801,2496,1926],{"class":807},[801,2498,2499],{"class":803,"line":832},[801,2500,1931],{"class":807},[801,2502,2503,2505,2507,2509,2511,2513],{"class":803,"line":857},[801,2504,1193],{"class":818},[801,2506,1921],{"class":807},[801,2508,819],{"class":818},[801,2510,822],{"class":807},[801,2512,845],{"class":818},[801,2514,1946],{"class":807},[801,2516,2517],{"class":803,"line":992},[801,2518,1951],{"class":807},[801,2520,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541],{"class":803,"line":1009},[801,2522,1193],{"class":818},[801,2524,1958],{"class":807},[801,2526,812],{"class":811},[801,2528,815],{"class":807},[801,2530,819],{"class":818},[801,2532,822],{"class":807},[801,2534,875],{"class":818},[801,2536,848],{"class":807},[801,2538,880],{"class":811},[801,2540,883],{"class":818},[801,2542,1977],{"class":807},[801,2544,2545],{"class":803,"line":1028},[801,2546,1982],{"class":807},[598,2548,1985,2549,613],{},[602,2550,1988],{},[1835,2552],{},[1825,2554,1994],{"id":1993},[792,2556,2557],{"className":794,"code":1997,"language":796,"meta":797,"style":797},[673,2558,2559,2567,2581],{"__ignoreMap":797},[801,2560,2561,2563,2565],{"class":803,"line":804},[801,2562,942],{"class":818},[801,2564,2006],{"class":945},[801,2566,2009],{"class":811},[801,2568,2569,2571,2573,2575,2577,2579],{"class":803,"line":832},[801,2570,975],{"class":818},[801,2572,1014],{"class":811},[801,2574,1017],{"class":818},[801,2576,1020],{"class":807},[801,2578,676],{"class":811},[801,2580,1791],{"class":969},[801,2582,2583,2585,2587,2589],{"class":803,"line":857},[801,2584,1031],{"class":818},[801,2586,1034],{"class":811},[801,2588,2032],{"class":818},[801,2590,1040],{"class":811},[907,2592,2593,2595,2599],{},[910,2594,2039],{},[910,2596,2042,2597,2045],{},[673,2598,931],{},[910,2600,2048,2601,2052],{},[602,2602,2051],{},[1835,2604],{},[1825,2606,1089],{"id":1088},[792,2608,2609],{"className":794,"code":2059,"language":796,"meta":797,"style":797},[673,2610,2611,2619,2623,2629,2633,2637],{"__ignoreMap":797},[801,2612,2613,2615,2617],{"class":803,"line":804},[801,2614,942],{"class":818},[801,2616,1101],{"class":945},[801,2618,2070],{"class":811},[801,2620,2621],{"class":803,"line":832},[801,2622,1169],{"class":969},[801,2624,2625,2627],{"class":803,"line":857},[801,2626,1128],{"class":818},[801,2628,1131],{"class":969},[801,2630,2631],{"class":803,"line":992},[801,2632,1136],{"class":969},[801,2634,2635],{"class":803,"line":1009},[801,2636,1169],{"class":969},[801,2638,2639,2641,2643,2645],{"class":803,"line":1028},[801,2640,1031],{"class":818},[801,2642,1177],{"class":807},[801,2644,1180],{"class":818},[801,2646,1183],{"class":811},[598,2648,1186,2649,613],{},[673,2650,2103],{},[1835,2652],{},[1825,2654,2109],{"id":2108},[792,2656,2657],{"className":794,"code":2112,"language":796,"meta":797,"style":797},[673,2658,2659,2667,2681,2685,2693,2703],{"__ignoreMap":797},[801,2660,2661,2663,2665],{"class":803,"line":804},[801,2662,942],{"class":818},[801,2664,2121],{"class":945},[801,2666,1238],{"class":811},[801,2668,2669,2671,2673,2675,2677,2679],{"class":803,"line":832},[801,2670,975],{"class":818},[801,2672,2130],{"class":811},[801,2674,1253],{"class":807},[801,2676,880],{"class":811},[801,2678,1258],{"class":818},[801,2680,2139],{"class":807},[801,2682,2683],{"class":803,"line":857},[801,2684,1123],{"emptyLinePlaceholder":1122},[801,2686,2687,2689,2691],{"class":803,"line":992},[801,2688,942],{"class":818},[801,2690,2150],{"class":945},[801,2692,1238],{"class":811},[801,2694,2695,2697,2699,2701],{"class":803,"line":1009},[801,2696,1330],{"class":818},[801,2698,1333],{"class":811},[801,2700,931],{"class":807},[801,2702,1338],{"class":811},[801,2704,2705,2707,2709,2711,2713],{"class":803,"line":1028},[801,2706,2167],{"class":811},[801,2708,1248],{"class":807},[801,2710,676],{"class":811},[801,2712,1351],{"class":807},[801,2714,1354],{"class":811},[598,2716,2178],{},[1835,2718],{},[1825,2720,2184],{"id":2183},[598,2722,2723,2190],{},[602,2724,2189],{},[1512,2726,2193],{},{"title":797,"searchDepth":832,"depth":832,"links":2728},[],{},{"title":1821,"description":2196},1788035585044]