Aller au contenu

Écrire 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, les remarques avec un fichier mon_exo_REM.md) utilisées avec l'ancien Pyodide ou PMT version antérieure à Pyodide MkDocs Theme v.5.0.0 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 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 des explications.
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 :
    Au bout de deux essais validés, la solution s'affichera.
    À droite de l'IDE, vous trouverez en haut ### qui permet de désactiver le code après la ligne # Tests, et en bas des icônes pour entrer ou sortir du mode 2 colonnes ou plein écran. N'hésitez pas tester ces possibilités.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013iéwbESRm)4;c.as_p1àlun5qg3:PD/0vft-ky2odx(hU+r e=050O0W0I0o0b0u0p0V0m0u0o0p0p0X010I0b0r010406050p0v0i0i0o0U0L040g0N0u0v0=0N0w0V020o0i0r0l0V0h0W0 0U0y0v0W0p050E0|0~10120`0r04051x1q1A0E1x0`0O0b0G0*0,0.0:0,0w0z0v0o0z0W0J0r0L0I0R190V0R0b0z0R0u1$0R0I0^050#0e0u0W1J0-0/011#1%1)1%0I1/1;1-0I0U1y1X0*150p0r0o0w0:0M011?1L010H0%0W0w1d0W1-282a2f1^2i1;2l0i2n040a0V0C0U0N0r0N0p0b181a0Z260U0U0W0m2I1q2p0w1y0E1X2U2224231.0O2r1M0b0w2k2F1-1G1I0+1@2(2*0w0N2.1-0r2N1y2S2U2~0{291a2:2g2@0U0 0u1-0o1!2N0H0:030q0q0m2^0W1)2?0N0J0F0J0s0^0s1q0o2 320_312q341^36383a3c0W3e013g3i3k3m2+3p0J2d040M3v3x2a3z2S2%013E0o391y3b0R3d3f3h3j0Z3O2@3Q0A0^0A3V2R3y0`3Z3C0:3$3(053*3,3K3.3N2)3P3q0k0^0k3`1r3|3A331K3D0N373%3G3+3I3-3M3:493=3q0x0^0x4f301D2|1q2.2X0O242$3 013/2x0Y1H1y2{0W2}3y3{3X054N4U2q0b0O0:3h2S3Q3s3)0V4$4(4t3l4v3o3q3s0V2v0W4:4N3;4@3r1-0E3w4i3!0K0^0Z0H4W2T554L0d0^0V5b4!4j2;3#0H0^0p0N0~0W5i5d4k0:0@040Q5t3~5v3#0^2@0i0e2N1p4g4X5B5l5x0j0B5i0`5K5c3Z4/014)323Q3S434.4%5X4;4 5!2e4{4}483n5,2U3w0V5^5h5M350^5I0v0u0#0I5i5`323!0N0^0X635u5l0i0b0^0F5R5A655W5Y2a3?3G6k5*4?6n4`2m5/4u5;3q3@5?045_643B5C57040H4m6a5{3D5E5H5s5T6B6b2g0N5f042)6K654L0w5E5q6O5J306L5w0^5Q6Q5S6*6j5(6l0w3Q4c4-6p4~6r4b5-6u5)6}6x0J6`3V6C6C6S6M045~600o626Q6D5k6T686Y6E5l6#7c1o5 617m7j1^67040T7u3!7p0w6O6h6Q556p4*4x6o6?6q744y6t2w6v4=7O525@5_7a0:6G2N0I0v0U0w7A6!5}7r7e7g2~6:4V0E4Z1B4E0E4G1q0I4I7|2!2V0o1:4T4F4Q1w5j3!2N0i0q0H0o0K0W0q0R6z1i1k1m1o0V6.4C1E4P2/5C0o0O0i192H0b1Z2)6I0^1w3!8v8x0w8z190J0=0I20040S1a0o0m0m0}5 7f0W7%1B3z1x0D2a0)0,0V6I0w2P8A1a4Y3k045p5r1q4Z0V8+0G100b821;5h4Z7d7t7?8?0V1o0I0V0v8;0p22190z048T8V0i8X0I8Z0U2R9g1O040n0V060f0u920r0W370!0V2K9f0N0m8f0U999b2K9l5 9C9F8n8~1;7%0)0o0v8,7%9M0V0t0V2w0|2N9S8|000W0P0c8V2I9-8+0e0N0v0+1=8=0Z6H6J97a00n8#5S4Ga70!0$0(04.

Les syntaxes⚓︎

Attention

Le fichier contenant les parties Python de votre exercice 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.

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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013]iwbSm)c_as[p1lun5geP/vft-ky2d(hr o=050E0u0z0k0c0p0l0I0i0p0k0l0l0K010z0c0n010406050l0q0g0g0k0H0C040f0J0p0q0#0J0r050w0,0.0:0=0*0n0405150~180w150*0E0c0x0T0V0X0Z0V0r0t0q0k0t0u0A0n0C0z0G0|0I0G0c0t0G0p1A0G0z0(050O0e0p0u1h0W0Y011z1B1D1B0z1J1L1H0z0H161v0T0^0l0n0k0r0Z0D011N1j010y0Q0u0r0k0g0u1H1)1+1:1P1?1L1_1{0(0a0I0v0H0J0n0J0l0c0{0r0I0M1%0H0H0u0i2g0~1~0r160w1v2t1Z1#1!1I0E201k0c0r1^2d1H1e1g0U1O2D2F0r0J2J1H0n2m162r2t2W0+1*2h2L1;2P0H0/0p1H0k1y2m0y0Z030j0j0i2Q0u1D2O0J0A0s0A0o0(0o0~0k2X2!2t2T0u2t2J2w0E1#2B2$1P2^0M2I1f16392V372q3q3j3a2Z1 0c0E0Z2?2r2~302,0I3x3z2@2_2{2G3C310I240u3H3t3K2P3M1H0w353v2#1i1P0r0(0/0j1D0l0z0u3r1+040I3Z2C010J0(0K3/2s3=2r3@0%040m3|3p1 3h0Z3%040c443~2!3@0B0(0y0J0H4c3?4701494b0 374d463#0Z0J0d0(2E4l3 4n0r0e0(0H1+1q444m4v01410F4K4C4M0g0c0(0s4Q4e4n410h0b440*4r3:0~3t382U0~3c0~0z3e4;2z2u0k1K3u0w3c4(0M0O0Q0l04.

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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013]iwbSm)7c_as[p1lun5geP/vft-ky2d(hr o=050F0v0A0l0c0q0m0J0j0q0l0m0m0L010A0c0o010406050m0r0g0g0l0I0D040f0K0q0r0$0K0s050x0-0/0;0?0+0o0405160 190x160+0F0c0y0U0W0Y0!0W0s0u0r0l0u0v0B0o0D0A0H0}0J0H0c0u0H0q1B0H0A0)050P0e0q0v1i0X0Z011A1C1E1C0A1K1M1I0A0I171w0U0_0m0o0l0s0!0E011O1k010z0R0v0s0l0g0v1I1*1,1;1Q1@1M1`1|0)0a0J0w0I0K0o0K0m0c0|0s0J0N1(0I0I0v0j2h0 1 0s170x1w2u1!1$1#1J0F211l0c0s1_2e1I1f1h0V1P2E2G0s0K2K1I0o2n172s2u2X0,1+2i2M1=2Q0I0:0q1I0l1z2n0z0!030k0k0j2R0v1E2P0K0B0i0B0p0)0p0 0l2Y2#2u2U0v2u2K2x0F1$2C2%1Q2_0N2J1g173a2W382r3r3k3b2!200c0F0!2@2s2 312-0J3y3A2^2`2|2H3D320J250v3I3u3L2Q3N1I0x363w2$1j1Q0s0)0:0k1E0m0A0v3s1,040J3!2D010K0)0L3:2t3?2s3^0(040n3}3q203i0!3(040c453 2#3^0C0)0z0K0I4d3@48014a4c10384e473$0!0K0d0)2F4m404o0s0e0)0I1,1r454n4w01420G4L4D4N0g0c0)0t4R4f4o420h0b450+4s3;0 3u392V0 3d0 0A3f4=2A2v0l1L3v0x3d4)0N0P0R0m04.

Guide détaillé Fichiers/IDE

II. Exemple 1 - avec un IDE mais pas de remarques supplémentaires⚓︎

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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013iwbSm);cas_Bp1lunqg9:P/vft-ky2od(hj+r e=050G0N0A0j0b0p0k0M0i0p0j0k0k0O010A0b0n010406050k0q0f0f0j0L0D040e0F0p0q0)0F0r050x0:0=0@0_0.0n040519121c0x190.0G0b0y0X0Z0#0%0Z0r0t0q0j0t0N0B0n0D0A0I100M0I0b0t0I0p1E0I0A0,050S0d0p0N1l0!0$011D1F1H1F0A1N1P1L0A0L1a1z0X0|0k0n0j0r0%0E011R1n010z0U0N0r0j0f0N1L1-1/1@1T1`1P1}1 0,0a0M0w0L0F0n0F0k0b0 0r0M0Q1+0L0L0N0i2k12220r1a0x1z2x1%1)1(1M0G241o0b0r1|2h1L1i1k0Y1S2H2J0r0F2N1L0n2q1a2v2x2!0/1.2l2P1^2T0L0?0p1L0j1C2q0z0%030l0l0i2U0N1H2S0F0B0u0B0o0,0o120j2#2(0-2%232*1T2,2.2:2=0N2@012_2{2}2 2K320B1=040E383a1/2x2X0N2x2N2A0G1)2F3f0%2|0Q2M1j1a3C2Z3b2u3T3M3D3d2l0b0G0%2`2v3t351a2;3!3$3p0Q3r2T3)1?280N3.3W3;31333*3y3Y2G010C0,0Q0z3U3A413K010c0,0M482w4a1m3g0z0,0j0i0i0q0N0U4g3S3e4j0%0+040H4t4i2Q010r0,3C2T0f4B2v424y0g0v4t0.133T4L3-013%2(3t3v053,3#4W3/2~2I3s331=0M3^3`3q4+3=4-1L0x390M4|4f4L4b44042q0A0q0L114S3A4~2(420k3v020s0q0F0A0h0m100J0F550M5f5h5j4t5a4v4D0F0,0K5u4C2+4G2q4I4Q4B0x3W3B2Y123F120A3H5P2D2y0j1O3X0x3F4R0Q0S0U0k04.

Fichier utilisé pour cet exemple

bonjour.py
# --- PMT:code --- #

def accueil(prenom):
    ...


# --- PMT:corr --- #

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


# --- PMT:tests --- #

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


# --- PMT:secrets --- #

assert accueil("fegrehjtyjtqfqsgeryryrfg") == "Bonjour fegrehjtyjtqfqsgeryryrfg"
Remarque : ancienne syntaxe qui fonctionne encore
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 remarques supplémentaires⚓︎

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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013]iwbSm)cas_[p1lung3P/0vft-ky2od(,hr e=050F0L0z0j0c0p0k0K0i0p0j0k0k0M010z0c0n010406050k0q0g0g0j0J0C040f0E0p0q0%0E0r050v0.0:0=0@0,0n040517101a0v170,0F0c0x0V0X0Z0#0X0r0s0q0j0s0L0A0n0C0z0I0~0K0I0c0s0I0p1C0I0z0*050Q0e0p0L1j0Y0!011B1D1F1D0z1L1N1J0z0J181x0V0`0k0n0j0r0#0D011P1l010y0S0L0r0j0g0L1J1+1-1=1R1^1N1{1}0*0a0K0u0J0E0n0E0k0c0}0r0K0O1)0J0J0L0i2i10200r180v1x2v1#1%1$1K0F221m0c0r1`2f1J1g1i0W1Q2F2H0r0E2L1J0n2o182t2v2Y0-1,2j2N1?2R0J0;0p1J0j1A2o0y0#030l0l0i2S0L1F2Q0E0A0o0t300*0o100j2Z2$0+2#212(1R2*2,2.2:0L2=012@2_2{2}2I30321:040D36381-2v2V0L2v2L2y0F1%2D3d0#2`0O2K1h183A2X392s3R3K3B3b2j0c0F0#2^2t3r33182/3Y3!3n0O3p2R3%0o1;260L3,3U3/2 313(3w3W2E010r0*0i1`0z0k3S3y0K403I010E0*0M492u4b2t410)040m4i3Q3c1k1R0g0c340w0w4q4k2$410B0*0y0E0J4A4c4t0#43040B4J4l4d0E0d0*2G4Q4C4d0r0e0*0J1-1s4q4K2O014n0G4*4R4L014v4x4:4Y4=4n0h0b4q0,113R4l3+013#2$3%3t053*3Z553-2|2G3q3}1:0K3@3_3o5g3:5i1J0v374+2)0*460c0L0J48514a5u1R4f044h5C4j5E0#4n4p5J4r2%4=4N4P5P4B4s4,4E044G4I5V5L420*5U2Y5W5R4,4T4V0 5%4;4,4!4$4(0L4_5X1?4.5}5.1?4@04355P5(4n0H4X5~4u4w65662!5@5 0*4}4 4*0v3U3z2W103D100z3F6u2B2w0j1M3V0v3D500O0Q0S0k04.
Fichier utilisé pour cet exemple
construction.py
# --- PMT: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 = ...

# --- PMT:corr --- #

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


# --- PMT: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]

# --- PMT:secrets --- #

assert cents == 10 * [100]
assert entiers == [k for k in range(1, 11)]
Remarque : ancienne syntaxe qui fonctionne encore
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 # --- PMT:corr --- # le fichier python doit absolument comporter la section :
# --- PMT:secrets --- #

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

IV. Exemple 3, avec un IDE et des remarques supplémentaires⚓︎

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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013iéwbESRm)74;cas_p1à%lunI5FqgT6:3P/0vft-ky2odx(hr e=è050S0Y0M0o0b0v0p0X0n0v0o0p0p0Z010M0b0r010406050p0w0i0i0o0W0P040g0R0v0w0^0R0x0X020o0i0r0m0X0h0Y120W0B0w0Y0p050I0 1113150}0r04051A1t1D0I1A0}0S0b0K0-0/0;0?0/0x0C0w0o0C0Y0N0r0P0M0V1c0X0V0b0C0V0v1)0V0M0{050(0e0v0Y1M0:0=011(1*1,1*0M1=1@1:0M0W1B1!0-180p0r0o0x0?0Q011_1O010L0*0Y0x1g0Y1:2b2d2i1{2l1@2o0i2q040a0X0H0W0R0r0R0p0b1b1d0$290W0W0Y0n2L1t2s0x1B0I1!2X2527261;0S2u1P0b0x2n2I1:1J1L0.1`2+2-0x0R2;1:0r2Q1B2V2X310~2c1d2?2j2`0W120v1:0o1%2Q0L0?030q0q0n2{0Y1,2_0R0N0s0E3s0{0s1t0o32350|342t371{393b3d3f0Y3h013j3l3n3p2.3s3u2g040Q3y3A2d2X2~0Y2X2;2!0S272)3F0?3m0$2:1K1B3$303B2U3`3:3%3D1d0b0S0?3k2V3T3v1B3e41433P0$3R2`460s2h2y0Y4b3}4e3r3t473Y3 2*010O0{0$0L3{3!4s3.010d0{0X4z2W4B1N3G0L0{1r0M0q2c0b0W4H3_3E4K0?0`040U4U4J2@010x0{2`0i0e2Q4$2V4t4Z0j0F4U0}1u3`4;4a014435463V0549424 4c3o2,3S4p2g0X4j4l3Q5a4f5c1:0I3z0X5o4G4;4C4v042Q0M0w0W0x4U5q354t4*044,4.0Y5A4%2j0R0{0u5J5r4X010i0b0{3X4{3!5B4W4(5M040Z0Z5P5C4C5T0{0J4_4$0I3}3#2 1t3)1t0M3+5{2%2Y0o1?3~0I3)1z4V365R2Q0i0q0L0o0O0Y0q0V0G0{1l1n1p1r0X4^5X4I1G3C2;4t0o0S0i1c2K0b1$2,0L5$1z6w6y6A2L0N0^0M23040f0T3$0;6C1d0e0R180c2n2-1E3C1A6l131p1c0,6n4G5?5G2Q0X0u0X0Q0X5(0X5/5=3n040X4O0X0w2-726S2Q6U1$6X6Z6#1^1p0b0X0p000c0K0o191^0t6:700D0W1q1t5?0X0R0w7r0$040A7n0p5I6 7C6%660y0v720p0M5q251c0C04250!0,3b6x2F2K2U7S1R710S7k0n0W4S7H1H0#1K4t1Q1S1U1W1Y1!1$1}1+1-1/674t2w2n2p0{2C0g7-0_7Q0H1Z1#5z6r3@5^338i055?4s4~502d3s0k4q555g4d5i4o8u4h5e2p8x593q8t3v3K3M3O4m8z8I4h2X3z5K1{5t4x4:5+5R4E718X5!384M044O4Q0)4T8m5Q4(4Z4#8/8Y4(5E6=7H338:2j4?6q314`8}5C8q0q450s8u538w578N8H990N5d5f9d5h9f9a2h0V3g3i3k9e5b9n8R715p8T0?5t0b4y8i5Z688_4+0R4-4/9E9z015$5O9M8~1{5-3W5*8%1{5$5(9W9G2j9U6~949X4Y0{913B934|95568r0x8I6j480X969t5j8u6j8D2z8F4n9_9o9q3N9s9l9u0N9`3Y5pag9F4t5t5v5x8h31ai5s0n0{7t7v8i9:4A4}9?97519g0l3J9}ab9 0NaDa24k9k8y9maIa73L9r58a5aC5l5n9y9S9A4N0+8|9;9+014Z9.3!aw4Iay4b988u0zaEaz9~8A0Na@aKa48O9ga}9paRa9aTb0a?aW9xahap5Rak0%am9#ajar7D7Fa%a-5;8o1G5^643?4`655_0%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)}}
Fichier utilisé pour cet exemple

La section # --- PMT:REM --- # est écrite en markdown, en utilisant des admonitions si l'on veut.

pair.py
# --- PMT:code --- #

def est_pair(nombre):
    ...


# --- PMT:corr --- #

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


# --- PMT: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


# --- PMT:secrets --- #

assert est_pair(10**10) is True
assert est_pair(10**10 + 1) is False
assert est_pair(0) is True


# --- PMT:REM --- #

!!! 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
    ```    
Remarque : ancienne syntaxe qui fonctionne encore
pair.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


# --- PYODIDE:REM --- #

!!! 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
    ```

Documentation détaillée sur les fichiers de remarques pour un usge expert en local, et pas en ligne via Web IDE

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
🐍 Console Python
>>> 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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013]iéwbSRm)4;c.as_[p1àlunîI5qg36:P/0vftL-ky2odx(h,r e=è050S0Z0L0o0c0v0p0Y0m0v0o0p0p0!010L0c0s010406050p0w0i0i0o0X0P040g0R0v0w0_0R0x0Y020o0i0s0l0Y0h0Z130X0B0w0Z0p050H101214160~0s04051B1u1E0H1B0~0S0c0J0.0:0=0@0:0x0C0w0o0C0Z0N0s0P0L0V1d0Y0V0c0C0V0v1*0V0L0|050)0f0v0Z1N0;0?011)1+1-1+0L1?1^1;0L0X1C1#0.190p0s0o0x0@0Q011`1P010K0+0Z0x1h0Z1;2c2e2j1|2m1^2p0i2r040a0Y0G0X0R0s0R0p0c1c1e0%2a0X0X0Z0m2M1u2t0x1C0H1#2Y2628271=0S2v1Q0c0x2o2J1;1K1M0/1{2,2.0x0R2=1;0s2R1C2W2Y320 2d1e2@2k2{0X130v1;0o1(2R0K0@030q0q0m2|0Z1-2`0R0N0Q0Q0N0t0|0t1u0o33360}352u381|3a3c3e3g0Z3i013k3m3o3q2/3t3v2h040Q3A3C2e3E2W2+013J0o3d1C3f0V3h3j3l3n0%3T2{3V0N0D0|0D3!2V3D0~3(3H0@3+3-053/3;3P3?3S2-3U3u0N0k0|0k401v423F371O3I0R3b3,3L3:3N3=3R3^4f3`4h0A0|0A4m3243363)474w4b3Q3@3p4C3s4h0E0|0E4I3D1F301u2=2#0S282*45014R2;1L1C2 0Z314!4n3$054R4^2u0c0S0@3l2W3{3x3.0Y50524A4S3r552i2z0Z5a4R3_4U3v5640444r0@0O0|0%0K414{5p2^010e0|0Y5w2X4p4M0K0|130T0c0i115E4~4q5z0{040U5P5G4-0x0|2{0i0f2R1t4`5F5y2k5T0j0F5P0~5*5Q58510153363{3X495^5i4e5d4h2h0Y5g614B633W1;0H3B0Y6f5D5,3I5J0o5L5P6h4L4-0R0|0!6n5X5q3*5!0R5$5(5W6i0@5T0r6C6p6w0i0c0|0I6H3G6w5T0b5;6O1e595`0q544h3}576W4d694g3v3}662q685c6*3|6c6e6g6v5z5s040K4t6u6D6x040T6 6I5z0R5B042-746P5z5Z045#5%1s6U3)5T5:5?5=343(6%6Y5|4h4j6$5_6(6:4D3v4j6-2A6/5k3{7v3!6g7K6o7c2k6{0c5v5?7M5R390|737S6_2k6r04020C0L0l7b7U6j045K0c7j4-7l6T5?5G7r6Z3v4F7w7F4T3{4F7D5h6X5j804E6?047L8b7T4M6k6m7Y707#6t8h757V727@7p4L7`7t3v4W7~85626;4W837 6a0N8v7J6^706{2R0L0w0X0x7+8e7.6l7:7n5W0H4}4#4@4%4;1u0L4*8$2(2Z0o1@8Z0H4(1A5@4-2R0i0q0K0o0O0Z0q0V6#1m1o1q1s0Y7m341H3E2=3)0o0S0i1d2L0c1%2-6}0|1A9b9d9f2M0N0_0L24043,0C4t2L0V2A2v0c930Y0u2a0x2p0y260Z1F3E1B0z0v0Y0p001V2L0Y0S000w2.0Y2R0m0V0Z0X9(1_2O7/5N0i9C930n0Y0M3f1-0p0L1_0d0)0x0L661d0N0J500Z0W0Y9i0x9g3,0c0p1_0:0Y0J140c8,1^5D4}7/1u4}0Y0o0J2S0Yai4?6K0#2Raj3,0Z8M9Xah9`af9}0n9N5=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") }}
Fichier utilisé pour cet exemple
maximum.py
# --- PMT:code --- #

def maximum(nombres):
    ...


# --- PMT:corr --- #

def maximum(nombres):
    maxi = nombres[0]
    for x in nombres:
        if x > maxi:
            maxi = x
    return maxi


# --- PMT:tests --- #

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

# --- PMT: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

# --- PMT:REM --- #

!!! 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.
Remarque : ancienne syntaxe qui fonctionne encore
maximum.py
# --- PYODIDE:code --- #

def maximum(nombres):
    ...


# --- PYODIDE:corr --- #

def maximum(nombres):
    maxi = nombres[0]
    for x in nombres:
        if x > maxi:
            maxi = x
    return maxi


# --- 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

# --- PYODIDE:REM --- #

!!! 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

Documentation détaillée sur les fichiers de remarques pour un usge expert en local, et pas en ligne via Web IDE

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 # --- PMT: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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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
🐍 Script Python
help(mystere)
Fichier utilisé pour cet exemple
mystere_code_cache.py
# --- PMT: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

# --- PMT:code --- #

"""
La fonction mystere est cachée.
A vous d'en découvrir les spécifications
"""
Remarque : ancienne syntaxe qui fonctionne encore
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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013iwbSm)c_asp1%lung3:eP/0vft-ky2d(hr o=050F0u0A0j0b0o0k0J0h0o0j0k0k0L010A0b0l010406050k0p0f0f0j0I0D040e0K0o0p0$0K0q050w0-0/0;0?0+0l0405160 190w160+0F0b0y0U0W0Y0!0W0q0r0p0j0r0u0B0l0D0A0H0}0J0H0b0r0H0o1B0H0A0)050P0d0o0u1i0X0Z011A1C1E1C0A1K1M1I0A0I171w0U0_0k0l0j0q0!0E011O1k010z0R0u0q0j0f0u1I1*1,1;1Q1@1M1`1|0)0a0J0v0I0K0l0K0k0b0|0q0J0N1(0I0I0u0h2h0 1 0q170w1w2u1!1$1#1J0F211l0b0q1_2e1I1f1h0V1P2E2G0q0K2K1I0l2n172s2u2X0,1+2i2M1=2Q0I0:0o1I0j1z2n0z0!030i0i0h2R0u1E2P0K0B0s0E0B0m0)0m0 0j2Y2#0*2!202%1Q2)2+2-2/0u2;012?2^2`2|2H2 311/040E36381,2u2U0u2u2K2x0F1$2C3d0!2_0N2J1g173A2W392r3R3K3B3b2i0b0F0!2@2s3r323h3Y3!3n0N3p2Q3%330J250u3+3U3.2~303(2u373W2D010C0)0N0z3S3y403I010c0)0J472t491j3e0z0)0u0k0A0i1+0b0I4f3Q3c4i0!0(040G4t4h2N010q0)2Q0f0d2n4B2s414y0g0t4t0+103R4M3*013#2#3%3t052.4W2@3_2F3q3|1/3=1{3@4X3,2{4+3/4-1I0w370J4~4e4M4a43042n0A0p0I0~4T3y502#414F044H4J0u4t5c4v4D0K0)0n5k4C1=0f0b0)3v5a2t5l2$4w015o040L0L5r515C5u0)0x4R4B0w3U3z2V0 3D0 0A3F5W2A2v0j1L3V0w3D4S0N0P0R0k04.

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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013]iwbSm)c_as[p1lung3:eP/vft-ky2d(hr o=050F0v0A0k0c0p0l0J0i0p0k0l0l0L010A0c0n010406050l0q0g0g0k0I0D040f0K0p0q0$0K0r050x0-0/0;0?0+0n0405160 190x160+0F0c0y0U0W0Y0!0W0r0s0q0k0s0v0B0n0D0A0H0}0J0H0c0s0H0p1B0H0A0)050P0e0p0v1i0X0Z011A1C1E1C0A1K1M1I0A0I171w0U0_0l0n0k0r0!0E011O1k010z0R0v0r0k0g0v1I1*1,1;1Q1@1M1`1|0)0a0J0w0I0K0n0K0l0c0|0r0J0N1(0I0I0v0i2h0 1 0r170x1w2u1!1$1#1J0F211l0c0r1_2e1I1f1h0V1P2E2G0r0K2K1I0n2n172s2u2X0,1+2i2M1=2Q0I0:0p1I0k1z2n0z0!030j0j0i2R0v1E2P0K0B0t0t0B0o0)0o0 0k2Y2#0*2!202%1Q2)2+2-2/0v2;012?2^2`2|2H2 311/040E36381,2u2U0v2u2K2x0F1$2C3d0!2_0N2J1g173A2W392r3R3K3B3b2i0c0F0!2@2s3r323h3Y3!3n0N3p2Q3%330J250v3+3U3.2~303(2u373W2D010C0)0N0z3S3y403I010d0)0J472t491j3e0z0)231!0v0j1+0c0I4f3Q3c4i0!0(040G4t4h2N010r0)1_0$0v0I0l4B2s414y0h0u4t0+103R4N3*013#2#3%3t052.4X2@3_2F3q3|1/3=1{3@4Y3,2{4,3/4.1I0x370J4 4e4N4a43042n0A0q0I0~4U3y512#4O0)0m4M5e4a4F040r0e2n4t5d4v4D540z0K4s5b2t5r2$4w4E0)5n5p5y045A410K4c042F5q4C2(4G0r4I4K5P525C540c465H5J5k4G0l0A4p0Q5x2Z5X4D4y4A5H5Q3e5E5o0v5i5s1=4P0b4S4B0x3U3z2V0 3D0 0A3F6a2A2v0k1L3V0x3D4T0N0P0R0l04.
Fichier utilisé pour cet exemple
parite.py
# --- PMT:code --- #

def est_pair(nombre):
    ...


# --- PMT:corr --- #

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


# --- PMT: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

# --- PMT:secrets --- #

assert est_pair(10**10) is True
assert est_pair(10**10 + 1) is False
assert est_pair(0) is True
Remarque : ancienne syntaxe qui fonctionne encore
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"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.1280138i]wbSRm);cas_[p1lunqg3:9P/vft-ky2od(hAr e=050K0Q0E0m0c0s0n0P0l0s0m0n0n0R010E0c0q010406050n0t0i0i0m0O0H040g0J0s0t0,0J0u0P020m0i0q0k0P0h0Q0_0O0v0t0Q0n050B0?0^0`0|0;0q04051r1k1u0B1r0;0K0c0C0!0$0(0*0$0u0w0t0m0w0Q0F0q0H0E0M130P0M0c0w0M0s1W0M0E0/050V0f0s0Q1D0%0)011V1X1Z1X0E1)1+1%0E0O1s1R0!0 0n0q0m0u0*0I011-1F010D0X0Q0u170Q1%2224291/2c1+2f0i2h040a0P0A0O0J0q0J0n0c12140T200O0O0Q0l2C1k2j0u1s0B1R2O1|1~1}1(0K2l1G0c0u2e2z1%1A1C0#1.2Y2!0u0J2(1%0q2H1s2M2O2^0=23142*2a2.0O0_0s1%0m1U2H0D0*030o0o0l2/0Q1Z2-0J0F0x0b0F0r0/0r1k0m2_2|0:2{2k2~1/303234360Q38013a3c3e3g2#3j3l27040I3q3s242O2=0Q2O2(2R0K1~2W3x0*3d0T2%1B1s3U2@3t2L3/3(3V3v140c0K0*3b2M3L3m3B3_3{3H0T3J2.3~3n0P2p0Q423=453i3k3 2O3r3@2X010G0/0T0D3:3S4k3$010e0/0P4r2N4t1E3y0D4o0Q0O0u0c4G4z3.3w4C0*0.040L4L4B2+010u0/0_0o1Z0n0E0Q4T2M4l4Q0j0y4L0;1l3/4*41013|2|3~3N05354@3b4d2Z3K4g27492g4c3I5246541%0B3r0P5g4y4*4u4n042H0E0t4H4L5i2|4l4X044Z4#4%4)5t4u4Q0p5A4N4V0u0f0/2o5F2}4O014Q4S4;4s5j5O5v5x0c4$4(5S4A5U4V4,5r4U2a0J0/0F5*5%2a0i0c3o5M4+0/0d4/4T0B3=3T2?1k3X1k0E3Z652U2P0m1*3?0B3X1q4M5N4V2H0i0o0D0m0G0Q0o0M0x0/1c1e1g1i0P4.5#3T3u1r0N112H0P0n0 110c1T0y4y1x3u2(4l1H1J1L1N1P1R1T1;1Y1!1$6h4l2n2e2g0/2t0g0l0O0-0E2u1Q1S0u4T3-3@3R4A604k4 0o3}0x0z4h4}0P73513h3j77484a58445a4f7f280M373950597d76785e6)5k4F4q6B5+1/4w046P2`5;4D4F4H4J0O5_5C0/5R7H5B5V4Y0m4!5Y5z7B7I4P0/4-5}7!5t7375774|4~3`4^433f7k7e0F557h7=7c537.7n7p3F7r7j7t804i7F5h7C0*5l5n5p6{6B5s5G2 7V7X5Z7O5O5D8o4V5-045/8h8b015?5^7*8j1/4Q5|6B4:2`5 3e616d6f630U0W0Y04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013]iwbSRm)4;cas_[p1lunqg3:P/0vft-ky2od(hAr e=050K0Q0E0m0c0s0n0P0l0s0m0n0n0R010E0c0q010406050n0t0h0h0m0O0H040f0J0s0t0,0J0u0P020m0h0q0k0P0g0Q0_0O0v0t0Q0n050A0?0^0`0|0;0q04051r1k1u0A1r0;0K0c0C0!0$0(0*0$0u0w0t0m0w0Q0F0q0H0E0M130P0M0c0w0M0s1W0M0E0/050V0e0s0Q1D0%0)011V1X1Z1X0E1)1+1%0E0O1s1R0!0 0n0q0m0u0*0I011-1F010D0X0Q0u170Q1%2224291/2c1+2f0h2h040a0P0z0O0J0q0J0n0c12140T200O0O0Q0l2C1k2j0u1s0A1R2O1|1~1}1(0K2l1G0c0u2e2z1%1A1C0#1.2Y2!0u0J2(1%0q2H1s2M2O2^0=23142*2a2.0O0_0s1%0m1U2H0D0*030o0o0l2/0Q1Z2-0J0F0j0B0F0r0/0r1k0m2_2|0:2{2k2~1/303234360Q38013a3c3e3g2#3j3l27040I3q3s242O2=0Q2O2(2R0K1~2W3x0*3d0T2%1B1s3U2@3t2L3/3(3V3v140c0K0*3b2M3L3m3B3_3{3H0T3J2.3~3n0P2p0Q423=453i3k3 2O3r3@2X010G0/0T0D3:3S4k3$010d0/0P4r2N4t1E3y0D4o0Q0O0u0c4G4z3.3w4C0*0.040L4L4B2+010u0/0_0o1Z0n0E0Q4T2M4l4Q0i0y4L0;1l3/4*41013|2|3~3N05354@3b4d2Z3K4g27492g4c3I5246541%0A3r0P5g4y4*4u4n042H0E0t4H4L5i2|4l4X044Z4#4%4)5t4u4Q0p5A4N4V0u0e0/2o5F2}4O014Q4S4;4s5j5O5v5x0c4$4(5S4A5U4V4,5r4U2a0J0/0F5*5%2a0h0c3o5M4+0/0b4/4T0A3=3T2?1k3X1k0E3Z652U2P0m1*3?0A3X1q4M5N4V2H0h0o0D0m0G0Q0o0M0x0/1c1e1g1i0P4.5#3T3u1r0N112H0P0n0 110c1T0y4y1x3u2(4l1H1J1L1N1P1R1T1;1Y1!1$6h4l2n2e2g0/2t0f0l0O0-0E2u1Q1S0u4T3-3@3R4A604k4 0o3}0j0r4h4}0P73513h3j77484a58445a4f7f280M373950597d76785e6)5k4F4q6B5+1/4w046P2`5;4D4F4H4J0O5_5C0/5R7H5B5V4Y0m4!5Y5z7B7I4P0/4-5}7!5t7375774|4~3`4^433f7k7e0F557h7=7c537.7n7p3F7r7j7t804i7F5h7C0*5l5n5p6{6B5s5G2 7V7X5Z7O5O5D8o4V5-045/8h8b015?5^7*8j1/4Q5|6B4:2`5 3e616d6f630U0W0Y04.
Fichiers utilisés pour cet exemple
exo_vide.py
# --- PMT:code --- #

def dernier(ma_liste):
    ...


# --- PMT:corr --- #

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


# --- PMT:tests --- #

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


# --- PMT:secrets --- #

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

# --- PMT:REM --- #

Autre solution : 


```python
def dernier(ma_liste):
    return ma_liste[- 1]
```
exo_trous.py
# --- PMT:code --- #

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


# --- PMT:corr --- #

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


# --- PMT:tests --- #

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


# --- PMT:secrets --- #

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

# --- PMT:REM --- #

Autre solution : 


```python
def dernier(ma_liste):
    return ma_liste[- 1]
```
Remarque : ancienne syntaxe qui fonctionne encore
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

# --- PYODIDE:REM --- #

Autre solution : 


```python
def dernier(ma_liste):
    return ma_liste[- 1]
```
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

# --- PYODIDE:REM --- #

Autre solution : 


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

Documentation détaillée sur les fichiers de remarques pour un usge expert en local, et pas en ligne via Web IDE

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
# --- PMT:env --- #



# --- PMT:code --- #

def ma_fonction(nombre):
    ...

ou avec l'ancienne syntaxe :

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
# --- PMT:code --- #

def ma_fonction(nombre):
    ...

ou avec l'ancienne syntaxe :

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

def ma_fonction(nombre):
    ...

absence de la section secrets

Si votre exercice contient une section # --- PMT:corr --- # (ou # --- PYODIDE:corr --- # ), ou un fichier de remarque comme exo_REM.md mais pas de section # --- PMT:secrets --- # (ou # --- 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
# --- PMT: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

# --- PMT:code --- #

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

...

# --- PMT:corr --- #

help(mystere)
Remarque : ancienne syntaxe qui fonctionne encore
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é :
📋 Texte
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 :
📋 Texte
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