Aller au contenu

Ecrire des exercices Python

Nous verrons ici des exemples d'utilisation courantes de Pyodide-mkdocs-thème et de puzzle.

Les anciennes structures et syntaxes

Les anciennes structures et syntaxes (par exemple plusieurs fichiers séparés Python pour le sujet, la correction, les tests) utilisées avec l'ancien Pyodide sont encore opérantes. Si vous avez fait une mise à jour de votre site, il n'est pas nécessaire de les modifier. Elles peuvent cohabiter sur le même site avec les syntaxes présentées dans ce tutoriel.

Pour chaque exemple, vous pourrez copier le code correspondant, et l'adapter à votre guise.

Pour une documentation complète : Documentation détaillée de pyodide-mkdocs-theme par F. Zinelli

I. Présentation des exercices avec IDE⚓︎

Vous trouverez dans les paragraphes suivants des modèles de syntaxes à copier. Il s'agit ici de présenter les différentes possibilités.

Un exemple pour tester :⚓︎

  • Cet exemple a été paramétré pour qu'au bout de 2 essais validés infructueux la réponse s'affiche.
  • Dès que l'élève a réussi (vérification dans le fichier exo.py caché), la solution s'affiche, ainsi que les remarques contenues dans le fichier exo_REM.md
Question

La fonction somme prend en paramètre une liste de nombres et renvoie la somme des nombres de cette liste.

Compléter le script ci-dessous :

  • ⚠️ N'oubliez surtout pas de valider valider après avoir exécuté play

  • Dans cet exercice, vous avez droit à deux essais validés :
    Si les assert "ne passent pas", vous pouvez cliquer sur ### en haut à droite de la fenêtre avant de valider, pour que l'essai soit décompté. Au bout de deux essais validés, la solution s'affichera.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 2/2

.128013tf1/yoklag234(=pmn0+ SP_wrd)uvb-:ech5si050B0I0b0j0N0i0M0v0J0i0j0M0M0p010b0N0q010406050M0D0r0r0j0A0f040w0g0i0D0(0g0s050e0/0;0?0^0-0q040518111b0e180-0B0N0E0W0Y0!0$0Y0s0k0D0j0k0I0G0q0f0b0K0 0v0K0N0k0K0i1D0K0b0+050R0F0i0I1k0Z0#011C1E1G1E0b1M1O1K0b0A191y0W0{0M0q0j0s0$0l011Q1m010c0T0I0s0j0r0I1K1,1.1?1S1_1O1|1~0+0a0v0x0A0g0q0g0M0N0~0s0v0P1*0A0A0I0J2j11210s190e1y2w1$1(1%1L0B231n0N0s1{2g1K1h1j0X1R2G2I0s0g2M1K0q2p192u2w2Z0.1-2k2O1@2S0A0=0i1K0j1B2p0c0$030y0y0J2T0I1G2R0g0G0t0G0d0+0d110j2!2%0,2$222)1S2+2-2/2;0I2?012^2`2|2~2J310G1;040l37391.3b2u2F013g0j2.192:0K2=2@2_2{0P3q2S3s0m0+0m3x2t3a0-3B3e0$3E3G053I3K3m3M3p2H3r320n0+0n3V123X3c2(1l3f0g2,3F3i3J3k3L3o3O3.3Q320L0+0L3@2#1e2X112M2z0B1(2E3!013N1 194i1a4g4e2#4p2Y2%0v0N0B0$2_2u3s343H4A4C013,462 4G1=270I4D452}4730324H3V3Z3|0$0h0+0P0c3W3z0v3`3C0s0c0+0M0g0;0I4,2v4/4n0*040o4{4y3d4$3D0+2S0r0F2p0M524}554 0C0H520-3^3z4/4B4T4F323u3(4J4T4p3P4X3t4Q1}4S4L4U5x3s5s0e380v5K4.4#2P56045b0D0i0R0b525M4z4n0g0+0p5W5e5O0r0N0+0t5j5d3B5o5D5q0G3S4I5;4M4V4O323S0v4R5v3-5}5@1K5I045L5X545O4(040c3~5%5N2*575a4`5l2v6a3{5O0g0z0+2H6h5Y550s574^6l5c6n536q1@4 5i6E5k2#5:4K4E2%3s3;5_6O5E4W6R5A1~624N3/0G6S3x69695(6j5Q0I0/5T0j5V6E6p3C5!045$6@6,3f0+5R6;6?2Z6^5Z0+0u6w6b6-0s6l5.6E5n6U5?4a6T6!5|6$4a605B7l5F49665J5L6~4%700Q0D0A106}6i6 6.6:5U7e4e4x1c4g0e4s2x4k112A7T0j1N0I2w4i5k0P0R0T0M04.

Les syntaxes⚓︎

Attention

Le fichier contenant les parties Python de votre exercice et l'éventuel fichier de remarques doivent se trouver dans le même dossier que votre fichier .md courant ou dans un dossier scripts placé dans le même dossier que votre fichier .md courant.

Il faudra juste veiller à indiquer les bons chemins vers vos fichiers.

Le fichier de remarques (facultatif) doit être nommé : mon_exo_REM.md (Ne pas oublier les majuscules)

Les différentes syntaxes à utiliser sont présentées ci-dessous, dans les différents onglets.

Des syntaxes courantes

Markdown
{{ terminal() }}
Création d'un terminal vide. L'auto-complétion avec Tab et le rappel de l'historique (avec CtrlR ) sont possibles.

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Markdown
{{ IDE() }}
Création d'un IDE vide, visuellement proche de Thonny. La zone de saisie se redimensionne automatiquement et autorise l'auto-complétion de type snippet avec AltSpace.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Markdown
{{ IDEv() }}
Cette commande crée un IDE vide, avec division verticale.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Markdown
{{ IDE('scripts/nom_de_fichier_1') }}

Le fichier nom_de_fichier_1.py se trouvant dans le dossier scripts est chargée dans l'IDE.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tf1/yokl[(g2=pmn SP_wsrd)u]vb-ech5ai050y0F0b0J0K0i0w0r0G0i0J0w0w0n010b0K0o010406050w0A0p0p0J0x0f040s0g0i0A0#0g0q050e0,0.0:0=0*0o0405150~180e150*0y0K0C0T0V0X0Z0V0q0l0A0J0l0F0E0o0f0b0H0|0r0H0K0l0H0i1A0H0b0(050O0D0i0F1h0W0Y011z1B1D1B0b1J1L1H0b0x161v0T0^0w0o0J0q0Z0m011N1j010c0Q0F0q0J0p0F1H1)1+1:1P1?1L1_1{0(0a0r0t0x0g0o0g0w0K0{0q0r0M1%0x0x0F0G2g0~1~0q160e1v2t1Z1#1!1I0y201k0K0q1^2d1H1e1g0U1O2D2F0q0g2J1H0o2m162r2t2W0+1*2h2L1;2P0x0/0i1H0J1y2m0c0Z030u0u0G2Q0F1D2O0g0E0I0E0d0(0d0~0J2X2!2t2T0F2t2J2w0y1#2B2$1P2^0M2I1f16392V372q3q3j3a2Z1 0K0y0Z2?2r2~302,0r3x3z2@2_2{2G3C310r240F3H3t3K2P3M1H0e353v2#1i1P0q0(0/0u1D0w0b0F3r1+040r3Z2C010g0(0n3/2s3=2r3@0%040j3|3p1 3h0Z3%040K443~2!3@0h0(0c0g0x4c3?4701494b0 374d463#0Z0g0v0(2E4l3 4n0q0D0(0x1+1q444m4v01410k4K4C4M0p0K0(0I4Q4e4n410z0B440*4r3:0~3t382U0~3c0~0b3e4;2z2u0J1K3u0e3c4(0M0O0Q0w04.

Markdown
{{ IDEv('scripts/nom_de_fichier_2') }}
Cette commande charge le fichier nom_de_fichier_2 se trouvant dans le dossier scripts dans un IDE avec division verticale.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tf17/yokl[(g2=pmn SP_wsrd)u]vb-ech5ai050z0G0b0K0L0j0x0s0H0j0K0x0x0o010b0L0p010406050x0B0q0q0K0y0g040t0h0j0B0$0h0r050f0-0/0;0?0+0p0405160 190f160+0z0L0D0U0W0Y0!0W0r0m0B0K0m0G0F0p0g0b0I0}0s0I0L0m0I0j1B0I0b0)050P0E0j0G1i0X0Z011A1C1E1C0b1K1M1I0b0y171w0U0_0x0p0K0r0!0n011O1k010c0R0G0r0K0q0G1I1*1,1;1Q1@1M1`1|0)0a0s0u0y0h0p0h0x0L0|0r0s0N1(0y0y0G0H2h0 1 0r170f1w2u1!1$1#1J0z211l0L0r1_2e1I1f1h0V1P2E2G0r0h2K1I0p2n172s2u2X0,1+2i2M1=2Q0y0:0j1I0K1z2n0c0!030v0v0H2R0G1E2P0h0F0e0F0d0)0d0 0K2Y2#2u2U0G2u2K2x0z1$2C2%1Q2_0N2J1g173a2W382r3r3k3b2!200L0z0!2@2s2 312-0s3y3A2^2`2|2H3D320s250G3I3u3L2Q3N1I0f363w2$1j1Q0r0)0:0v1E0x0b0G3s1,040s3!2D010h0)0o3:2t3?2s3^0(040k3}3q203i0!3(040L453 2#3^0i0)0c0h0y4d3@48014a4c10384e473$0!0h0w0)2F4m404o0r0E0)0y1,1r454n4w01420l4L4D4N0q0L0)0J4R4f4o420A0C450+4s3;0 3u392V0 3d0 0b3f4=2A2v0K1L3v0f3d4)0N0P0R0x04.

Guide détaillé Fichiers/IDE

II. Exemple 1 - avec un IDE mais pas de fichier REM⚓︎

Par défaut les élèves peuvent valider leur exercice 5 fois avant que la correction ne s'affiche.

Code à copier
???+ question "Exercice 1"

    Compléter le script ci-dessous (observer les `assert`):

    {{IDE('scripts/bonjour')}}
Exercice 1

Compléter le script ci-dessous (observer les assert):

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tf1q/y9oklag2(;=pmn+ SP_rd)uBvb-:echsji050A0I0b0l0N0k0L0v0J0k0l0L0L0q010b0N0r010406050L0C0s0s0l0z0g040w0i0k0C0(0i0t050f0/0;0?0^0-0r040518111b0f180-0A0N0E0W0Y0!0$0Y0t0m0C0l0m0I0G0r0g0b0K0 0v0K0N0m0K0k1D0K0b0+050R0F0k0I1k0Z0#011C1E1G1E0b1M1O1K0b0z191y0W0{0L0r0l0t0$0n011Q1m010c0T0I0t0l0s0I1K1,1.1?1S1_1O1|1~0+0a0v0x0z0i0r0i0L0N0~0t0v0P1*0z0z0I0J2j11210t190f1y2w1$1(1%1L0A231n0N0t1{2g1K1h1j0X1R2G2I0t0i2M1K0r2p192u2w2Z0.1-2k2O1@2S0z0=0k1K0l1B2p0c0$030y0y0J2T0I1G2R0i0G0h0G0d0+0d110l2!2%0,2$222)1S2+2-2/2;0I2?012^2`2|2~2J310G1;040n37391.2w2W0I2w2M2z0A1(2E3e0$2{0P2L1i193B2Y3a2t3S3L3C3c2k0N0A0$2_2u3s34192:3Z3#3o0P3q2S3(1=270I3-3V3:30323)3x3X2F010j0+0P0c3T3z0v403J010t0c0+0l0J0J0C0I0T472v4a1l1S0*040o4m3R3d4p0$0t0+3B2S0s4u4o2P014r0B0H4u0-123S2u0v3,013$2%3s3u053+3!4S3.2}2H3r321;0v3@3_3p4%3;4)1K0f380v4^494P4b43042p0b0C0z104N484F1@0L3u020e0C0i0b0p0D0 0M0i510v5a5c5e4u4`2%410i0+0u5p563f4A2p4C4L4E0f3V3A2X113E110b3G5K2C2x0l1N3W0f3E4M0P0R0T0L04.

Fichier utilisés pour cet exemple

bonjour.py
# --- PYODIDE:code --- #

def accueil(prenom):
    ...


# --- PYODIDE:corr --- #

def accueil(prenom):
    return "Bonjour " + prenom


# --- PYODIDE:tests --- #

assert accueil("Alice") == "Bonjour Alice"
assert accueil("Bob")  == "Bonjour Bob"


# --- PYODIDE:secrets --- #

assert accueil("fegrehjtyjtqfqsgeryryrfg") == "Bonjour fegrehjtyjtqfqsgeryryrfg"

III. Exemple 2 - sans fonction - avec un IDE mais pas de fichier REM⚓︎

Dans cet exercice, on n'utilise pas de fonction.

Code à copier
???+ question "Exercice 2"

    Compléter le script ci-dessous :

    {{IDE('scripts/construction')}}
Exercice 2

Compléter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tf1/yokl[(g2,=pmn0 SP_wsrd)u]vb-echai050A0H0b0K0L0i0y0t0I0i0K0y0y0o010b0L0p010406050y0C0q0q0K0z0f040u0g0i0C0$0g0r050e0-0/0;0?0+0p0405160 190e160+0A0L0E0U0W0Y0!0W0r0l0C0K0l0H0G0p0f0b0J0}0t0J0L0l0J0i1B0J0b0)050P0F0i0H1i0X0Z011A1C1E1C0b1K1M1I0b0z171w0U0_0y0p0K0r0!0m011O1k010c0R0H0r0K0q0H1I1*1,1;1Q1@1M1`1|0)0a0t0v0z0g0p0g0y0L0|0r0t0N1(0z0z0H0I2h0 1 0r170e1w2u1!1$1#1J0A211l0L0r1_2e1I1f1h0V1P2E2G0r0g2K1I0p2n172s2u2X0,1+2i2M1=2Q0z0:0i1I0K1z2n0c0!030w0w0I2R0H1E2P0g0G0d0m2 0)0d0 0K2Y2#0*2!202%1Q2)2+2-2/0H2;012?2^2`2|2H2 311/040m35371,2u2U0H2u2K2x0A1$2C3c0!2_0N2J1g173z2W382r3Q3J3A3a2i0L0A0!2@2s3q32172.3X3Z3m0N3o2Q3$0d1:250H3+3T3.2~303%3v3V2D010r0)0I1_0b0y3R3x0t3 3H010g0)0o482t4a2s400(040j4h3P3b1j1Q0q0L330s0s4p4j2#400h0)0c0g0z4z4b4s0!42040h4I4k4c0g0x0)2F4P4B4c0r0F0)0z1,1r4p4J2N014m0k4)4Q4K014u4w4/4X4;4m0B0D4p0+103Q4k3*013!2#3$3s053)3Y543,2{2F3p3|1/0t3?3^3n5f3/5h1I0e364*2(0)450L0H0z4750495t1Q4e044g5B4i5D0!4m4o5I4q2$4;4M4O5O4A4r4+4D044F4H5U5K410)5T2X5V5Q4+4S4U0~5$4:4+4Z4#4%0H4^5W1=4-5|5-1=4?04345O5%4m0n4W5}4t4v64652Z5?5~0)4|4~4)0e3T3y2V0 3C0 0b3E6t2A2v0K1L3U0e3C4 0N0P0R0y04.
Fichier utilisé pour cet exemple
construction.py
# --- PYODIDE:code --- #

# un tableau cents en compréhension qui contient 10 entiers 100.
cents = ...

# un tableau entiers en compréhension qui contient les 10 entiers entre 1 et 10 compris.
entiers = ...

# --- PYODIDE:corr --- #

cents = [100 for k in range(10)]
entiers = [k for k in range(1, 11)]


# --- PYODIDE:tests --- #

assert cents == [100, 100, 100, 100, 100, 100, 100, 100, 100, 100]
assert entiers == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# --- PYODIDE:secrets --- #

assert cents == 10 * [100]
assert entiers == [k for k in range(1, 11)]

Attention à la section secrets

S'il y a une section # --- PYODIDE:corr --- # ou un fichier de remarques comme exo_REM.mdLe fichier python doit absolument comporter la section :
# --- PYODIDE:secrets --- #

😢 En l'absence de la section # --- PYODIDE:secrets --- # le pipeline sera mis en échec.

IV. Exemple 3, avec un IDE et un fichier REM⚓︎

Dans cet exemple on a utilisé la syntaxe : MAX = 2. Les élèves pourront valider leur exercice seulement 2 fois avant que la correction ne s'affiche.

Le code à copier pour cet exemple se trouve plus bas ...

😊 Le code à copier n'a pas été oublié. Il se trouve après le rendu de l'exemple.

Exercice 3
  • La fonction est_pair prend en paramètre un entier.
  • Elle renvoie True s'il est pair, et False dans le cas contraire.

Compléter le script ci-dessous :

N'oubliez pas de valider après avoir exécuté.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 2/2

.128013tqf1/yoàkxlag;24(3=pmn0è SRP_TErd)éFuIvb-:ec%h5si050H0R0b0m0X0l0W0z0S0l0m0W0W0t010b0X0u010406050W0L0v0v0m0G0g040A0h0l0L0=0h0w0z020m0v0u0o0z0B0R0 0G0c0L0R0W050f0|0~10120`0u04051x1q1A0f1x0`0H0X0N0*0,0.0:0,0w0n0L0m0n0R0P0u0g0b0U190z0U0X0n0U0l1$0U0b0^050#0O0l0R1J0-0/011#1%1)1%0b1/1;1-0b0G1y1X0*150W0u0m0w0:0p011?1L010d0%0R0w1d0R1-282a2f1^2i1;2l0v2n040a0z0C0G0h0u0h0W0X181a0Z260G0G0R0S2I1q2p0w1y0f1X2U2224231.0H2r1M0X0w2k2F1-1G1I0+1@2(2*0w0h2.1-0u2N1y2S2U2~0{291a2:2g2@0G0 0l1-0m1!2N0d0:030D0D0S2^0R1)2?0h0P0e0q3p0^0e1q0m2 320_312q341^36383a3c0R3e013g3i3k3m2+3p3r2d040p3v3x2a2U2{0R2U2.2X0H242$3C0:3j0Z2-1H1y3Z2}3y2R3@3-3!3A1a0X0H0:3h2S3Q3s1y3b3~403M0Z3O2@430e2e2v0R483`4b3o3q443V3|2%010j0^0Z0d3^3X0z4p3+010w0d0^1o0b0D290X0G4w2T4z1K1^0@040r4L3?3B4O0:0w0^2@0v0O2N4T4N2;014Q0I0Q4T0`1r3@2S0z47014132433S05463 4_493l2)3P4m2d0z4g4i3N544c561-0f3w0z5i4y4?4A4s042N0b0L0G0w4T5k324q4Y044!4$0R5u4)2g0h0^0T5D5l4W010v0X0^3U4;4x5E1^5G040t0t5J5w4A5N0^0x4/4(0f3`3Y2|1q3$1q0b3(5;2!2V0m1:3{0f3$1w4U335L2N0v0D0d0m0j0R0D0U0s0^1i1k1m1o0z4.5R4M1D3z2.4q0m0H0v192H0X1Z2)0d5V1w6p6r6t2I0P0=0b20040F0k3Z0.6v1a0O0h150J2k2*1B3z1x6e101m190)6g4y5,5A2N0z0T0z0p0z5X0z5(5+3k040z4F0z0L2*6{6L2N6N1Z6Q6S6U1=1m0X0z0W000J0N0m161=0i6)6_0E0G1n1q5,0z0h0L7k0Z040K7g0W5C6^7v6W4:5~1z040M0l6{0W0b5k22190n04220y0)386q2C2H2R7O1O6`0H7d0S0G4J7A1E0Y1H4q1N1P1R1T1V1X1Z1`1(1*1,604q2t2k2m0^0C1W1Y5t6k3;5.3089055,4p4^4`2a3p0V4n4 5a4a5c4l8l4e582m8o533n8k3s3H3J3L4j8q8z4e2U3w5T0:5n4u5Z4V4*4C4E7L4H0$4K8d5K4*4Q4S8X5!5L5y6+7A308Y2g4,6j2~4:8,5w8h0D420e8l4}8n518E8y8{0P57598 5b918|2e0U3d3f3h9055998I6`5j8K4r0^0X4v895v8P354Z0h4#4%9q9l5V5I9y8-1^5$3T8O614*5V5X9H4q9F6@8?9s4P0^8:3y8=4=8@508i0w8z6c454@9Z524k9$4f8v968p980P6c8B9d9+8F929%3V5j9 9r9I2g5n5p5r882~a14q0j0S0^7m7o899W3X8g9*8`8l0q3G8^9f5dam9.2w8w9,92an9^3K9e979g0Pan9i9 9l5n3l7z4(9D0:4Q9U3Xah4M4?8^al0P0Vao9*aq8raXat4h9:8xaDaYaz8DaCara%aGa05iaI0^a55s9M5mac7w7y8+9V5*8f1D5.5}3:7E0!0$0(04.
Code à copier
???+ question "Exercice 3"

    * La fonction `est_pair` prend en paramètre un entier **différent de 0**. 
    * Elle renvoie `True` s'il est pair, et `False` dans le cas contraire.

    Compléter le script ci-dessous : 

    N'oubliez pas de valider après avoir exécuté.


    {{IDE('scripts/pair', MAX = 2)}}
Fichiers utilisés pour cet exemple

Deux fichiers ont été utilisés qui doivent se trouver dans le même dossier (ici scripts)

Le contenu du fichier pair_REM.md s'affiche automatiquement après la solution.

pair.py
# --- PYODIDE:code --- #

def est_pair(nombre):
    ...


# --- PYODIDE:corr --- #

def est_pair(nombre):
    return nombre % 2 == 0


# --- PYODIDE:tests --- #

assert est_pair(2)
assert est_pair(2000)
assert not est_pair(1)
assert not est_pair(777)

# --- PYODIDE:secrets --- #

assert est_pair(10**10)
assert not est_pair(10**10 + 1)
pair_REM.md
!!! info "Expression booléenne"

    Remarquons que `nombre % 2 == 0` est une expression booléenne qui s'évalue à `True` ou `False`

Il est **très maladroit** d'écrire

```python
def est_pair(nombre):
    if nombre % 2 == 0:
        return True
    else:
        return False
```

V. Exemple 4 avec un IDE et des "interdits" Python⚓︎

SANS

Dans cet exercice, nous allons utiliser la syntaxe SANS = "max, sorted, sort" pour interdire l'utilisation de max, ainsi que de sort ou sorted.

Le code à copier pour cet exemple

😊 Le code à copier n'a pas été oublié. Il se trouve après le rendu de l'exemple

Exercice 4

Écrire une fonction maximum :

  • prenant en paramètre une liste non vide de nombres : nombres
  • renvoyant le plus grand élément de cette liste.

Chacun des nombres utilisés est de type int ou float.

Contrainte

On interdit ici d'utiliser max, ainsi que sort ou sorted.

Exemples
Python Console Session
>>> maximum([98, 12, 104, 23, 131, 9])
131
>>> maximum([-27, 24, -3, 15])
24

Compléter ci-dessous

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tqf1/yoàkxl[îag;234(=pmn.,0è6 SRP_wrd)éuI]Lvb-:ech5si050L0W0b0o0#0l0!0E0X0l0o0!0!0v010b0#0w010406050!0O0x0x0o0K0g040F0h0l0O0_0h0y0E020o0x0w0q0E0G0W130K0c0O0W0!050f101214160~0w04051B1u1E0f1B0~0L0#0S0.0:0=0@0:0y0p0O0o0p0W0U0w0g0b0Y1d0E0Y0#0p0Y0l1*0Y0b0|050)0T0l0W1N0;0?011)1+1-1+0b1?1^1;0b0K1C1#0.190!0w0o0y0@0r011`1P010d0+0W0y1h0W1;2c2e2j1|2m1^2p0x2r040a0E0H0K0h0w0h0!0#1c1e0%2a0K0K0W0X2M1u2t0y1C0f1#2Y2628271=0L2v1Q0#0y2o2J1;1K1M0/1{2,2.0y0h2=1;0w2R1C2W2Y320 2d1e2@2k2{0K130l1;0o1(2R0d0@030I0I0X2|0W1-2`0h0U0r0B0U0e0|0e1u0o33360}352u381|3a3c3e3g0W3i013k3m3o3q2/3t3v2h040r3A3C2e3E2W2+013J0o3d1C3f0Y3h3j3l3n0%3T2{3V0U0s0|0s3!2V3D0~3(3H0@3+3-053/3;3P3?3S2-3U3u0U0t0|0t401v423F371O3I0h3b3,3L3:3N3=3R3^4f3`4h0Z0|0Z4m3243363)474w4b3Q3@3p4C3s4h0D0|0D4I3D1F301u2=2#0L282*45014R2;1L1C2 0W314!4n3$054R4^2u0#0L0@3l2W3{3x3.0E50524A4S3r552i2z0W5a4R3_4U3v5640444r0@0j0|0%0d413$0E4p4M0d0|130k0#0x115w2X5z4-0{040u5I4~4q2^3*0|2{0x0T2R1t4`5J5p5S5M0M0V5P0~5!5Q58510153363{3X495/5i4e5d4h2h0E5g5{4B5}3W1;0f3B0E695y5$395C0o5E5P6b4L4-0h0|0v6h5K5q5T045V5X1s5P6p5%0|0m6w6c1|0x0#0|0B6B6j6q5M0Q5+6I4 5:5=2e3{3}57595;5b5k6T5f2q625c4g3v6U3!6a6i3G6q5s040d4t6o6C460|0k6^6J5S0h0J0|2-6}6/5S0y5U0h5W5Y6O5R2k5M5*5-5,343(6W6R0y3{4j6V6Q6Y4T7o6#2A6%6Z4h7p6,6-6a6x2k6;0#5v5-6.7d3I6{747L0@6l04020p0b0q7O4M6e6g5-7E1|7f6N7#7k7r544E3L7l7s640U4F606$6X5j7t7.2Y687C807$6`045D0#7X6k6m876q77046|7h7c5`6X7-3v4W7q7x7|8k7v5h7`5|6)0U8l7B6982016;2R0b0O0K0y8a767Z868f7#0f4}4#4@4%4;1u0b4*8T2(2Z0o1@8Q0f4(1A5.4-2R0x0I0d0o0j0W0I0Y6U1m1o1q1s0E7g341H3E2=3)0o0L0x1d2L0#1%2-6?0|1A9294962M0U0_0b24043,0p4t2L0Y2A2v0#8`0E0i2a0y2p0n260W1F3E1B0P0l0E0!001V2L0E0L000O2.0E2R0X0Y0W0K9V1_2O855G0x9t8`0z0E0R3f1-0!0b1_0N0)0y0b601d0U0S500W0A0E990y973,0#0!1_0:0E0S140#8Z1^5y4}851u4}0E0o0S2S0Ea94?6E0C2Raa3,0W8E9Oa89.a69;0z9E5,8%4%0(0*0,04.
Code à copier
Écrire une fonction `maximum` :

- prenant en paramètre une liste **non vide** de nombres : `nombres`
- renvoyant le plus grand élément de cette liste.

Chacun des nombres utilisés est de type `int` ou `float`.

!!! danger "Contrainte"

    On interdit ici d'utiliser `max`, ainsi que `sort` ou `sorted`.

???+ example "Exemples"

    ```pycon
    >>> maximum([98, 12, 104, 23, 131, 9])
    131
    >>> maximum([-27, 24, -3, 15])
    24
    ```
???+ question "Exercice 4"

    Compléter ci-dessous 


    {{ IDE('scripts/maximum', SANS = "max, sorted, sort") }}
Fichiers utilisés pour cet exemple
maximum.py
# --- PYODIDE:code --- #

def maximum(nombres):
    ...


# --- PYODIDE:corr --- #

cents = [100 for k in range(10)]
entiers = [k for k in range(1, 11)]


# --- PYODIDE:tests --- #

assert maximum([98, 12, 104, 23, 131, 9]) == 131
assert maximum([-27, 24, -3, 15]) == 24

# --- PYODIDE:secrets --- #

assert maximum([1, 2, 3, 4, 5]) == 5
assert maximum([5, 4, 3, 2, 1]) == 5
assert maximum([5, 5, 5]) == 5
assert abs(maximum([5.01, 5.02, 5.0]) - 5.02) < 10**-6
assert maximum([-5, -4, -3, -8, -6]) == -3
assert maximum([1,2]) == 2
maximum_REM.md
!!! info "algorithme classique à connaître"

    Il s'agit d'une recherche de maximum classique. La liste étant non-vide, on initialise la variable `maxi` avec la première valeur de la liste.

Documentation détaillée - Option SANS

VI. Exemple 5 avec un IDE et du code caché dans le sujet en Python⚓︎

Code caché

Dans cet exemple le fichier sujet en Python contient une partie qui n'est pas visible par l'élève.

Ces lignes de codes sont situées dans la section # --- PYODIDE:env --- #

Voir plus bas les fichiers utilisés dans cet exemple

Code à copier
???+ question "Exercice 5"

    Vous ignorez le rôle de la fonction `mystere`, et vous ne voyez pas son code.

    Vous allez donc utiliser la fonction `help` native en Python.

    Compléter ci-dessous :


    {{IDE('scripts/mystere_code_cache')}}


    ??? success "Solution"

        ```python
        help(mystere)
        ```
Exercice 5

Vous ignorez le rôle de la fonction mystere, et vous ne voyez pas son code.

Vous allez donc utiliser la fonction help native en Python.

Compléter ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
Python
help(mystere)
Fichiers utilisés pour cet exemple
mystere_code_cache.py
# --- PYODIDE:env --- #

def mystere(nbre):
    """
    La fonction prend en paramètre un nombre entier.
    Elle renvoie True si ce nombre est un multiple de 7, False sinon

    >>> mystere(21)
    True
    >>> mystere(22)
    False

    """
    return nbre % 7 == 0

# --- PYODIDE:code --- #

"""
La fonction mystere est cachée.
A vous d'en découvrir les spécifications
"""

Exercice sans validation ni correction

Cet exercice a été conçu sans tests et sans correction. Il a donc été ajouté une admonition ??? success "Solution" pour que la solution soit accessible.

Documentation détaillée - Les fichiers Python

VII. Exemple 6 avec une plus grande fenêtre pour l'IDE⚓︎

Modifier la taille de l'IDE

Parfois on voudrait que l'IDE affiche un plus grand nombre de lignes.

Il suffit d'utiliser la syntaxe (pour 55 lignes par exemple) IDE('exo', MAX_SIZE=55)

Code à copier
???+ question "Exercice"

    Compléter le script ci-dessous :

    {{IDE('scripts/grand_IDE', MAX_SIZE=55)}}
Exercice

Compléter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Documentation détaillée - L'option MAX_SIZE

VIII. Exemple 7 avec des questions imbriquées⚓︎

Code à copier
???+ question "Exercice à tiroirs"


    **Question 1**

    Compléter la fonction `est_pair` qui prend en paramètre un nombre entier `nbre`, et renvoie `True` s'il est pair, `False` sinon.

    {{ IDE('scripts/parite') }}


    **Question 2**

    Compléter la fonction `filtre_pair` qui prend en paramètre un tableau de nombres entiers `entiers` et qui renvoie un nouveau tableau
    ne contenant que les nombres pairs de `entiers`.

    !!! danger "Contrainte"

        Vous appelerez **obligatoirement** la fonction écrite à la question 1. Elle est dans le code caché de cette question. Vous n'êtes pas obligé
        d'avoir réussi la question 1 pour répondre à cette question.

    {{ IDE('scripts/filtre') }}
Exercice à tiroirs

Question 1

Compléter la fonction est_pair qui prend en paramètre un nombre entier nbre, et renvoie True s'il est pair, False sinon.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tf1/y9okl(g2=pmn0 SP_srd)uvb-:ec%hai050y0F0b0J0K0j0w0s0G0j0J0w0w0n010b0K0o010406050w0A0p0p0J0x0f040t0h0j0A0#0h0q050e0,0.0:0=0*0o0405150~180e150*0y0K0B0T0V0X0Z0V0q0l0A0J0l0F0D0o0f0b0I0|0s0I0K0l0I0j1A0I0b0(050O0C0j0F1h0W0Y011z1B1D1B0b1J1L1H0b0x161v0T0^0w0o0J0q0Z0m011N1j010c0Q0F0q0J0p0F1H1)1+1:1P1?1L1_1{0(0a0s0u0x0h0o0h0w0K0{0q0s0M1%0x0x0F0G2g0~1~0q160e1v2t1Z1#1!1I0y201k0K0q1^2d1H1e1g0U1O2D2F0q0h2J1H0o2m162r2t2W0+1*2h2L1;2P0x0/0j1H0J1y2m0c0Z030v0v0G2Q0F1D2O0h0D0m0g0D0d0(0d0~0J2X2!0)2Z1 2$1P2(2*2,2.0F2:012=2@2_2{2G2~301.040m35371+2t2T0F2t2J2w0y1#2B3c0Z2^0M2I1f163z2V382q3Q3J3A3a2h0K0y0Z2?2r3q313g3X3Z3m0M3o2P3$320s240F3*3T3-2}2 3%2t363V2C010i0(0M0c3R3x0s3 3H010q0c0(0F0w0b0v1*0K0x462s491i1P0%040k4m3P3b4p0Z0q0(2P0p0C2m4u4o2M014r0z0E4u0*0 3Q2r0s3)013!2!3$3s052-4S2?3^2E3p3{1.3;1`3?4T3+2`4%3.4)1H0e360s4`484Q4a42042m0b0A0x0}4O474G2%4A0h4C4E562s4|2!400h0(0H4u5g4w4H0p0K0(3u5e045n2#4x015j040n0n5m581P5q0(0r4M4F0e3T3y2U0~3C0~0b3E5S2z2u0J1K3U0e3C4N0M0O0Q0w04.

Question 2

Compléter la fonction filtre_pair qui prend en paramètre un tableau de nombres entiers entiers et qui renvoie un nouveau tableau ne contenant que les nombres pairs de entiers.

Contrainte

Vous appelerez obligatoirement la fonction écrite à la question 1. Elle est dans le code caché de cette question. Vous n'êtes pas obligé d'avoir réussi la question 1 pour répondre à cette question.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tf1/yokl[ag23(=pmn0 SP_wrd)u]vb-:echsi050A0I0b0k0M0i0L0u0J0i0k0L0L0p010b0M0q010406050L0C0r0r0k0z0f040v0g0i0C0%0g0s050e0.0:0=0@0,0q040517101a0e170,0A0M0E0V0X0Z0#0X0s0l0C0k0l0I0G0q0f0b0K0~0u0K0M0l0K0i1C0K0b0*050Q0F0i0I1j0Y0!011B1D1F1D0b1L1N1J0b0z181x0V0`0L0q0k0s0#0m011P1l010c0S0I0s0k0r0I1J1+1-1=1R1^1N1{1}0*0a0u0w0z0g0q0g0L0M0}0s0u0O1)0z0z0I0J2i10200s180e1x2v1#1%1$1K0A221m0M0s1`2f1J1g1i0W1Q2F2H0s0g2L1J0q2o182t2v2Y0-1,2j2N1?2R0z0;0i1J0k1A2o0c0#030x0x0J2S0I1F2Q0g0G0n0t0G0d0*0d100k2Z2$0+2#212(1R2*2,2.2:0I2=012@2_2{2}2I30321:040m37391-2v2V0I2v2L2y0A1%2D3e0#2`0O2K1h183B2X3a2s3S3L3C3c2j0M0A0#2^2t3s333i3Z3#3o0O3q2R3(340u260I3,3V3/2 313)2v383X2E010h0*0O0c3T3z0u413J010s0c0*241#0I0x1,0M0z482u4b1k1R0)040o4o3R3d4r0#0s0*1`0%0I0z0L4w4q2O014t0B0H4w0,113S2t0u3+013$2$3(3u052/4V2^3`2G3r3}1:3?1|3^4W3-2|4*3:4,1J0e380u4}4a4T4c44042o0b0C0z0 4R494J1?4t0j4I504z4d0*0s0F2o4w4 2$42520c0g4n592u5o4y4K4B045k5m5v045x2%5h0g0y0*2G5n5b3f4C0s4E4G5N5g4K520M475E5G425A0I0L0b4k0R5u2!5V5c0*4v5E5O4A5j5l0I5f5p4c4M0D4P4I0e3V3A2W103E100b3G692B2w0k1M3W0e3E4Q0O0Q0S0L04.
Fichiers utilisés pour cet exemple
parite.py
# --- PYODIDE:code --- #

def est_pair(nombre):
    ...


# --- PYODIDE:corr --- #

def est_pair(nombre):
    return nombre % 2 == 0


# --- PYODIDE:tests --- #

assert est_pair(2) is True
assert est_pair(2000) is true
assert est_pair(1) is False
assert est_pair(777) is False

# --- PYODIDE:secrets --- #

assert est_pair(10**10) is True
assert est_pair(10**10 + 1) is False
assert est_pair(0) is True    
filtre.py
# --------- PYODIDE:env --------- #

def est_pair(n):
    return n % 2 == 0


# --------- PYODIDE:code --------- #

def filtre_pair(entiers):
    ...


# --------- PYODIDE:corr --------- #

def filtre_pair(entiers):
    return [nbre for nbre in entiers if est_pair(nbre)]


# --------- PYODIDE:tests --------- #

assert filtre_pair([1, 2, 3, 4, 5, 6, 7]) == [2, 4, 6]
assert filtre_pair([]) == []


# --------- PYODIDE:secrets --------- #

assert filtre_pair([100, 201, 302, 404, 501, 601, 700]) == [100, 302, 404, 700]

IX. Exercice en deux versions⚓︎

Code à copier
Compléter la fonction `dernier` qui prend en paramètre une liste de nombres `ma_liste`, et renvoie le dernier élément de cette liste.

=== "Version vide"

    {{ IDE('scripts/exo_vide') }}


=== "Version à compléter"

    {{ IDE('scripts/exo_trous') }}

Compléter la fonction dernier qui prend en paramètre une liste de nombres ma_liste, et renvoie le dernier élément de cette liste.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tqf1/yAokl[ag;234(=pmn SRP_rd)u]vb-:ech5si050D0L0b0m0Q0k0P0x0M0k0m0P0P0t010b0Q0u010406050P0F0v0v0m0C0g040y0i0k0F0+0i0w0x020m0v0u0o0x0z0L0^0C0c0F0L0P050f0=0@0_0{0:0u04051q1j1t0f1q0:0D0Q0H0Z0#0%0)0#0w0n0F0m0n0L0J0u0g0b0N120x0N0Q0n0N0k1V0N0b0.050U0I0k0L1C0$0(011U1W1Y1W0b1(1*1$0b0C1r1Q0Z0~0P0u0m0w0)0p011,1E010d0W0L0w160L1$2123281.2b1*2e0v2g040a0x0A0C0i0u0i0P0Q11130S1 0C0C0L0M2B1j2i0w1r0f1Q2N1{1}1|1%0D2k1F0Q0w2d2y1$1z1B0!1-2X2Z0w0i2%1$0u2G1r2L2N2@0;22132)292-0C0^0k1$0m1T2G0d0)030B0B0M2.0L1Y2,0i0J0q0r0J0e0.0e1j0m2^2{0/2`2j2}1.2 3133350L3701393b3d3f2!3i3k26040p3p3r232N2;0L2N2%2Q0D1}2V3w0)3c0S2$1A1r3T2?3s2K3.3%3U3u130Q0D0)3a2L3K3l3A3^3`3G0S3I2-3}3m0x2o0L413;443h3j3~2N3q3?2W010j0.0S0d3/3R0x4j3#010w0d4n0L0C0w0Q4z4q2M4t1D1.0-040s4E3-3v4H0)0w0.0^0B1Y0P0b0L4M4G2*014J0E0K4M0:1k3.2L0x40013{2{3}3M05344:3a4c2Y3J4f26482f4b3H4~45501$0f3q0x5c4s4.4u4m042G0b0F4A4M5e2{4k4R044T4V4X4Z5f4P4$0.0l5w5p4u0w0I0.2n5C4O4#4J4L4,3R4!2~4S0m4U0Q4W4Y5O4F5x5L0.0E5n5Q1.0i0.0J5(5!290v0Q3n5J2|5y4J0G4*4Z0f3;3S2=1j3W1j0b3Y642T2O0m1)3=0f3W1p4N5^4#2G0v0B0d0m0j0L0B0N0q0.1b1d1f1h0x4)5Y3S3t1q0h102G0x0P0~100Q1S0K4s1w3t2%4k1G1I1K1M1O1Q1S1:1X1Z1#6g4k2m2d2f0.0A1P1R0w4Z3,3?3Q4F5 4j4{0B3|0q0O4g4_4/3_4;423e564e7047495443783i7a270N36384|553g7g715a6(5g4y4p6A5o5K2~4x040S4A4C0C5@4k5M7G5E5S5U5W7J5_5$6z2@4+2_4.6|6~704^4`747m7e7o6 0J517c754}7(7Y7i7k3E7$777/7*595b5d5)0)5h5j5l6;7w7~4v7L5u5X7U5D7P045B6A855+045-845/1.5;5?8f8l0)5`5|8f5~3d606c6e620T0V0X04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tqf1/yA7okl[ag;23(=pmn6 SRP_rd)u]vb-:echsi050E0M0b0n0Q0l0P0y0N0l0n0P0P0t010b0Q0u010406050P0G0v0v0n0D0g040z0j0l0G0+0j0w0y020n0v0u0p0y0A0M0^0D0c0G0M0P050f0=0@0_0{0:0u04051q1j1t0f1q0:0E0Q0I0Z0#0%0)0#0w0o0G0n0o0M0K0u0g0b0O120y0O0Q0o0O0l1V0O0b0.050U0J0l0M1C0$0(011U1W1Y1W0b1(1*1$0b0D1r1Q0Z0~0P0u0n0w0)0q011,1E010d0W0M0w160M1$2123281.2b1*2e0v2g040a0y0B0D0j0u0j0P0Q11130S1 0D0D0M0N2B1j2i0w1r0f1Q2N1{1}1|1%0E2k1F0Q0w2d2y1$1z1B0!1-2X2Z0w0j2%1$0u2G1r2L2N2@0;22132)292-0D0^0l1$0n1T2G0d0)030C0C0N2.0M1Y2,0j0K0r0x0K0e0.0e1j0n2^2{0/2`2j2}1.2 3133350M3701393b3d3f2!3i3k26040q3p3r232N2;0M2N2%2Q0E1}2V3w0)3c0S2$1A1r3T2?3s2K3.3%3U3u130Q0E0)3a2L3K3l3A3^3`3G0S3I2-3}3m0y2o0M413;443h3j3~2N3q3?2W010k0.0S0d3/3R0y4j3#010w0d4n0M0D0w0Q4z4q2M4t1D1.0-040s4E3-3v4H0)0w0.0^0C1Y0P0b0M4M4G2*014J0F0L4M0:1k3.2L0y40013{2{3}3M05344:3a4c2Y3J4f26482f4b3H4~45501$0f3q0y5c4s4.4u4m042G0b0G4A4M5e2{4k4R044T4V4X4Z5f4P4$0.0m5w5p4u0w0J0.2n5C4O4#4J4L4,3R4!2~4S0n4U0Q4W4Y5O4F5x5L0.0F5n5Q1.0j0.0K5(5!290v0Q3n5J2|5y4J0H4*4Z0f3;3S2=1j3W1j0b3Y642T2O0n1)3=0f3W1p4N5^4#2G0v0C0d0n0k0M0C0O0r0.1b1d1f1h0y4)5Y3S3t1q0h102G0y0P0~100Q1S0L4s1w3t2%4k1G1I1K1M1O1Q1S1:1X1Z1#6g4k2m2d2f0.0B1P1R0w4Z3,3?3Q4F5 4j4{0C3|0r0i4g4_4/3_4;423e564e7047495443783i7a270O36384|553g7g715a6(5g4y4p6A5o5K2~4x040S4A4C0D5@4k5M7G5E5S5U5W7J5_5$6z2@4+2_4.6|6~704^4`747m7e7o6 0K517c754}7(7Y7i7k3E7$777/7*595b5d5)0)5h5j5l6;7w7~4v7L5u5X7U5D7P045B6A855+045-845/1.5;5?8f8l0)5`5|8f5~3d606c6e620T0V0X04.
Fichiers utilisés pour cet exemple
exo_vide.py
# --------- PYODIDE:code --------- #

def dernier(ma_liste):
    ...


# --------- PYODIDE:corr --------- #

def dernier(ma_liste):
    return ma_liste[len(ma_liste) - 1]


# --------- PYODIDE:tests --------- #

assert dernier([1]) == 1
assert dernier([3, 4, 5]) == 5


# --------- PYODIDE:secrets --------- #

assert dernier([5, 4, 3]) == 3
exo_trous.py
# --------- PYODIDE:code --------- #

def dernier(ma_liste):
    return ma_liste[len( ...) - ...]


# --------- PYODIDE:corr --------- #

def dernier(ma_liste):
    return ma_liste[len(ma_liste) - 1]


# --------- PYODIDE:tests --------- #

assert dernier([1]) == 1
assert dernier([3, 4, 5]) == 5


# --------- PYODIDE:secrets --------- #

assert dernier([5, 4, 3]) == 3
exo_vide_REM.md
Autre solution : 

```python
def dernier(ma_liste):
    return ma_liste[- 1]
```
exo_trous_REM.md
Autre solution : 

```python
def dernier(ma_liste):
    return ma_liste[- 1]
```

X. Exercice avec la réponse à chercher ailleurs (avec un lien interne)⚓︎

La réponse est à chercher en suivant un lien

Code à copier
???+ question 

    Comment fait-on une admonition "note pliée" ?

    ??? success "Solution"

        Vous pouvez trouver la réponse ici : [admonitions](../02_basique/2_page_basique.md)

        On indique juste le nom du fichier s'il est dans le même dossier.
Question

Comment fait-on une admonition "note pliée" ?

Solution

Vous pouvez trouver la réponse ici : admonitions

On indique juste le nom du fichier s'il est dans le même dossier.

XI. Cause fréquente de pannes :⚓︎

Sections vides

Il ne faut pas de section vide dans le fichier python d'un exercice :

Ceci mettra le pipeline en échec :

mon_exo.py
# --- PYODIDE:env --- #



# --- PYODIDE:code --- #

def ma_fonction(nombre):
    ...

Si on n'a pas besoin d'une section, on ne l'écrit pas :

Ceci est correct

mon_exo.py
# --- PYODIDE:code --- #

def ma_fonction(nombre):
    ...

absence de la section secrets

Si votre exercice contient une section # --- PYODIDE:corr --- #, ou un fichier de remarque comme exo_REM.md mais pas de section # --- PYODIDE:secrets --- #, cela mettra le pipeline en échec.

Modifier ces comportements?

Il est possible de changer ce type de comportement en modifiant la configuration du plugin pyodide_macros, dans le fichier mkdocs.yml.

Les options généralement en jeu sont les suivantes (passer à false celle qui vous concerne, si vous souhaitez autoriser le comportement en question) :

YAML
plugins:
    - pyodide_macros
        ides:
            forbid_secrets_without_corr_or_REMs: true
            forbid_hidden_corr_and_REMs_without_secrets: true
            forbid_corr_and_REMs_with_infinite_attempts: true

Voir la documentation détaillée pour des informations sur les différentes options.

XII. Insérer une section d'un fichier python d'exercice⚓︎

Contenu du fichier mystere_section.py
Le fichier mystere_section.py
# --- PYODIDE:env --- #

def mystere(nbre):
    """
    La fonction prend en paramètre un nombre entier.
    Elle renvoie True si ce nombre est un multiple de 7, False sinon

    >>> mystere(21)
    True
    >>> mystere(22)
    False

    """
    return nbre % 7 == 0

# --- PYODIDE:code --- #

"""
La fonction mystere est cachée.
A vous d'en découvrir les spécifications
"""

...

# --- PYODIDE:corr --- #

help(mystere)

On peut faire afficher dans la page en cours n'importe quelle section se trouvant dans ce fichier.

La macro section

Code à copier
* Voici la fonction `mystere`  qui se trouve dans le code caché

{{ section('scripts/mystere_section', 'env') }}

* Voici la correction de cet exercice

{{ section('scripts/mystere_section', 'corr') }}
  • Voici la fonction mystere qui se trouve dans le code caché :
Python
def mystere(nbre):
    """
    La fonction prend en paramètre un nombre entier.
    Elle renvoie True si ce nombre est un multiple de 7, False sinon

    >>> mystere(21)
    True
    >>> mystere(22)
    False

    """
    return nbre % 7 == 0
  • Voici la correction de cet exercice :
Python
help(mystere)

Documentation détaillée - macro section

XIII. Site de référence pour toutes les syntaxes et d'autres possibilités⚓︎

Seules les possibilités les plus couramment utilisées ont été expliquées dans ce tutoriel. Il en existe d'autres :

Documentation détaillée de pyodide-mkdocs-theme par F. Zinelli

XIV. Exemple de puzzle⚓︎

Site pour créer les puzzles : Création de puzzles

Cliquer sur le menu en haut à droite (plier/déplier) pour recopier le code à insérer.

Code à copier
La réponse attendue est `cinq = [5 for k in range(20)]`

???+ question

    <iframe src="https://www.codepuzzle.io/p/T3WK" width="100%" height="300" frameborder="0"></iframe>

Rendu :

La réponse attendue est cinq = [5 for k in range(20)]

Question