Aller au contenu

Python - Bon départ

Sources et crédits pour ce cours

Cette page est en partie une copie de la page créée par Mireille Coilhac et Frédéric Juniers.

I. Accès par index aux éléments d'une liste, d'un tuple ou d'une chaîne de caractères⚓︎

Types indexables list, tuple et str
  • En Python, les listes (list), les tuples (tuple) et les chaînes de caractères (str) permettent d'accéder à leurs éléments par index à l'aide de crochets [].
Python
# Liste
notes = [14, 16, 12]
print(notes[1])  # Affiche 16

# Tuple
coordonnees = (3, 5)
print(coordonnees[0])  # Affiche 3

# Chaîne
mot = "Python"
print(mot[2])  # Affiche 't'
  • La fonction len() renvoie le nombre d'éléments d'une liste, d'un tuple ou de caractères dans une chaîne.
Python
print(len(notes))       # Affiche 3
print(len(coordonnees)) # Affiche 2
print(len(mot))         # Affiche 6
  • Les index commencent à 0. Pour une séquence de longueur \(n\), les index valides vont de \(0\) à \(n-1\).
Python
mot = "Python"
# len(mot) = 6 → index valides : 0, 1, 2, 3, 4, 5
  • Un accès hors de la plage d'index provoque une erreur IndexError.
Python
notes = [14, 16, 12]
print(notes[3])  # Erreur : IndexError: list index out of range
  • On peut définir des listes imbriquées pour représenter une image en niveaux de gris comme une liste de listes (matrice) par exemple.
Python
image = [
[0, 255, 0],
[255, 128, 255],
[0, 255, 0]
]

print(image[1][2])  # Affiche 255 : élément ligne 1, colonne 2
  • Les valeurs de type list peuvent être modifiées, on dit qu'elles sont mutables. En revanche les valeurs de type tuple ou str ne peuvent être modifiées, une fois qu'elles sont définies. On dit qu'elles sont immuables.
Type Mutable ? Peut-on modifier un élément ?
list Oui ✅ Oui
tuple Non ❌ Non
str Non ❌ Non
Python
# Liste : on peut modifier un élément
notes = [14, 16, 12]
notes[0] = 15
print(notes)  # [15, 16, 12]

# Tuple : modification interdite
coord = (3, 5)
coord[0] = 4  # TypeError

# Chaîne : modification interdite
texte = "Python"
texte[0] = "J"  # TypeError
Exercice 1 : QCM

Questions

Accès par index dans une liste

  1. On a une liste image telle que image = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]. Quelle est la valeur de image[2][1] ?

    • 1

    • 6

    • 7

    • 8

  2. On a une liste image telle que image = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]. Quel est le type de image[0] et celui de image[0][2] ?

    • int pour les deux

    • list pour les deux

    • list pour image[0][2] et int pour image[0]

    • list pour image[0] et int pour image[0][2]

  3. On dispose d’une image représentée par image = [[10, 20], [30, 40]]. Quelle instruction modifie le pixel situé à la première ligne et à la deuxième colonne pour lui donner la valeur 99 ?

    • image[0][2] = 99

    • image[1][2] = 99

    • image[1][1] = 99

    • image[0][1] = 99

  4. On considère la liste t = [5, 0, 1, 3, 4, 6]. Quelle est la valeur de t[t[1]] ?

    • 0

    • 4

    • 5

    • 6

  5. On définit L = [4,25,10,9,7,13]. Quelle est la valeur de L[2] ?

    • 4

    • 25

    • 10

    • 9

II. Parcours de listes et de chaînes de caractères⚓︎

Ce paragraphe a principalement été rédigé par Romain Janvier

Rappels sur les parcours de listes et de textes

En Python, il y a principalement 2 méthodes pour parcourir les listes Python (et donc les tableaux) et les textes.

def parcours_par_valeur(donnees):
    for val in donnees:
        print(val)  # Quelque chose avec val
>>> parcours_par_valeur([3, -2, 4])
3
-2
4
>>> parcours_par_valeur("AVION")
A
V
I
O
N
def parcours_par_indice(donnees):
    for i in range(len(donnees)):
        print(i, donnees[i])  # Quelque chose avec donnees[i] et/ou i
>>> parcours_par_indice([3, -2, 4])
0 3
1 -2
2 4
>>> parcours_par_indice("AVION")
0 A
1 V
2 I
3 O
4 N
Vous pouvez tester les deux fonctions ici

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

Lors d'un parcours par valeur, on n'a pas accès à l'indice mais uniquement à la valeur. Pour choisir entre les deux, il faut donc se poser la question suivante : Est-ce que j'ai besoin de connaître l'indice de la valeur que je regarde ?

  • Si la réponse est oui, il faut faire un parcours par indice.
  • Si la réponse est non, vous pouvez utiliser un parcours par valeur. Mais un parcours par indice fonctionnerait aussi.
Exercice 1 : compter(symbole, texte)

Compléter le code de la fonction compter qui prend en paramètre un texte d'un seul caractère symbole ainsi qu'un texte texte et qui renvoie le nombre de fois où symbole apparaît dans texte.

>>> compter('b', 'bulle')
1
>>> compter('l', 'bulle')
2
>>> compter('v', 'bulle')
0

###(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/oblvn-u_xyhPp342amkw:S0ig,rs) 5=6+1edtf(c050M0L0N0s0z0e0D0F0Q0e0s0D0D0H010N0z0o010406050D0i0t0t0s0C0l040x0c0e0i0+0c0g050b0=0@0_0{0:0o04051b141e0b1b0:0M0z0f0Z0#0%0)0#0g0A0i0s0A0L0h0o0l0N0m120F0m0z0A0m0e1G0m0N0.050U0d0e0L1n0$0(011F1H1J1H0N1P1R1N0N0C1c1B0Z0~0D0o0s0g0)0r011T1p010O0W0L0g0s0t0L1N1/1;1_1V1|1R1 210.0a0F0n0C0c0o0c0D0z110g0F0S1-0C0C0L0Q2m14240g1c0b1B2z1)1+1*1O0M261q0z0g1~2j1N1k1m0!1U2J2L0g0c2P1N0o2s1c2x2z2$0;1:2n2R1`2V0C0^0e1N0s1E2s0O0)030j0j0Q2W0L1J2U0c0h0K0K340.0K140s2%2*0/2)252,1V2.2:2=2@0L2_012{2}2 312M34361@040r3a3c1;3e2x2I013j0s2;1c2?0m2^2`2|2~0S3t2V3v0h0p0.0p3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350h0q0.0q3Z153#3f2+1o3i0c2/3I3l3M3n3O3r3R3=3T3@0G0.0G3|2$3$2*3F3*463.3q3Q304c333@0I0.0I4i3d1f2!142P2C0M1+2H3(014r2O1l1c2Z0L2#4A3}3C054r4R250z0M0)2|2x3U0K3l4Z4#4a4s324(1^2a0L4,4r3S4u364)2z3b3 3F0u0.0S0O3!4U3%410)0v0.0F552y4 4J0g0O0.2~0t0o0N0L0C5d4X402S010-040P5q5f583G0.0D0l0t0d0~0L5y575t5v0B5q5c5K2-0.5n0k5n5J4l4J5v0E0w5q0:4T5e3E4+014$2*3U3x3,0F5+3:4b4/3@1@0F4=4@3;5_3w1N0b3b0F655P5X5A0g5j5O5z5t0c0.0H6c5Q1V0t0z0.0y5$5W4Y4!5,0j4%3@3W3K5=6s5@4.3?363W5|204?6t4^4t3U6x3A66673g5A51040O436i685t6a040D6X6R6e5a042K6%5s5R045T5V5(5r3F5v5#6?5%2(5*6A6u5.3@3_6y5?4-4_3U3_6G215~5^6D3^62646P666d1`6T0z546?6Q6.3i5C6-3F6f040H6h7p7k7s6#5E5G1R6q7r0)6_6p6?4 756v364f746 6K600h4f7a6I6B774e7g047i7)7q4m6b7A6j0)7w7z2$7+5g7-7?7B7:0.0J7u4J6l387L6}4l7O71364w7S7c6C4d884;6H8b7#8e4}7(7j7/016T2s0N0i0C137.6Y6/0Q834S4W4B4Q4D4N140N4G8G2F2A0s1Q8D0b4E5%0S0U0W0D04.

###(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/oblvn-u_xyhPp342amkw:S0ig,rs) 5=6+1edtf(c050M0L0N0s0z0e0D0F0Q0e0s0D0D0H010N0z0o010406050D0i0t0t0s0C0l040x0c0e0i0+0c0g050b0=0@0_0{0:0o04051b141e0b1b0:0M0z0f0Z0#0%0)0#0g0A0i0s0A0L0h0o0l0N0m120F0m0z0A0m0e1G0m0N0.050U0d0e0L1n0$0(011F1H1J1H0N1P1R1N0N0C1c1B0Z0~0D0o0s0g0)0r011T1p010O0W0L0g0s0t0L1N1/1;1_1V1|1R1 210.0a0F0n0C0c0o0c0D0z110g0F0S1-0C0C0L0Q2m14240g1c0b1B2z1)1+1*1O0M261q0z0g1~2j1N1k1m0!1U2J2L0g0c2P1N0o2s1c2x2z2$0;1:2n2R1`2V0C0^0e1N0s1E2s0O0)030j0j0Q2W0L1J2U0c0h0K0r340.0K140s2%2*0/2)252,1V2.2:2=2@0L2_012{2}2 312M34361@040r3a3c1;3e2x2I013j0s2;1c2?0m2^2`2|2~0S3t2V3v0h0p0.0p3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350h0q0.0q3Z153#3f2+1o3i0c2/3I3l3M3n3O3r3R3=3T3@0G0.0G3|2$3$2*3F3*463.3q3Q304c333@0I0.0I4i3d1f2!142P2C0M1+2H3(014r2O1l1c2Z0L2#4A3}3C054r4R250z0M0)2|2x3U0K3l4Z4#4a4s324(1^2a0L4,4r3S4u364)2z3b3 3F0u0.0S0O3!4U3%410)0v0.0F552y4 4J0g0O0.2~0t0o0N0L0C5d4X402S010-040P5q5f583G0.0D0l0t0d0~0L5y575t5v0B5q5c5K2-0.5n0k5n5J4l4J5v0E0w5q0:4T5e3E4+014$2*3U3x3,0F5+3:4b4/3@1@0F4=4@3;5_3w1N0b3b0F655P5X5A0g5j5O5z5t0c0.0H6c5Q1V0t0z0.0y5$5W4Y4!5,0j4%3@3W3K5=6s5@4.3?363W5|204?6t4^4t3U6x3A66673g5A51040O436i685t6a040D6X6R6e5a042K6%5s5R045T5V5(5r3F5v5#6?5%2(5*6A6u5.3@3_6y5?4-4_3U3_6G215~5^6D3^62646P666d1`6T0z546?6Q6.3i5C6-3F6f040H6h7p7k7s6#5E5G1R6q7r0)6_6p6?4 756v364f746 6K600h4f7a6I6B774e7g047i7)7q4m6b7A6j0)7w7z2$7+5g7-7?7B7:0.0J7u4J6l387L6}4l7O71364w7S7c6C4d884;6H8b7#8e4}7(7j7/016T2s0N0i0C137.6Y6/0Q834S4W4B4Q4D4N140N4G8G2F2A0s1Q8D0b4E5%0S0U0W0D04.
Exercice 2 : position(val, nombres)

Compléter le code de la fonction position qui prend en paramètre un entier val ainsi qu'une liste d'entiers nombres et renvoie l'indice de la première occurrence de val dans nombres s'il y en a une et None sinon.

>>> position(7, [5, -1, 7, 4, 6, 4, 2])
2
>>> position(4, [5, -1, 7, 4, 6, 4, 2])
3
>>> position(0, [5, -1, 7, 4, 6, 4, 2])
None

###(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/oblvn-u_yhPp43]2amkw:Sig,rs) [5N=1edtf(c050L0K0M0s0y0e0C0E0P0e0s0C0C0I010M0y0n010406050C0i0t0t0s0B0k040x0c0e0i0*0c0g050b0;0?0^0`0/0n04051a131d0b1a0/0L0y0f0Y0!0$0(0!0g0z0i0s0z0K0h0n0k0M0l110E0l0y0z0l0e1F0l0M0-050T0d0e0K1m0#0%011E1G1I1G0M1O1Q1M0M0B1b1A0Y0}0C0n0s0g0(0r011S1o010N0V0K0g0s0t0K1M1.1:1^1U1{1Q1~200-0a0E0m0B0c0n0c0C0y100g0E0R1,0B0B0K0P2l13230g1b0b1A2y1(1*1)1N0L251p0y0g1}2i1M1j1l0Z1T2I2K0g0c2O1M0n2r1b2w2y2#0:1/2m2Q1_2U0B0@0e1M0s1D2r0N0(030j0j0P2V0K1I2T0c0h0J0o330-0J130s2$2)0.2(242+1U2-2/2;2?0K2^012`2|2~302L33351?040r393b1:3d2w2H013i0s2:1b2=0l2@2_2{2}0R3s2U3u0h0p0-0p3z2v3c0/3D3g0(3G3I053K3M3o3O3r2J3t340h0o0-0o3Y143!3e2*1n3h0c2.3H3k3L3m3N3q3Q3;3S3?0G0-0G3{2%1g2Z132O2B0L1*2G3%013P211b4m1c4k4i2%4t2!2)0E0y0L0(2{2w3T0J3k4F4H492 4b323?4L0E290K4O4t3R4S354L2y3a3~3E0u0-0R0N3Z3B4*4r0v0-0E4:2x4=403(0N0-2h2j2u3|4;3$4}010,040O4`4C3f570g0-0f3H5c4|2R580-0A5c4_565m5g042U0t0d2r0C5k5s1_590D0w5c0/544{3D4N014I2)3T3w3+4E4G5N4P4!5Q1@4W4Y3:315Y4(040E5+5r4D4r4,040N425q5l2,0-0y5@5C1U0c4@042J5|5.5f0d0-0B1:1v5B645m595b5J5d3 5t6604286b5e6d0-6f2%5}3(0-5w5y0K5A6g5^1U5E5F5H6n2m5M5O1:3T3V3J5T5#4a5%3?3V4V1 4X5V4Z4R6L1M0b3a5,6(5-6o1_5:0y4/6g6*6i5_5v0c5x5z6G3E590F6{4r5u5{6A6t5n040q636+5~0-0I0I786=3h5h5j736c5D0-5G6g5I6s4D6I0j4J3?3^6N7s6Y6R353^6U206P4Q7A3@6#6%6)7L6B0(5:2r0M0i0B126:7N3F5`6F7j247s7u354e7x5U3/6Q3=7(5Z6V7F5X4d7J5*5,7W7P0S7S7U2#6;4+0P0-0H110K7Z4i4B1e4k0b4w2z4o132C8h0s1P0K2y4m5I0R0T0V0C04.

###(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/oblvn-u_yhPp34]2amkw:Sig,rs) [5N=1edtf(c050L0K0M0s0y0e0C0E0P0e0s0C0C0I010M0y0n010406050C0i0t0t0s0B0k040x0c0e0i0*0c0g050b0;0?0^0`0/0n04051a131d0b1a0/0L0y0f0Y0!0$0(0!0g0z0i0s0z0K0h0n0k0M0l110E0l0y0z0l0e1F0l0M0-050T0d0e0K1m0#0%011E1G1I1G0M1O1Q1M0M0B1b1A0Y0}0C0n0s0g0(0r011S1o010N0V0K0g0s0t0K1M1.1:1^1U1{1Q1~200-0a0E0m0B0c0n0c0C0y100g0E0R1,0B0B0K0P2l13230g1b0b1A2y1(1*1)1N0L251p0y0g1}2i1M1j1l0Z1T2I2K0g0c2O1M0n2r1b2w2y2#0:1/2m2Q1_2U0B0@0e1M0s1D2r0N0(030j0j0P2V0K1I2T0c0h0J0G330-0J130s2$2)0.2(242+1U2-2/2;2?0K2^012`2|2~302L33351?040r393b1:3d2w2H013i0s2:1b2=0l2@2_2{2}0R3s2U3u0h0o0-0o3z2v3c0/3D3g0(3G3I053K3M3o3O3r2J3t340h0p0-0p3Y143!3e2*1n3h0c2.3H3k3L3m3N3q3Q3;3S3?0G0-0G3{2%1g2Z132O2B0L1*2G3%013P211b4m1c4k4i2%4t2!2)0E0y0L0(2{2w3T0J3k4F4H492 4b323?4L0E290K4O4t3R4S354L2y3a3~3E0u0-0R0N3Z3B4*4r0v0-0E4:2x4=403(0N0-2h2j2u3|4;3$4}010,040O4`4C3f570g0-0f3H5c4|2R580-0A5c4_565m5g042U0t0d2r0C5k5s1_590D0w5c0/544{3D4N014I2)3T3w3+4E4G5N4P4!5Q1@4W4Y3:315Y4(040E5+5r4D4r4,040N425q5l2,0-0y5@5C1U0c4@042J5|5.5f0d0-0B1:1v5B645m595b5J5d3 5t6604286b5e6d0-6f2%5}3(0-5w5y0K5A6g5^1U5E5F5H6n2m5M5O1:3T3V3J5T5#4a5%3?3V4V1 4X5V4Z4R6L1M0b3a5,6(5-6o1_5:0y4/6g6*6i5_5v0c5x5z6G3E590F6{4r5u5{6A6t5n040q636+5~0-0I0I786=3h5h5j736c5D0-5G6g5I6s4D6I0j4J3?3^6N7s6Y6R353^6U206P4Q7A3@6#6%6)7L6B0(5:2r0M0i0B126:7N3F5`6F7j247s7u354e7x5U3/6Q3=7(5Z6V7F5X4d7J5*5,7W7P0S7S7U2#6;4+0P0-0H110K7Z4i4B1e4k0b4w2z4o132C8h0s1P0K2y4m5I0R0T0V0C04.
Sortie anticipée

Dans cet exercice nous avons un return dans la boucle. il y a donc sortie anticipée de la boucle s'il n'est pas nécessaire de la terminer.

Ce procédé est souvent utilisé et permet de gagner en efficacité.

Parcours en sens inverse

Il est parfois utile de parcourir une liste Python, ou un texte, en partant du dernier élément et en allant vers le premier. On rappelle que l'indice du dernier élément est n-1, où n est la longueur de la liste ou du texte.

On peut parcourir les indices dans l'ordre inverse en utilisant les paramètres supplémentaires de range. Pour rappel, range(de, vers, pas) part de de et va de pas en pas jusqu'à vers, en s'arrêtant juste avant de l'atteindre. En mettant -1 pour le pas, on parcourt les nombres dans l'ordre inverse.

def parcours_inverse1(donnees):
    for i in range(len(donnees)-1, -1, -1): # on part du dernier indice 
        print(i, donnees[i])
>>> parcours_inverse1([3, -2, 4])
2 4
1 -2
0 3
>>> parcours_inverse1("AVION")
4 N
3 O
2 I
1 V
0 A

Si on ne veut pas utiliser les paramètres supplémentaires de range, il faut calculer l'indice de l'élément regardé à chaque tour de boucle. Si on note i la variable de boucle, n la longueur de la liste ou du texte, alors à chaque tour de boucle, il faut regarder l'élément d'indice n-1-i.

def parcours_inverse2(donnees):
    n = len(donnees)
    for i in range(n):
        indice = n - 1 - i
        print(indice, donnees[indice])
>>> parcours_inverse2([3, -2, 4])
2 4
1 -2
0 3
>>> parcours_inverse2("AVION")
4 N
3 O
2 I
1 V
0 A
Vous pouvez tester les deux fonctions ici

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

Vous pouvez utiliser ces parcours, ou pas, pour l'exercice suivant.

Exercice 3 : derniere_position(val, nombres)

Compléter le code de la fonction derniere_position qui prend en paramètre un entier val ainsi qu'une liste d'entiers nombres et renvoie l'indice de la dernière occurrence de val dans nombres s'il y en a une et None sinon.

>>> derniere_position(7, [5, -1, 7, 4, 6, 4, 2])
2
>>> derniere_position(4, [5, -1, 7, 4, 6, 4, 2])
5
>>> derniere_position(0, [5, -1, 7, 4, 6, 4, 2])
None

###(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/oblvn-u_yhPp34]2amkw:Sig,rs) [5N=1edtf(c050L0K0M0s0y0e0C0E0P0e0s0C0C0I010M0y0n010406050C0i0t0t0s0B0k040x0c0e0i0*0c0g050b0;0?0^0`0/0n04051a131d0b1a0/0L0y0f0Y0!0$0(0!0g0z0i0s0z0K0h0n0k0M0l110E0l0y0z0l0e1F0l0M0-050T0d0e0K1m0#0%011E1G1I1G0M1O1Q1M0M0B1b1A0Y0}0C0n0s0g0(0r011S1o010N0V0K0g0s0t0K1M1.1:1^1U1{1Q1~200-0a0E0m0B0c0n0c0C0y100g0E0R1,0B0B0K0P2l13230g1b0b1A2y1(1*1)1N0L251p0y0g1}2i1M1j1l0Z1T2I2K0g0c2O1M0n2r1b2w2y2#0:1/2m2Q1_2U0B0@0e1M0s1D2r0N0(030j0j0P2V0K1I2T0c0h0r0J0h0J0-0J130s2$2)0.2(242+1U2-2/2;2?0K2^012`2|2~302L33351?040r3a3c1:3e2w2H013j0s2:1b2=0l2@2_2{2}0R3t2U3v0h0o0-0o3A2v3d0/3E3h0(3H3J053L3N3p3P3s2J3u340h0p0-0p3Z143#3f2*1n3i0c2.3I3l3M3n3O3r3R3=3T3@0G0-0G3|2%1g2Z132O2B0L1*2G3(013Q211b4n1c4l4j2%4u2!2)0E0y0L0(2{2w3U373K4F4H013:4b314L1@290K4I4a2 4c323@4M3Z3%410(0u0-0R0N3!3C3 3F0v0-0E4;2x4?4s0g0N4.0K0B0g0y520K0j2h2j2u3}4=4*2R010,040O4{4D3g4+3G0-0f3I5k4}5n5h0A5k4`5e2,0-2U0t0d2r0C5s5z1U5h0D0w5k0/5c4|3E4G4Y4K3@3x3,4O4Y4u3S4$3w4V1 4X4Q4Z5#3U5W0b3b0E5=5y4E4s4-040N435x5t5f0g0-0y5~5I0(0c4^042J645^5n0g0d0-0B1:1v5H6c5f5h5j5P5l40606f04286k5m6m0-6o2%655o045C5E0K5G6p5 1_5K6w6r1_0c0-0h6N3F0t0y386T4s5v6b6x6P6R6Y5n6V6X6J6C6!6p5@6$1U6Q046S6-6l1_6+04396`6=0(5K5M6p5O6B4E5S5+5U353W4N794R4!4T3@3W0E4W5Z3;7i7c1M5:045?7u6;6O1U5`0y4:6:6K3i5B0c5D5F6)6y040F7J5A697N5J0-0q6#7x660-0I0I7U3F61045q0e7Q720-742#763d4?7f0j7b3^3l7=5!4#3U3_7l5)7n4S3?353_2y5;7v887D4,6g0S0i537!4~625N6T7=7@4f7e4P7g5-4e5(20817h830h8n3A7u8a015`2r0M8e127C6C0u0P0-0H110K8j6J0b4C1e4l0b4x2z4p132C8#0s1P0K2y4n5O0R0T0V0C04.

###(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/oblvn-u_yhPp34]2amkw:Sig,rs) [5N=1edtf(c050L0K0M0s0y0e0C0E0P0e0s0C0C0I010M0y0n010406050C0i0t0t0s0B0k040x0c0e0i0*0c0g050b0;0?0^0`0/0n04051a131d0b1a0/0L0y0f0Y0!0$0(0!0g0z0i0s0z0K0h0n0k0M0l110E0l0y0z0l0e1F0l0M0-050T0d0e0K1m0#0%011E1G1I1G0M1O1Q1M0M0B1b1A0Y0}0C0n0s0g0(0r011S1o010N0V0K0g0s0t0K1M1.1:1^1U1{1Q1~200-0a0E0m0B0c0n0c0C0y100g0E0R1,0B0B0K0P2l13230g1b0b1A2y1(1*1)1N0L251p0y0g1}2i1M1j1l0Z1T2I2K0g0c2O1M0n2r1b2w2y2#0:1/2m2Q1_2U0B0@0e1M0s1D2r0N0(030j0j0P2V0K1I2T0c0h0r0r0h0J0-0J130s2$2)0.2(242+1U2-2/2;2?0K2^012`2|2~302L33351?040r3a3c1:3e2w2H013j0s2:1b2=0l2@2_2{2}0R3t2U3v0h0o0-0o3A2v3d0/3E3h0(3H3J053L3N3p3P3s2J3u340h0p0-0p3Z143#3f2*1n3i0c2.3I3l3M3n3O3r3R3=3T3@0G0-0G3|2%1g2Z132O2B0L1*2G3(013Q211b4n1c4l4j2%4u2!2)0E0y0L0(2{2w3U373K4F4H013:4b314L1@290K4I4a2 4c323@4M3Z3%410(0u0-0R0N3!3C3 3F0v0-0E4;2x4?4s0g0N4.0K0B0g0y520K0j2h2j2u3}4=4*2R010,040O4{4D3g4+3G0-0f3I5k4}5n5h0A5k4`5e2,0-2U0t0d2r0C5s5z1U5h0D0w5k0/5c4|3E4G4Y4K3@3x3,4O4Y4u3S4$3w4V1 4X4Q4Z5#3U5W0b3b0E5=5y4E4s4-040N435x5t5f0g0-0y5~5I0(0c4^042J645^5n0g0d0-0B1:1v5H6c5f5h5j5P5l40606f04286k5m6m0-6o2%655o045C5E0K5G6p5 1_5K6w6r1_0c0-0h6N3F0t0y386T4s5v6b6x6P6R6Y5n6V6X6J6C6!6p5@6$1U6Q046S6-6l1_6+04396`6=0(5K5M6p5O6B4E5S5+5U353W4N794R4!4T3@3W0E4W5Z3;7i7c1M5:045?7u6;6O1U5`0y4:6:6K3i5B0c5D5F6)6y040F7J5A697N5J0-0q6#7x660-0I0I7U3F61045q0e7Q720-742#763d4?7f0j7b3^3l7=5!4#3U3_7l5)7n4S3?353_2y5;7v887D4,6g0S0i537!4~625N6T7=7@4f7e4P7g5-4e5(20817h830h8n3A7u8a015`2r0M8e127C6C0u0P0-0H110K8j6J0b4C1e4l0b4x2z4p132C8#0s1P0K2y4n5O0R0T0V0C04.

###(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/oblvn-u_yhPp34]2amkw:Sig,rs) [5N=61edtf(c050M0L0N0s0y0e0C0E0Q0e0s0C0C0I010N0y0n010406050C0i0t0t0s0B0k040x0c0e0i0+0c0g050b0=0@0_0{0:0n04051b141e0b1b0:0M0y0f0Z0#0%0)0#0g0z0i0s0z0L0h0n0k0N0l120E0l0y0z0l0e1G0l0N0.050U0d0e0L1n0$0(011F1H1J1H0N1P1R1N0N0B1c1B0Z0~0C0n0s0g0)0r011T1p010O0W0L0g0s0t0L1N1/1;1_1V1|1R1 210.0a0E0m0B0c0n0c0C0y110g0E0S1-0B0B0L0Q2m14240g1c0b1B2z1)1+1*1O0M261q0y0g1~2j1N1k1m0!1U2J2L0g0c2P1N0n2s1c2x2z2$0;1:2n2R1`2V0B0^0e1N0s1E2s0O0)030j0j0Q2W0L1J2U0c0h0r0o0h0K0.0K140s2%2*0/2)252,1V2.2:2=2@0L2_012{2}2 312M34361@040r3b3d1;3f2x2I013k0s2;1c2?0l2^2`2|2~0S3u2V3w0h0o0.0o3B2w3e0:3F3i0)3I3K053M3O3q3Q3t2K3v350h0p0.0p3!153$3g2+1o3j0c2/3J3m3N3o3P3s3S3?3U3^0G0.0G3}2$3%2*3G3+473/3r3R304d333^0J0.0J4j3e1f2!142P2C0M1+2H3)014s2O1l1c2Z0L2#4B3~3D054s4S250y0M0)2|2x3V383L0E4!4$4b4t324)1^2a0L4.4s3T4v364*3!3(420)0u0.0S0O3#4V502S010v0.0E572y404n0O540L0B0g0y5l0L0j2i2k2v4U5g591`0-040P5f4Y415a0g0.0f3J5C5h4K5z0A5C5e5x3j0.2V0t0d2s0C5K5R0)5z0D0w5C0:5v5D4,4#014%2*3V3y3-5-4_3=4;3^1@0E4@5_4c5{3x1N0b3c0E675Q4m4K5G042s2i0g0C0L5P5L51010c0.0I6j5!010u0Q0.0H126i5+5*2(3F4-5/0j4(3^3X4+6D3;613@363X5~204^6E4`4u3V6I3B68693h6l53040O446q6a6l6c0y6+6#5a0c5c042K6:5E2-0d0.0B1;1w5Z6,5a5z5B5+6k5F6}0429726;5y0.766B732-5T0c5V5X7d6{1V5$5%5)7p5^6E6G363`6J5.6L4:6N3_4?6R607E4e7z64666Z68781`6%0y565+6!7q3*7l7n0L5Y776r5z0F7v6b0.6/7(7j7r0.0q6`3G6n040I6p7W7R5S045I0e7,6l5z5(6z7v6K6F5;4f3m8a6U620h4g6Q217J4{3V4g2z7O7P7P7 7Z6d0L6f6h7^4K7`7}2$7X4n7.7u7:4Z7C8b1;3V4x7B8m6V4w7H8l6T5`7F8P6Y7Q6r6%2s0N0i5m8A6-6~8x128z88770b4X4C4R4E4O140N4H8}2F2A0s1Q8`0b4F5*0S0U0W0C04.
Exercice 4 : indice_egal_valeurs(nombres)

Compléter le code de la fonction indice_egal_valeurs qui prend en paramètre une liste d'entiers nombres et renvoie True s'il existe un indice i tel que nombres[i]==i et False sinon.

>>> indice_egal_valeur([7, 1, 8])  # nombres[1] = 1
True
>>> indice_egal_valeur([9, -7, 2, 9, 6])  # nombres[2] = 2
True
>>> indice_egal_valeur([1, 2, 3, 4])
False

###(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/oblvn-u_yhPp34]2Tamkw:SigrsF) [5=1edtf(c050L0K0M0t0z0e0C0F0P0e0t0C0C0I010M0z0n010406050C0i0u0u0t0B0k040y0c0e0i0*0c0g050b0;0?0^0`0/0n04051a131d0b1a0/0L0z0f0Y0!0$0(0!0g0A0i0t0A0K0h0n0k0M0l110F0l0z0A0l0e1F0l0M0-050T0d0e0K1m0#0%011E1G1I1G0M1O1Q1M0M0B1b1A0Y0}0C0n0t0g0(0r011S1o010N0V0K0g0t0u0K1M1.1:1^1U1{1Q1~200-0a0F0m0B0c0n0c0C0z100g0F0R1,0B0B0K0P2l13230g1b0b1A2y1(1*1)1N0L251p0z0g1}2i1M1j1l0Z1T2I2K0g0c2O1M0n2r1b2w2y2#0:1/2m2Q1_2U0B0@0e1M0t1D2r0N0(030j0j0P2V0K1I2T0c0h0r0H0h0J0-0J130t2$2)0.2(242+1U2-2/2;2?0K2^012`2|2~302L33351?040r3a3c1:3e2w2H013j0t2:1b2=0l2@2_2{2}0R3t2U3v0h0o0-0o3A2v3d0/3E3h0(3H3J053L3N3p3P3s2J3u340h0p0-0p3Z143#3f2*1n3i0c2.3I3l3M3n3O3r3R3=3T3@0H0-0H3|2%1g2Z132O2B0L1*2G3(013Q211b4n1c4l4j2%4u2!2)0F0z0L0(2{2w3U373K4F4H013:4b314L1@290K4I4a2 4c323@4M3Z3%410(0v0-0R0N3!3C3 3F0w0-0F4;2x4?4s0g0N0-2J1j0P0K0j0K0A3I0j0f3I0K0i0B4{4D3g4+010,040O5g4}5j0g0-2U0u0d2r0C5o4*2R5k0-0E0x5g0/3}4=3E4G4Y4K3@3x3,4O4Y4u3S4$3w4V1 4X4Q4Z5T3U5O0b3b0F5*4`5z1_4-040N435g5,4E4~515?5p5A0c4^042J5{5-3i0d0-0B1:1v5y5^5j5l5n5H4|633)6504286a5i5A6d6m405A5r045t5v0K5x6f5h6r1_5l0E5D5F6q5Q5Z5M353W4N5K5Z5S4#3U3W0F4W5R3;4T3@6M3A5+6$5@6n5.514:6z6(6B3i5s0c5u5w6H4s5l0G6^5q5`6z5|6C0-0q626b5}0-0I0I746)6:606|6o0-5E6z5G2%5J4P4J2)3U3_6N7m5!6R3@3_6U5X6W4S3?357q6#6%7F701U5/2r0M5e126-7H4,0P0-0s0B0i0K6G6 7l5L7o4e3l6O4R4!6Y354f7x207z7*7B0h4f2y5)5+7P017J0S7M7a6/7Q0-0D3I0C7W7i5o0b4C1e4l0b4x2z4p132C8i0t1P0K2y4n5G0R0T0V0C04.

###(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/oblvn-u_yhPp34]2Tamkw:SigrsF) [5=61edtf(c050M0L0N0t0z0e0C0F0Q0e0t0C0C0I010N0z0n010406050C0i0u0u0t0B0k040y0c0e0i0+0c0g050b0=0@0_0{0:0n04051b141e0b1b0:0M0z0f0Z0#0%0)0#0g0A0i0t0A0L0h0n0k0N0l120F0l0z0A0l0e1G0l0N0.050U0d0e0L1n0$0(011F1H1J1H0N1P1R1N0N0B1c1B0Z0~0C0n0t0g0)0r011T1p010O0W0L0g0t0u0L1N1/1;1_1V1|1R1 210.0a0F0m0B0c0n0c0C0z110g0F0S1-0B0B0L0Q2m14240g1c0b1B2z1)1+1*1O0M261q0z0g1~2j1N1k1m0!1U2J2L0g0c2P1N0n2s1c2x2z2$0;1:2n2R1`2V0B0^0e1N0t1E2s0O0)030j0j0Q2W0L1J2U0c0h0r0J0h0K0.0K140t2%2*0/2)252,1V2.2:2=2@0L2_012{2}2 312M34361@040r3b3d1;3f2x2I013k0t2;1c2?0l2^2`2|2~0S3u2V3w0h0o0.0o3B2w3e0:3F3i0)3I3K053M3O3q3Q3t2K3v350h0p0.0p3!153$3g2+1o3j0c2/3J3m3N3o3P3s3S3?3U3^0H0.0H3}2(1h2!142P2C0M1+2H3)013R221c4o1d4m4k2(4v2#2*0F0z0M0)2|2x3V383L4G4I013;4c324M1^2a0L4J4b304d333^4N3!3(420)0v0.0S0O3#3D403G0w0.0F4=2y4@4t0g0O0.2K1k0Q0L0j0L0A3J0j0f3J0L0i0B4|4E3h4,010-040P5h4~5k0g0.2V0u0d2s0C5p4+2S5l0.0E0x5h0:3~4?3F4H4Z4L3^3y3-4P4Z4v3T4%3x4W204Y4R4!5U3V5P0b3c0F5+4{5A1`4.040O445h5-4F4 525@5q5B0c4_042K5|5.3j0d0.0B1;1w5z5_5k5m5o5I4}643*6604296b5j5B6e6n415B5s045u5w0L5y6g5i6s1`5m0E5E5G6r5R5!5N363X4O5L5!5T4$3V3X0F4X5S3=4U3^6N3B5,6%5^6o5/524;6A6)6C3j5t0c5v5x6I4t5m0G6_5r5{6A5}6D0.0q636c5~0.0I0I756*6;616}6p0.5F6A5H2(5K4Q4K2*3V3`6O7n5#6S3^3`6V5Y6X4T3@367r6$6(7G711V5:2s0N5f136.7I4-0Q0.0s0B0i0L6H707m5M7p4f3m6P4S4#6Z364g7y217A7+7C0h4g2z5*5,7Q017K0T7N7b6:7R0.0D3J0C7X7j5p0b4D1f4m0b4y2A4q142D8j0t1Q0L2z4o5H0S0U0W0C04.
Exercice 5 : moyenne(valeurs)

Compléter le code de la fonction moyenne qui prend en paramètre une liste non vide de nombres valeurs et renvoie la moyenne de ces nombres. On n'utilisera pas la fonction len.

Comparaison de nombres réels

On rappelle que la représentation des nombres réels en Python est basée sur le principe de la virgule flottante et qu'à cause de cela, deux expressions mathématiquement égales ne donnent pas forcément le même résultat en Python.

Pour vérifier le résultat de la fonction moyenne avec le résultat attendu, nous utiiserons la fonction indiscernables qui prend deux nombres et renvoie un booléen indiquant si la distance entre ces deux nombres (mathématiquement la valeur absolue de leur différence) est inférieure à \(10^{-15}\).

>>> 0.1 * 3 == 0.3  # Erreur de virgule flottante classique
False
>>> indiscernables(0.1*3, 0.3)
True
>>> moyenne([5])
5.0
>>> moyenne([5, 15, 8])
9.333333333333334
>>> moyenne([5, 15, 10])
10.0

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

.1280138/oblvn-u_yhPp342;amkw:S70ig,rs) 5=6+1edtf(c9050O0N0P0t0B0f0F0H0S0f0t0F0F0J010P0B0o010406050F0j0u0u0t0E0l040y0d0f0j0.0d0h050c0^0`0|0~0?0o04051e171h0c1e0?0O0B0g0$0(0*0,0(0h0C0j0t0C0N0i0o0l0P0m150H0m0B0C0m0f1J0m0P0;050X0e0f0N1q0)0+011I1K1M1K0P1S1U1Q0P0E1f1E0$110F0o0t0h0,0r011W1s010Q0Z0N0h0t0u0N1Q1=1@1|1Y1 1U22240;0a0H0n0E0d0o0d0F0B140h0H0V1:0E0E0N0S2p17270h1f0c1E2C1,1.1-1R0O291t0B0h212m1Q1n1p0%1X2M2O0h0d2S1Q0o2v1f2A2C2)0@1?2q2U1}2Y0E0{0f1Q0t1H2v0Q0,030k0k0S2Z0N1M2X0d0i0r0T0i0M0;0H0M170t2*2-0=2,282/1Y2;2?2^2`0N2|012~3032342P37391`040H0r3f3h1@3j2A2L013o0t2@1f2_0m2{2}2 310V3y2Y3A0i0p3c0p3G2z3i0?3K3m0,3N3P053R3T3u3V3x2N3z380i0q3c0q3)183+3k2.1r3n0d2=3O3q3S3s3U3w3X3{3Z3}0I3c0I422)3,2-3L3:4c3@3v3W334i363}0K3c0K4o443-473/493p3Q3r3t4w3`353!0z3c0z4F3I4q3l4I3M4K4b4M4d4O3_4h4R3}0b3c0b4W2B4Y462V4#4a3;3?4e3^4g4y4-390T3c0T4=3J4r3.4`4L3=4N4f4x3Y4A390M0A0;5k571i2%172S2F0O1.2K5a4x2R1o1f2$0N2(3i3*3I054x5E280B0O0,2 2A3!3b4M5M5O505h5R1{2d0N5V5g4z5Y2C3g453L0v0;0V0Q5G2B5,5a0w3c5=5K4^2:0Q0;2N1n0F0S0N0E221T0N0F5{5@4!0:040R6b4H4_0h0;2Y0u0e2v3e435H6i1}6e0D5{0H6c6j6l0d6n2v3F6r5?6t1Y6e0G0x5{0?6G5|0H5U015P2-3!3C5d6S4+513|3B5Z235#6T5W5(3}6X0c3g0H6=6y6I0,5.042v0P0j666x6z2:0e0;0t0e6a6P716J0;6g786^3M6B6D0N6q2)6@594!0d0;0i707e6k046m6o0N6F2+7e6K7r7m4_7o04020f0P0s7C4Z4_0u5 040M1A0M4n6P6O7z4r6Z0k5Q3}3$5T5N6+5%523#6(245$4Q6$7-5*3j7d7Y7)6U1@3!3 7(7:4,7=3 0H5!816#4j397 3)7e6`5:6h7D1}5_3D8g7M5~0;0u0d0l212O8l5}7a6f8u4s0;0g3O0N6~777X8m8w6L6N8y7Z7#394l807*7;890i4l856)875X4k1Q6:3D6?793/0;0F6C247L8v0,7F0J8/3L0u0B0;0A8K7_5L7{7!6V4B3q7Z7+7=4C8W7/8R828T4C7@6?7l8H8*7u0e0k2Y0P698@5a8=9q4!8_8{8}8G2q8M92394T8Q6!8Z9C7.6*9F6-9H9f8(8d0;0Q499t6A7u0d9o9T1}0d8j2N9Y3n8A8C8E8y5a6e6M7V8L908N0i4/9E6,7,4/999J9`7=9^3G9g9g8)7f048,0`0N9%8;0;8?6P9h8:a6a88.afa57F0Laba69naa9:8~9z9=9B0i549_968T549}8Y9Lay8#6;a36=a57t0h9lar8F3iag3L9sal7s6laP9W9paW8h1Yanap9v7Q9x5F3K9A7}3}5k9490aB5i3a5laE9b88a`a?9NaL9P6{0W6~16a$9iai8-as7kam0;0capaNaZ9oaR4X6b0c5J5p5D5r5A170P5ubv2I2D751U2C5s6O0V0X0Z0F04.

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

.1280138/oblvn-u_yhPp342;amkw:S07ig,rs) 5=6+1edtf(c9050O0N0P0t0B0f0F0H0S0f0t0F0F0J010P0B0o010406050F0j0u0u0t0E0l040y0d0f0j0.0d0h050c0^0`0|0~0?0o04051e171h0c1e0?0O0B0g0$0(0*0,0(0h0C0j0t0C0N0i0o0l0P0m150H0m0B0C0m0f1J0m0P0;050X0e0f0N1q0)0+011I1K1M1K0P1S1U1Q0P0E1f1E0$110F0o0t0h0,0r011W1s010Q0Z0N0h0t0u0N1Q1=1@1|1Y1 1U22240;0a0H0n0E0d0o0d0F0B140h0H0V1:0E0E0N0S2p17270h1f0c1E2C1,1.1-1R0O291t0B0h212m1Q1n1p0%1X2M2O0h0d2S1Q0o2v1f2A2C2)0@1?2q2U1}2Y0E0{0f1Q0t1H2v0Q0,030k0k0S2Z0N1M2X0d0i0p0z0i0M0;0H0M170t2*2-0=2,282/1Y2;2?2^2`0N2|012~3032342P37391`040H0r3f3h1@3j2A2L013o0t2@1f2_0m2{2}2 310V3y2Y3A373c0p3G2z3i0?3K3m0,3N3P053R3T3u3V3x2N3z380i0q3c0q3(183*3k2.1r3n0d2=3O3q3S3s3U3w3X3`3Z3|0I3c0I412)3+2-3L3/4b3?3v3W334h363|0K3c0K4n433,463.483p3Q3r3t4v3_353!0A3c0A4E3I4p3l4H3M4J4a4L4c4N3^4g4Q3|0b3c0b4V2B4X452V4!493:3=4d3@4f4x4,390T3c0T4;3J4q3-4_4K3;4M4e4w3Y4z390M0z0;5j561i2%172S2F0O1.2K594w2R1o1f2$0N2(3i3)3I054w5D280B0O0,2 2A3!3b4L5L5N4 5g5Q1{2d0N5U5f4y5X2C3g443L0v0;0V0Q5F2B5+590w3c5;5J4@2:0Q0;2N1n0F0S0N0E221T0N0F5`5?4Z0:040R6a4G4^0h0;2Y0u0e2v3e425G6h1}6d0D5`0H6b6i6k0d6m2v3F6q5=6s1Y6d0G0x5`0?6F5{0H5T015O2-3!3C5c6R4*503{3B5Y235!6S5V5%3|6W0c3g0H6;6x6H0,5-042v0P0j656w6y2:0e0;0t0e696O706I0;6f776@3M6A6C0N6p2)6?584Z0d0;0i6 7d6j046l6n0N6E2+7d6J7q7l4^7n04020f0P0s7B4Y4^0u5~040M1A0M4m6O6N7y4q6Y0k5P3|0p3q7Y5$513#0H5Z5#4P6#3#5)3j7c7X5M6*7!393~5S7_6Z5W3|3~7,6(7.4+7:7}3(7d6_5/6g7C1}5^3D8e7L5}0;0u0d0l212O8j5|796e8s4r0;0g3O0N6}767W8k8u6K6M8w7Y7{0i4k7~866!4i394k84248P818S1Q6/3D6=783.0;0F6B247K8t0,7E0J8-3L0u0B0;0z8I7@5K7 7Z6U4A7%8~7)7:4B8U6)806,394B7=6=7k8F8(7t0e0k2Y0P688=598:9o4Z8@8_8{8E2q8K90394S8O6*948R0i4S978W9a9G8Z6:8$8b0;0Q489r6z7t0d9m9T1}0d8h2N9Y3n8y8A8C8w596d6L7U8J8~8L4.9C997*4.9I9D7/9F9@3G9e9e8%7e048*0`0N9%8/0;8;6O9f8.a5a78,aea47E0Laaa59la99:8|9x9=9z0i539^6+7*539|9_7:aya1a26;a47s0h9jaq8D3iaf3L9qak7r6kaN9W9naU8f1Yamao9t7P9v5E3K9y1@5Q5kaz9E5h3a5kaDaA7:5j9M8#aJ9P6`0W6}16a!9gah8+ar7jal0;0caoaLaX9maP4W6a0c5I5o5C5q5z170P5tbs2I2D741U2C5r6N0V0X0Z0F04.
Exercice 6 : moyenne_ponderee(valeurs)

Compléter le code de la fonction moyenne_ponderee qui prend en paramètre une liste non vide valeurs de couples de nombres (note, coeff) et renvoie la moyenne pondérée correspondant à ces notes. On suppose que tous les coefficients sont positifs et qu'il y a au moins un coefficient non nul.

Calcul d'une moyenne pondérée

Pour calculer une moyenne pondérée, il faut aditionner le produit de chacune des notes avec le coefficient correspondant et diviser par la somme des coefficients.

Par exemple, avec 5 notes \(n_1\), \(n_2\), ..., \(n_5\) et les coefficients correspondants \(c_1\), \(c_2\), ..., \(c_5\), la moyenne pondérée est :

\(\dfrac{n_1\times c_1 + n_2\times c_2 + n_3\times c_3 + n_4\times c_4 + n_5\times c_5}{c_1+c_2+c_3+c_4+c_5}\)

Parcours d'une liste de couples

On rappelle que lors d'un parcours par valeur d'une liste composée de couples, on peut décomposer chacun des couples de la manière suivante :

def parcours_liste_couples(couples):
    for a, b in couples: # (1)
        print(a, b)
  1. On peut aussi écrire for (a, b) in couples . Les parenthèses sont facultatives pour les tuples.
>>> parcours_liste_couples([("voiture", 3), ("vélo", 5), ("moto", 1)])
voiture 3
vélo 5
moto 1
>>> moyenne_ponderee([(5, 1), (15, 1)])
10.0
>>> moyenne_ponderee([(5, 1), (15, 2)]) # 5*1 + 15*2 = 35 -> 35/3
11.666666666666666
>>> moyenne_ponderee([(5, 1), (15, 3)]) # 5*1 + 15*3 = 50 -> 50/4
12.5
>>> moyenne_ponderee([(5, 1), (15, 3), (20, 0)]) # le coeff 0 ne compte pas
12.5

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

.1280138/oblvn-u_yhPp342;amkw:S70ig,rs) *5=6+1edtf(c9050P0O0Q0t0B0f0F0H0T0f0t0F0F0K010Q0B0o010406050F0j0u0u0t0E0l040y0d0f0j0/0d0h050c0_0{0}0 0@0o04051f181i0c1f0@0P0B0g0%0)0+0-0)0h0C0j0t0C0O0i0o0l0Q0m160H0m0B0C0m0f1K0m0Q0=050Y0e0f0O1r0*0,011J1L1N1L0Q1T1V1R0Q0E1g1F0%120F0o0t0h0-0r011X1t010R0!0O0h0t0u0O1R1?1^1}1Z201V23250=0a0H0n0E0d0o0d0F0B150h0H0W1;0E0E0O0T2q18280h1g0c1F2D1-1/1.1S0P2a1u0B0h222n1R1o1q0(1Y2N2P0h0d2T1R0o2w1g2B2D2*0^1@2r2V1~2Z0E0|0f1R0t1I2w0R0-030k0k0T2!0O1N2Y0d0i0p0q0i0N0=0H0N180t2+2.0?2-292:1Z2=2@2_2{0O2}012 3133352Q383a1{040H0r3g3i1^3k2B2M013p0t2^1g2`0m2|2~30320W3z2Z3B383d0p3H2A3j0@3L3n0-3O3Q053S3U3v3W3y2O3A390i0q3d0q3)193+3l2/1s3o0d2?3P3r3T3t3V3x3Y3{3!3}0J3d0J422*3,2.3M3:4c3@3w3X344i373}0L3d0L4o443-473/493q3R3s3u4w3`363#0z3d0z4F3J4q3m4I3N4K4b4M4d4O3_4h4R3}0b3d0b4W2C4Y462W4#4a3;3?4e3^4g4y4-3a0U3d0U4=3K4r3.4`4L3=4N4f4x3Z4A3a0N0A0=5k571j2(182T2G0P1/2L5a4x2S1p1g2%0O2)3j3*3J054x5E290B0P0-302B3#3c4M5M5O505h5R1|2e0O5V5g4z5Y2D3h453M0v0=0W0R5G2C5,5a0w3d5=5K4^2;0R0=2O1o0F0T0O0E231U0O0F5{5@4!0;040S6b4H4_0h0=2Z0u0e2w3f435H6i1~6e0D5{0H6c6j6l0d6n2w3G6r5?6t1Z6e0G0x5{0@6G5|0H5U015P2.3#3D5d6S4+513|3C5Z245#6T5W5(3}6X0c3h0H6=6y6I0-5.042w0Q0j666x6z2;0e0=0t0e6a6P716J0=6g786^3N6B6D0O6q2*6@594!0d0=0i707e6k046m6o0O6F2,7e6K7r7m4_7o04020f0Q0s7C4Z4_0u5 040N1B0N4n6P6O7z4r6Z0k5Q3}0p3r7Z5%523$0H5!5$4Q6$3$5*3k7d7Y5N6+7#3a3 5T7`6!5X3}3 7-6)7/4,7;7~3)7e6`5:6h7D1~5_3E8f7M5~0=0u0d0l222P0k2m0h0W2w0O8k5}7a6f8z4s0=2w0_7I0t0Q777X8l8B6L6N8D7Z7|0i4l7 876#4j3a4l85258X828!1R6:3E6?793/0=0F6C250k2Z0Q697L8A0-7F0K8|3M0u0B0=0A8Q7^5L807!6V4B7(9a7*7;4C8$6*816-3a4C7?6?7l8N8:048=0{0O3x3t0R8L3j9r8}018 915a9395978M2r8S9c3a4T8W6+9g8Z0i4T9j8(9m9W8+6;8.8c0=0R499H4!7t8_8y989E6v9-6A04329z9^1~0d8i2O9}3o8F690j8I8K8D5a6e6M7V8R9a8T4/9S9l7+4/9Y9T7:9Vah3H9q9q8/7f9u8?9x9:9B3J9D3M9G6PaC5a7t9v8@aza28~0=0MaMav9:a97n0=0IaT9_9{0R5;ad9=6Raf9P0i54ai6,7+54amaj7;a,aras6=auaIax9ya!aA2CaGaU0490aFa{8;a}aZ9AaQ7FaPb67s0=ba9L5F3L9O1^5R5la-9U5i3b5la;a.7;5k9$8-a`9)6{0X6~17bf8ga3aw9w8^0d8`b08j7e7F0caQa|bLbabP7W5F0c5J5p5D5r5A180Q5ub+2J2E751V2D5s6O0W0Y0!0F04.

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

.1280138/oblvn-u_yhPp342;amkw:S70ig,rs) *5=6+1edtf(c9050P0O0Q0t0B0f0F0H0T0f0t0F0F0K010Q0B0o010406050F0j0u0u0t0E0l040y0d0f0j0/0d0h050c0_0{0}0 0@0o04051f181i0c1f0@0P0B0g0%0)0+0-0)0h0C0j0t0C0O0i0o0l0Q0m160H0m0B0C0m0f1K0m0Q0=050Y0e0f0O1r0*0,011J1L1N1L0Q1T1V1R0Q0E1g1F0%120F0o0t0h0-0r011X1t010R0!0O0h0t0u0O1R1?1^1}1Z201V23250=0a0H0n0E0d0o0d0F0B150h0H0W1;0E0E0O0T2q18280h1g0c1F2D1-1/1.1S0P2a1u0B0h222n1R1o1q0(1Y2N2P0h0d2T1R0o2w1g2B2D2*0^1@2r2V1~2Z0E0|0f1R0t1I2w0R0-030k0k0T2!0O1N2Y0d0i0p0J0i0N0=0H0N180t2+2.0?2-292:1Z2=2@2_2{0O2}012 3133352Q383a1{040H0r3g3i1^3k2B2M013p0t2^1g2`0m2|2~30320W3z2Z3B383d0p3H2A3j0@3L3n0-3O3Q053S3U3v3W3y2O3A390i0q3d0q3)193+3l2/1s3o0d2?3P3r3T3t3V3x3Y3{3!3}0J3d0J422*3,2.3M3:4c3@3w3X344i373}0L3d0L4o443-473/493q3R3s3u4w3`363#0z3d0z4F3J4q3m4I3N4K4b4M4d4O3_4h4R3}0b3d0b4W2C4Y462W4#4a3;3?4e3^4g4y4-3a0U3d0U4=3K4r3.4`4L3=4N4f4x3Z4A3a0N0A0=5k571j2(182T2G0P1/2L5a4x2S1p1g2%0O2)3j3*3J054x5E290B0P0-302B3#3c4M5M5O505h5R1|2e0O5V5g4z5Y2D3h453M0v0=0W0R5G2C5,5a0w3d5=5K4^2;0R0=2O1o0F0T0O0E231U0O0F5{5@4!0;040S6b4H4_0h0=2Z0u0e2w3f435H6i1~6e0D5{0H6c6j6l0d6n2w3G6r5?6t1Z6e0G0x5{0@6G5|0H5U015P2.3#3D5d6S4+513|3C5Z245#6T5W5(3}6X0c3h0H6=6y6I0-5.042w0Q0j666x6z2;0e0=0t0e6a6P716J0=6g786^3N6B6D0O6q2*6@594!0d0=0i707e6k046m6o0O6F2,7e6K7r7m4_7o04020f0Q0s7C4Z4_0u5 040N1B0N4n6P6O7z4r6Z0k5Q3}0p3r7Z5%523$0H5!5$4Q6$3$5*3k7d7Y5N6+7#3a3 5T7`6!5X3}3 7-6)7/4,7;7~3)7e6`5:6h7D1~5_3E8f7M5~0=0u0d0l222P0k2m0h0W2w0O8k5}7a6f8z4s0=2w0_7I0t0Q777X8l8B6L6N8D7Z7|0i4l7 876#4j3a4l85258X828!1R6:3E6?793/0=0F6C250k2Z0Q697L8A0-7F0K8|3M0u0B0=0A8Q7^5L807!6V4B7(9a7*7;4C8$6*816-3a4C7?6?7l8N8:048=0{0O3x3t0R8L3j9r8}018 915a9395978M2r8S9c3a4T8W6+9g8Z0i4T9j8(9m9W8+6;8.8c0=0R499H4!7t8_8y989E6v9-6A04329z9^1~0d8i2O9}3o8F690j8I8K8D5a6e6M7V8R9a8T4/9S9l7+4/9Y9T7:9Vah3H9q9q8/7f9u8?9x9:9B3J9D3M9G6PaC5a7t9v8@aza28~0=0MaMav9:a97n0=0IaT9_9{0R5;ad9=6Raf9P0i54ai6,7+54amaj7;a,aras6=auaIax9ya!aA2CaGaU0490aFa{8;a}aZ9AaQ7FaPb67s0=ba9L5F3L9O1^5R5la-9U5i3b5la;a.7;5k9$8-a`9)6{0X6~17bf8ga3aw9w8^0d8`b08j7e7F0caQa|bLbabP7W5F0c5J5p5D5r5A180Q5ub+2J2E751V2D5s6O0W0Y0!0F04.
Exercice 7 : effectifs(donnees)

Compléter le code de la fonction effectifs qui prend en paramètre une liste donnees contenant des entiers ou des textes et qui renvoie un dictionnaire qui associe à chaque valeur apparaissant dans donnees le nombre de fois où elle y apparaît (c'est à dire le nombre d'occurences de valeur dans donnees).

Par exemple dans la liste [4, 1, 2, 4, 2, 2, 6] il y a une fois la valeur 1, trois fois la valeur 2, deux fois la valeur 4 et une fois la valeur 6. Le résultat attendu pour cette liste sera donc le dictionnaire {1: 1, 2: 3, 4: 2, 6: 1}.

On rappelle aussi que dans un dictionnaire, l'ordre dans lequel on donne les valeurs n'a pas d'importance. Ainsi, les dictionnaires {1: 1, 2: 3, 4: 2, 6: 1} et {4: 2, 1: 1, 6: 1, 2: 3} sont égaux.

>>> effectifs([4, 1, 2, 4, 2, 2, 6])
{4: 2, 1: 1, 2: 3, 6: 1}
>>> assert effectifs(["chien", "chat", "chien", "chien", "poisson", "chat"])
{'chien': 3, 'chat': 2, 'poisson': 1}

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

.1280138/oblvn-u_yhPp34]2amkw:S7igrs) [5=6+1edtf(c050N0M0O0t0A0f0D0F0R0f0t0D0D0I010O0A0o010406050D0j0u0u0t0C0l040y0d0f0j0,0d0h050c0?0^0`0|0;0o04051c151f0c1c0;0N0A0g0!0$0(0*0$0h0B0j0t0B0M0i0o0l0O0m130F0m0A0B0m0f1H0m0O0/050V0e0f0M1o0%0)011G1I1K1I0O1Q1S1O0O0C1d1C0!0 0D0o0t0h0*0s011U1q010P0X0M0h0t0u0M1O1:1=1`1W1}1S20220/0a0F0n0C0d0o0d0D0A120h0F0T1.0C0C0M0R2n15250h1d0c1C2A1*1,1+1P0N271r0A0h1 2k1O1l1n0#1V2K2M0h0d2Q1O0o2t1d2y2A2%0=1;2o2S1{2W0C0_0f1O0t1F2t0P0*030k0k0R2X0M1K2V0d0i0p0z0i0L0/0L150t2(2+0:2*262-1W2/2;2?2^0M2`012|2~30322N35371^040s3c3e1=3g2y2J013l0t2=1d2@0m2_2{2}2 0T3v2W3x350/0p3C2x3f0;3G3j0*3J3L053N3P3r3R3u2L3w360i0q0/0q3!163$3h2,1p3k0d2:3K3n3O3p3Q3t3T3?3V3^0H0/0H3}2%3%2+3H3+473/3s3S314d343^0J0/0J4j3 3(423*443m3M3o3q4r3=333W0z0/0z4A3E4l3i4D3I4F464H484J3;4c4M3^0b0/0b4R2z1g2#152Q2D0N1,2I3)014s2P1m1d2!0M2$3f3#3E054s52260A0N0*2}2y3W394H5a5c4b4t4(37390F2b0M5j4s3U4v5n1O0c3d403H0v0/0T0P544.4C2T010w0/0F5G58415J0h0P0/3p0P2u0,0P0D5O5A4`0.040Q5#5I2.5D132M0M5!3~555,1W5(0E0x5O0;5?5H4m5i015d2+3W3z3-0F624$5l3@3y1_5q5s4L6d0i675y040F6o5N5^3*5D0A2 0k5V5X5O6q4m4`0d0/0I6z5$4V0h0e6t2v5+6B4V5(0Q0E5}6N595b630k5e3^0p3n6a5k5u3W6#5p215r6X5t4u6*5x3d6p6A4U5J5C040P446G6r3I0/0g706O5J0d5L042L756`5-040N5/0M5;6U5Q1{5(5|5 3g7p5A6%6Z373`5h6W6b6)3^3`6,226h4%6j7w3C6^6^6H6{0/0A5F7p6_7l3k737c7T0*787O147R7M7e1l6v6x6M7r717n6T7-617y6Y654f6$7?6:5m0i4g7D6.7z6;7_2A6@7K877%7U7f6u0d6w0P5W7,2)7.0/0G7k4n7V7;7d5_0/0r7W3H6D046F7$710h6L8d7+0O8m5%8k8G6I8o8i767m8s8u6C0/0K8Q4V0u0A3a7:8M6V5j7u0i4x7x7F6c4e374x808+7A8.6?6n877S5B5U0Y0M8J5J7/7p5~8!2o7t7^374O8*6/6i8-0i4O8:9b7G9d997J8_7L8A8C8e8g8F8p7X015(8l9t8n04749y8H048t8z8N1W8w8y2%8`4`8W8Y928m961=3W4*9a827}4*9g9X6j9V9l6o890*6|2t0O0j0C7#9L9*728b7*8f6y9Q7r0c574/514;4~150O4@a42G2B0t1Ra10c4=5~0T0V0X0D04.

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

.1280138/oblvn-u_yhPp34]2amkw:S7igrs) [5=6+1edtf(c050N0M0O0t0A0f0D0F0R0f0t0D0D0I010O0A0o010406050D0j0u0u0t0C0l040y0d0f0j0,0d0h050c0?0^0`0|0;0o04051c151f0c1c0;0N0A0g0!0$0(0*0$0h0B0j0t0B0M0i0o0l0O0m130F0m0A0B0m0f1H0m0O0/050V0e0f0M1o0%0)011G1I1K1I0O1Q1S1O0O0C1d1C0!0 0D0o0t0h0*0s011U1q010P0X0M0h0t0u0M1O1:1=1`1W1}1S20220/0a0F0n0C0d0o0d0D0A120h0F0T1.0C0C0M0R2n15250h1d0c1C2A1*1,1+1P0N271r0A0h1 2k1O1l1n0#1V2K2M0h0d2Q1O0o2t1d2y2A2%0=1;2o2S1{2W0C0_0f1O0t1F2t0P0*030k0k0R2X0M1K2V0d0i0p0b0i0L0/0L150t2(2+0:2*262-1W2/2;2?2^0M2`012|2~30322N35371^040s3c3e1=3g2y2J013l0t2=1d2@0m2_2{2}2 0T3v2W3x350/0p3C2x3f0;3G3j0*3J3L053N3P3r3R3u2L3w360i0q0/0q3!163$3h2,1p3k0d2:3K3n3O3p3Q3t3T3?3V3^0H0/0H3}2%3%2+3H3+473/3s3S314d343^0J0/0J4j3 3(423*443m3M3o3q4r3=333W0z0/0z4A3E4l3i4D3I4F464H484J3;4c4M3^0b0/0b4R2z1g2#152Q2D0N1,2I3)014s2P1m1d2!0M2$3f3#3E054s52260A0N0*2}2y3W394H5a5c4b4t4(37390F2b0M5j4s3U4v5n1O0c3d403H0v0/0T0P544.4C2T010w0/0F5G58415J0h0P0/3p0P2u0,0P0D5O5A4`0.040Q5#5I2.5D132M0M5!3~555,1W5(0E0x5O0;5?5H4m5i015d2+3W3z3-0F624$5l3@3y1_5q5s4L6d0i675y040F6o5N5^3*5D0A2 0k5V5X5O6q4m4`0d0/0I6z5$4V0h0e6t2v5+6B4V5(0Q0E5}6N595b630k5e3^0p3n6a5k5u3W6#5p215r6X5t4u6*5x3d6p6A4U5J5C040P446G6r3I0/0g706O5J0d5L042L756`5-040N5/0M5;6U5Q1{5(5|5 3g7p5A6%6Z373`5h6W6b6)3^3`6,226h4%6j7w3C6^6^6H6{0/0A5F7p6_7l3k737c7T0*787O147R7M7e1l6v6x6M7r717n6T7-617y6Y654f6$7?6:5m0i4g7D6.7z6;7_2A6@7K877%7U7f6u0d6w0P5W7,2)7.0/0G7k4n7V7;7d5_0/0r7W3H6D046F7$710h6L8d7+0O8m5%8k8G6I8o8i767m8s8u6C0/0K8Q4V0u0A3a7:8M6V5j7u0i4x7x7F6c4e374x808+7A8.6?6n877S5B5U0Y0M8J5J7/7p5~8!2o7t7^374O8*6/6i8-0i4O8:9b7G9d997J8_7L8A8C8e8g8F8p7X015(8l9t8n04749y8H048t8z8N1W8w8y2%8`4`8W8Y928m961=3W4*9a827}4*9g9X6j9V9l6o890*6|2t0O0j0C7#9L9*728b7*8f6y9Q7r0c574/514;4~150O4@a42G2B0t1Ra10c4=5~0T0V0X0D04.

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

.1280138/oblvn-u_yhOPp34{]2}amkw:S7igrs) é[5=6+1edtf(c9050R0Q0S0w0D0f0G0I0V0f0w0G0G0M010S0D0p010406050G0j0x0x0w0F0l040B0d0f0j0;0d0h050c0{0}0 110_0p04051h1a1k0c1h0_0R0D0g0)0+0-0/0+0h0E0j0w0E0Q0i0p0l0S0m180I0m0D0E0m0f1M0m0S0@050!0e0f0Q1t0,0.011L1N1P1N0S1V1X1T0S0F1i1H0)140G0p0w0h0/0u011Z1v010T0$0Q0h0w0x0Q1T1^1`1 1#221X25270@0a0I0o0F0d0p0d0G0D170h0I0Y1?0F0F0Q0V2s1a2a0h1i0c1H2F1/1;1:1U0R2c1w0D0h242p1T1q1s0*1!2P2R0h0d2V1T0p2y1i2D2F2,0`1_2t2X202#0F0~0f1T0w1K2y0T0/030k0k0V2$0Q1P2!0d0i0q0W0i0P0@0P1a0w2-2:0^2/2b2=1#2@2_2{2}0Q2 01313335372S3a3c1}040u3h3j1`3l2D2O013q0w2`1i2|0m2~3032340Y3A2#3C3a0@0q3H2C3k0_3L3o0/3O3Q053S3U3w3W3z2Q3B3b0i0r0@0r3)1b3+3m2;1u3p0d2^3P3s3T3u3V3y3Y3{3!3}0L0@0L422,3,2:3M3:4c3@3x3X364i393}0N0@0N4o443-473/493r3R3t3v4w3`383#0C0@0C4F3J4q3n4I3N4K4b4M4d4O3_4h4R3}0b0@0b4W2E1l2*1a2V2I0R1;2N3.014x2U1r1i2)0Q2+3k3*3J054x572b0D0R0/322D3#3e4M5f5h4g4y4-3c3e0I2g0Q5o4x3Z4A5s1T0c3i453M0y0@0Y0T594?4H2Y010z0@0I5L5d465O0h0T0@3u0T2z0;0T0G5T5F4 0?040U5*5N2?5I182R0Q5)435a5;1#5-0H0A5T0_5{5M4r5n015i2:3#3E3=0I674+5q3|3D1~5v5x4Q6i0i6c5D040I6t5S5}3/5I0D340k5!5$5T6v4r4 0d0@0M6E5+4!0h0e6y2A5:6G4!5-0U0H6E6F4Z5O0V5l030I0n2t0p0Q160I0w0j0-0D0I0J0V0F0D2y2u6z0d6B0T5#2A0I0M0I0s0v626S5e5g680k5j3}0q3s6f5p5z3#7h5u265w7d5y4z7m5C3i6u6Z5V205H040T496L6w3N0@0g7F6T5O0d5Q042Q7K6!5=040R5@0Q5_7a7z5~0@61643l7(5F7j7f3c3 5m7c6g7l3}3 7o276m4,6o7/3H7x7x6M5O7B0D5K7(7y4s7I7R7!0/7N0@7Q87827T1q6A6C6R7*7G5-7%4p7Z6e7;7e6a4k7i8v7s5r0i4l7_7q7=7t8y2F7w808M8i3p6Q6 8m0S8t5,0@0K8U6N8a8o7L205-0t8b3M6I046K8h7G0h8Q70728T8#7S7#048X8_8c7H047J8~3M8(8*6H0@0O964!0x0D3f79937,8x3c4C7:7{6h4j9j6k7p9m7?9p8K6s8M884 7B360G0Q8Y5O8q9f2.3L9h1`4S8z9s8I3c4T8F9O8C4T9v9x808O6x7U6~8?6D938V8|9E7T929I8$8{8)8/9:8d6J9a5O9c9e7(639/7b5o7-0i4/9l7r6n9oa49q7`a77|a9a57 6u9Z017B2y0S0j0F199?8`9!8k8R719(8s7*0c5c4@564_531a0S4|aG2L2G0w1WaD0c4`630Y0!0$0G04.

III. Les listes⚓︎

Exercice 1⚓︎

Vous devez générer une liste contenant les entiers de 1 à 49 dans l'ordre croissant. Ensuite, votre code doit tirer, sans remise, 6 numéros qu'on stocke dans une liste, puis, toujours sans remise, un dernier numéro (le numéro complémentaire).

Exemple

Votre code affichera la liste des 6 numéros puis le complémentaire comme ceci :

[31, 3, 12, 45, 13, 27]
18

Attention

Vous pourrez importer le module random. Vous ne devez pas utiliser la fonction choice du module random.

A vous de jouer

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

Astuce

🌵 Envisagez différentes façons de coder ce problème, utilisant pop, del ou remove ...

Solution avec la méthode pop

C'est la solution préférable.

from random import randint
liste = [i for i in range(1, 50)]
reponse = []
for i in range(6):
    numero = liste.pop(randint(0, len(liste) - 1))
    reponse.append(numero)
print(reponse)
complementaire = liste.pop(randint(0, len(liste) - 1))
print(complementaire)
Solution avec del
from random import randint
liste = [i for i in range(1, 50)]
reponse = []
for i in range(6):
    i = randint(0, len(liste) - 1)
    reponse.append(liste[i])
    del liste[i]
print(reponse)
i = randint(0, len(liste) - 1)
print(liste[i])
Solution avec la méthode remove
from random import randint
liste = [i for i in range(1,50)]
reponse = []
for i in range(6):
    i = randint(0, len(liste) - 1)
    reponse.append(liste[i])
    liste.remove(liste[i])
print(reponse)
i = randint(0, len(liste) - 1)

print(liste[i])
Ajouter/extraire un élément dans une liste

Les objets de type list en Python sont des tableaux dynamiques, qui peuvent être modifiés en place en leur appliquant une méthode appropriée avec la syntaxe objet.methode(arguments).

Méthode Action Syntaxe Type de la valeur renvoyée
append Ajout d'un élément elt à la liste lis lis.apppend(elt) None
pop Extraire le dernier élément de la liste lis lis.pop() celui de l'élément extrait
pop Extraire l'élément d'indice i' de la liste lis lis.pop(i) celui de l'élément extrait
insert Insertion d'un élément elt à l'élément d'indice i' dans la liste lis lis.insert(i, elt) None
extend Etendre la liste lis1 avec la liste lis2 passée en argument lis1.extend(lis2) None
remove Supprimer la première occurrence de elt dans la liste lis lis.remove(elt) None
Python Console Session
>>> lis = [14, 10, 11, 10, 7]
>>> lis.append(8)
>>> lis
[14, 10, 11, 10, 7, 8]
>>> a = lis.pop()
>>> a
8
>>> lis
[14, 10, 11, 10, 7]
>>> lis.remove(10)
[14, 11, 10, 7]

Exercice 2⚓︎

Exercice 2

1. On considère le programme suivant :

liste1 = [0]*100
liste2 = [0 for k in range(100)]
liste3 = []
for k in range(100):
    liste3.append(0)

Quel est le contenu de chacune des listes ?

Solution

😀 Utiliser l'éditeur Python pour vérifier les réponses ...

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

2. Ecrire un programme python permettant de créer les listes suivantes :

a. Une liste contenant 12 fois le chiffre 7.
b. La liste des nombres entiers de 1 à 100.
c. Une liste contenant 50 nombres tirés au sort entre 1 et 6.

A vous de jouer

###(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
from random import randint
liste_a = [7 for _ in range(12)]
liste_b = [i for i in range(1, 101)]
liste_c = [randint(1, 6) for _ in range(50)]
print(liste_a)
print(liste_b)
print(liste_c)

Exercice 3⚓︎

Écrire une fonction sans_doublon qui prend en paramètre une liste de nombres pouvant contenir des nombres répétés plusieurs fois et renvoie la liste ne contenant qu'une fois chaque nombre.

Exemple

>>> sans_doublon([1, 2, 4, 6, 6])
[1, 2, 4, 6]
>>> sans_doublon([2, 5, 7, 7, 7, 9])
[2, 5, 7, 9]
>>> sans_doublon([5, 1, 1, 2, 5, 6, 3, 4, 4, 4, 2])
[5, 1, 2, 6, 3, 4]

Attention

Il est interdit d'utiliser count

Compléter le code 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

.1280138/oblvn-u_yhPp43]2amkw:Sigrs) [5.=61edtf(c050M0L0N0t0z0f0C0E0Q0f0t0C0C0I010N0z0o010406050C0j0u0u0t0B0l040y0d0f0j0+0d0h050c0=0@0_0{0:0o04051b141e0c1b0:0M0z0g0Z0#0%0)0#0h0A0j0t0A0L0i0o0l0N0m120E0m0z0A0m0f1G0m0N0.050U0e0f0L1n0$0(011F1H1J1H0N1P1R1N0N0B1c1B0Z0~0C0o0t0h0)0s011T1p010O0W0L0h0t0u0L1N1/1;1_1V1|1R1 210.0a0E0n0B0d0o0d0C0z110h0E0S1-0B0B0L0Q2m14240h1c0c1B2z1)1+1*1O0M261q0z0h1~2j1N1k1m0!1U2J2L0h0d2P1N0o2s1c2x2z2$0;1:2n2R1`2V0B0^0f1N0t1E2s0O0)030k0k0Q2W0L1J2U0d0i0p0b0i0K0.0K140t2%2*0/2)252,1V2.2:2=2@0L2_012{2}2 312M34361@040s3b3d1;3f2x2I013k0t2;1c2?0m2^2`2|2~0S3u2V3w0i0q0.0q3B2w3e0:3F3i0)3I3K053M3O3q3Q3t2K3v35340.0p3!153$3g2+1o3j0d2/3J3m3N3o3P3s3S3?3U3^0G0.0G3|2$3%2*3G3+463/3r3R304c333^0J0.0J4i3e1f2!142P2C0M1+2H3)014r2O1l1c2Z0L2#4A3}3D054r4R250z0M0)2|2x3V383L0E4Z4#4a4s324(1^2a0L4-4r3T4u364)3!3(410)0v0.0S0O3#4U4 2S010w0.0E562y3 4m0O0.0C1;0C0k0M0d0j1Q125e4X40590-040P5t5g4J0h0.1$0L0t0j5A581`5x0D0x5t0:4T5f3F4,014$2*3V3y3-4+4!5V4.4`5Y4=204@5%4_4t5*2z3c0E5@5d5K3j0.2V0j0g5G5I5R045_4l4J0d0.0I5t643h50015x0F0r5P5J4l5U5W1;3V3X4*6l5(5:3^3X0E4?4^3=4:6u1N0c5?5^5B6d52040O436a6G595D042V0u0e2s6M5`0)0d5b042K6V656d6P5F5H6j6c5w0.5O625Q2(5T5$6m0h3V0p3m6r5/6A366|6w5,6y4b703_5=635^7b6N1`6I0z55626b5v2-5|0d6S6U7i7d1V6Y7m0N6$6-1`7t6!137q6W3H7m5~606,7k1V5x6:4j7I5#4-4%4e6}6^6s774f7321754/3@364f797b7*6F7D6P5}5 6+627r6X0.0H7O5C0.0t0o0o1~0M7`6d5x5z7=7-7m7o0L826.040D6i866k7U7R364w6q7U6 7$0i4w7Y5-3;768p8l3B7c7D6I2s0N0j0B7B2$7j4m7F7:617N7=0c4W4B4Q4D4N140N4G8V2F2A0t1Q8S0c4E5Q0S0U0W0C04.

Exercice 4 : Savoir compter⚓︎

Écrire une fonction compter_triples qui prend en paramètre une liste entiers de nombres entiers et renvoie le nombre de multiples de 3 de cette liste

Attention

Il est interdit d'utiliser count

Compléter le code 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/oblvn-u_yh%Pp432amkw:S0igrs) 5=6+1edtf(c9050L0K0M0s0z0e0C0E0P0e0s0C0C0G010M0z0o010406050C0i0t0t0s0B0k040x0c0e0i0+0c0g050b0=0@0_0{0:0o04051b141e0b1b0:0L0z0f0Z0#0%0)0#0g0A0i0s0A0K0h0o0k0M0l120E0l0z0A0l0e1G0l0M0.050U0d0e0K1n0$0(011F1H1J1H0M1P1R1N0M0B1c1B0Z0~0C0o0s0g0)0r011T1p010N0W0K0g0s0t0K1N1/1;1_1V1|1R1 210.0a0E0n0B0c0o0c0C0z110g0E0S1-0B0B0K0P2m14240g1c0b1B2z1)1+1*1O0L261q0z0g1~2j1N1k1m0!1U2J2L0g0c2P1N0o2s1c2x2z2$0;1:2n2R1`2V0B0^0e1N0s1E2s0N0)030j0j0P2W0K1J2U0c0h0p0Q0h0J0.0J140s2%2*0/2)252,1V2.2:2=2@0K2_012{2}2 312M34361@040r3b3d1;3f2x2I013k0s2;1c2?0l2^2`2|2~0S3u2V3w0h0q0.0q3B2w3e0:3F3i0)3I3K053M3O3q3Q3t2K3v35340.0p3!153$3g2+1o3j0c2/3J3m3N3o3P3s3S3?3U3^0F0.0F3|2$3%2*3G3+463/3r3R304c333^0H0.0H4i3e1f2!142P2C0L1+2H3)014r2O1l1c2Z0K2#4A3}3D054r4R250z0L0)2|2x3V383L0E4Z4#4a4s324(1^2a0K4-4r3T4u364)3!3(410)0u0.0S0N3#4U4 2S010v0.0E562y3 4m0N0.2~0t0o0M0K0B0j1)0,1R0C5e4X40590-040O5v5g4J0g0.1~0+5o5u4T5f581`5z0D0w5v0:5L5w4+4!014$2*3V3y3-5W4^3=4:3^1@0E4?5)4b5+3x1N0b3c0E5`5d5N3j5j5m5v5|4l4J0c0.0G615D50010t0z0.0y5S5C3F4,5Y0j4%3^3X4*6j3;5;3@363X5.204@6k4_4t3V6o3B5{623h6a52040N43685}3*0.2V0t0d2s6N636a0c5b042K6V6H595F045H0z5J6h6W5y0.5R5U5T2(6i5X5Z1;3V0p3m6q4.4`6}4=6x5:4/6t3_2z5_6F5{69596J0z555U6G5x2-6Q0c6S6U7j7e1`65040m6$7l1V6c3Y7x3G7u0G677r6O6b6d046f5U7s1V5z6=4j6.4Y6`6l5!4e6 7V6A5=0h4f6w2176727Y7a047c7:7k4m5 0M7C64667_6a6)0P607H6/7t0.0I7|597A043a6?7T2n706m364w6p7!5*784w7)6y6r774d8g5@7b5`7O510.2s0M0i0B13816%7m047 7^8b7N0b4W4B4Q4D4N140M4G8S2F2A0s1Q8P0b4E5T0S0U0W0C04.

Exercice 5 :⚓︎

Indice du minimum

Exercice 6 :⚓︎

Maximum

Exercice 7 :⚓︎

Distribution de costumes

Exercice 8 :⚓︎

Aplatir un tableau

Exercice 9 : Le nombre mystère⚓︎

Exercice 9

Trouvez le nombre mystère qui répond aux conditions suivantes :

  • Il est composé de 3 chiffres.
  • Il est strictement inférieur à 300.
  • Il est pair.
  • Deux de ses chiffres sont identiques.
  • La somme de ses chiffres est égale à 7.

On vous propose d'employer une méthode dite de « force brute », c'est-à-dire de tester tous les nombres possibles répondants aux trois premières conditions.

Question

Compléter le script suivant

  • possibles est la liste des nombres répondant aux trois premiers critères.
  • liste est la liste des nombres répondant au problème.

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

.1280138/oblvn-u_xyh%Pp34]2T;amkw:S07ig,rsF) [5q=6+1Eedtf(c9050W0V0X0x0F0f0J0M0!0f0x0J0J0Q010X0F0q010406050J0j0y0y0x0I0m040C0d0f0j0_0d0h050c101214160~0q04051m1f1p0c1m0~0W0F0g0.0:0=0@0:0h0G0j0x0G0V0i0q0m0X0n1d0M0n0F0G0n0f1R0n0X0|050)0e0f0V1y0;0?011Q1S1U1S0X1!1$1Y0X0I1n1M0.190J0q0x0h0@0u011(1A010Y0+0V0h0x0y0V1Y1}1 241*271$2a2c0|0a0M0p0I0d0q0d0J0F1c0h0M0%1{0I0I0V0!2x1f2f0h1n0c1M2K1@1_1^1Z0W2h1B0F0h292u1Y1v1x0/1)2U2W0h0d2!1Y0q2D1n2I2K2;0 1~2y2$252*0I130f1Y0x1P2D0Y0@030k0k0!2+0V1U2)0d0i0O0D0i0T0|0M0T1f0x2=2^0}2@2g2`1*2|2~30320V340136383a3c2X3f3h22040M0u3n3p1 3r2I2T013w0x2 1n310n333537390%3G2*3I0i0r3k0r3O2H3q0~3S3u0@3V3X053Z3#3C3%3F2V3H3g0i0s3k0s3;1g3?3s2_1z3v0d2}3W3y3!3A3$3E3)433+450O3k0O4a2;3@2^3T3{4k3 3D3(3b4q3e450R3k0R4w4c3^4f3`4h3x3Y3z3B4E423d3,0E3k0E4N3Q4y3t4Q3U4S4j4U4l4W414p4Z450b3k0b4(2J4*4e2%4-4i3|3~4m404o4G4^3h0#3k0#4}3R4z3_524T3}4V4n4F3*4I3h0T0D0|5s5f4 4A4.545m575o4H3,0T3j045G5w4d5y534C564X4@445r3K0T3N0c3o3=4)5L5i4B4:4D4?595S3i3.5I3:5X3P4~5#4,5%5l4;5n4Y5,0T475I495;5Z5?4P515_554=585p5F4t5I4v634b5!662{5z5O6a5D5a3i4K5I4M6h4x5@676m5(5P5*6c450T4#5I4%6v4O5h5^6z5`5)6b5E6E4`5I4|6J6j6L6y5N6A6o5}4r5r5c5I5e6W656Y6l6!6O6B6Q6q0u5t046_5K6k4g6;695|5R6(0i0u5H766}6/6 5k715C6%5q753K0u5W5Y6i6.4+6Z7c5B5Q5+740u5.7v797o6:7q5{7e737g0u607G7y507A4/6=6$7E3,0u6e7R7J5M7B6P6p5,0u6s7!7U5$6N7d7s6D3J6G0u6I7l6w6~4R707r6C6R3J6T0u6V7;6K7z7b7M7*7`6^6*0u6,806X827@7W6?7Y740r6`8j7%6M7^7C7+7{3-5H0r3m6-5g8d5j847_6@5,0r3K8E8m7p8A8p868D5.0r5:8b2J1q2/1f2!2N0W1_2S5i4F2Z1w1n2.0V2:3q641n4F8+2g0F0W0@372I5F3y8=8@8C743j0M2l0V8}8h7g5H3;7?010z0|0%0Y8-6x250A3k9f990h0Y9c0V0j0l381Q0Y0Y0V0J0k8=290X9k7a0@0{040Z9C8y0h0|0h0e2D9I7K1*9F0B9P4A0e0|2V9B7m8:9Q9E0|0L9U5i0d0|0i020G0X0w8-0M9g3v9W040e0d199*4,9S8-0~9!5L8|018^2^7Q8{8?a78~7F2392947faa2K5Y999i3L0Maq9 510J0W0|01axa29Ua6a81 3,5.5laBaeaEag2b93ad95aJal9#3Tau3kaq0M2D0h0g0d0F1%0v0I0j1%2v919N1%310%9q0.9t0Y2D0-9z0h0_0Pa)0J0H0M0K3W0Ja*2V1daza43SaH8_4560aGac8L744791aLai7Pbd1Y6399aTapaq0U0l0V0y0q1$0-9T9!a32?babg0kbc3h6ebfbm7t7g4tbk2cbN7,3fbpam9D01bsaV0M9/9;b%0wb)2z9p9r0!a?9w9y0%a{0Z5V0T9)bDaAbHbJ0i6sbMaNaj4JaKbSc3bn3hc1bqbYb!aVa%a)b8bF4zbba9456Gc2bh7g4#bRaMcq4!bWaR5iceaqb)cC9:0wb,9q9s0F9ub;a`0Xb^7vb{6wb9ckb~cm3h6TcpaI4_c6cucZcWcx9^0@cAb1b30Vci8,bG8}b 6*cYaO455cctbT8rc^5;bEc;cTc?cV3i6`c_c45r5tc}c8bO5Fd8d1b}d5aD6E9731aHc`5r90ahdebU5Gc)bravbt0Max01c:3Qa5cUdl5Tabc~6q5Vc#dL5~3K3Ob#c*3U0|0y0d9Z2;9@999,040Q9?dU9M0|0J1@as259F9HcS9J9La-d:9R9(dE8Rc=adb 0TaFdobHdq5-dOdu8re3cxdT999b04cJd*99d=d{3`dWdYem019F0Neq0y0F0|0Deq9F0tejbYd%0Qd)9!d#bY9K04dXdZd38yeseuew5Iez0|eBeHdU0dao4heCd^eLepd@9$er0|ete*3Tev5ueU04eWd!eY0|eFe$e+eKeMe?e.cj8ye;6{e?0tcQ3qeI8yeZ0|e#eHfbe~eoeNdFeke-eRexf7e}3TeEeGe_9lfjf1fof6e/5ieAbCcRf32ycldI3ibee5dP8 bjdtcv6Ebe5;b#eebYeg2D0X0j0I1eeXef0!0|cgc/b|e/fI0h6ddKeadMbQfQc%3ibLfUaVdUeg3bb4e?fE4cf/dHf;6Ec1fMf@5~4KddfR5rcb3ofVf ef0|fZf#f%fvfXf*04b20,f-fFeOfHg85Fcogcgh3icsf`e76Fcxd2fld4e1d60TcXgFf{gSe9gGgWaQg09o9efB4,ao9@g(679n040J0d120VcI9ua^e?d?fG4Ad_9Og,d;0|g5gO9J9`9Ye?f9h4e+d%9.cEeqd,eha{g4d~aRf:5Fc^gUgKc|gJda3id0bX8yg*f h01*bsdChkdGdkg93Jd8hpht6_gXf{hMg!dyaUaqaXaZa#0M0:0Mg:g=b,0-b/cJ9v0-2A9Mg gzha0Mhm4576f?gGh@gghO97cc8yc,bvbxbz1%h35?g7hG7QdRhKc97hhNe77jdxcddzb#cDb(cEhZg;2cg@a@9wcO0rh9i6g|h=3Je4h;e6hL3.h{ifaFh~e+c,6uh/d gPaChH75fLiCfN7FfPblgd7ufT3ogNiO8;gCh?bLibdfi+iehLf}hwiKijaVhDf.iyi*3JgbiUiZ7Fgfhsic7!edgmeJfxf(eDe{fr5$9`d.0Ig`hfg~gygA3T9Fiw3ri7gQfJ7/h^hOgIiYh_cof~arfwg/ipjm3Qfhfsjdjbf4eSeyi{jniz75gTj0h_4`iGhLcXjCjJ5ieg0Yffgse%0!14je4,fdhhj/67jag|fCh2hEe0iQ7QhojVhOhrjzk2j7gld+d-jGj?25eEkb3vk9g=ke0@d%0Ski3Uh6hihA9%9Gjk04j-jikqe,04jqi%hli}3-hJk1e78ji:ickIaQfW8yfY0(gqkmeKh!2cj|iPbId68ujwkHdsk4k$gMdjjtiR8Ek#htk.jYkKdRiJg}042t0=0F1#9wkmkdjMe+eQkxeK0Fkmj(j*fak8ehl0ao2VkS9`0I1 1Hjjkxf55sjPj_a00|0Hkmf58jlqjnj`kzl89Xg%j+fildl2jK040olveS5WlFlJe|lnjOfqjQh:jS8Ok/kKiFj4i.3hlYhQj9041Ud.jH2Jj$j:jLlPlAf2lz5^jllC04j)kwl@l{04h-l/3LeYlfgrlbjEk{2vk~0Jl}eilIlAg{l`j@04a:b.b:9xcMlmlrmmm4h8l0e{fumagtf+a(m5l;51j;1 0WkSkgiqh(g^k kxell5l|mRd}mil=d(mAjIdUf56Imuh1kze^g62?0c8/8S8*8U8%1f0X8Xm^2Q2L0xk~2K8Va30%0)0+0J04.

Exercice 10 : Le Le problème de JOSEPHUS⚓︎

Exercice 10

Le but de l'activité est d'écrire un programme permettant de résoudre le problème de Joséphus en révisant les listes de Python.

  1. On représente un cercle de n soldats par la liste [1,2,...,n]
    1. Ecrire une fonction soldats(n) qui renvoie la liste [1,2,....,n]
    2. Verifier que n est bien un entier strictement positif à l'aide d'instruction assert
    3. Ajouter une chaîne documentation.
  2. Afin de repérer l'épée, on décide que le soldat qui la tient se situe toujours en première position de la liste.

    1. Compléter l'évolution de la liste de soldat ci-dessous

      Etat de la liste Explications
      [1,2,3,4,5,6] 1 élimine 2 et passe l'épée à 3 qui passe donc en tête de liste
      [3,...,5,6,1] 3 élimine ... et passe l'épée à ... qui passe donc en tête de liste
      [...,6,1,3] ... élimine ... et passe l'épée à ... qui passe donc en tête de liste
      [...,...,...] .....
      [...,...] .....
      [...] .....
    2. Compléter l'algorithme suivant d'évolution de la liste et indiquer les instructions Python correspondantes (on désigne par cercle la liste représentant le cercle de soldats):

      Etapes Opération sur la liste Instructions Python
      1⃣ .......... tueur=cercle.pop(0)
      2⃣ Ajouter cet élément en fin de liste ......
      3⃣ Supprimer le premier élément ......
    3. Quel est la condition d'arrêt de l'algorithme ?

    4. Exprimer cette condition par un test en python sur cercle
  3. Programmer une fonction josephus(n) qui renvoie le soldat survivant pour un cercle de n soldats.

  4. /ol>

    Résolution sur Capytale

IV. Les chaines de caractères⚓︎

Renverser une chaîne

V. Les dictionnaires⚓︎

Dictionnaires en Python

Un dictionnaire en Python est une structure de données qui permet d'associer des clés à des valeurs. Contrairement aux listes, les éléments d'un dictionnaire ne sont pas ordonnés et sont accessibles par leur clé et non via leur position dans le dictionnaire.

En Python, un dictionnaire est de type dict, il est délimité par des accolades et les associations entre clef et valeur sont notées clef: valeur et les différentes associations sont séparées par une virgule.

Plusieurs méthodes sont possibles pour créer un dictionnaire de type dict :

Python
# Création par extension
dico = {"nom": "Alice", "âge": 25, "ville": "Paris"}

# Création avec le constructeur dict
dico2 = dict(nom="Bob", âge=30, ville="Lyon")

# Création par compréhension
carres = {x: x**2 for x in range(1, 6)}

# création d'un dictionnaire vide
dico_vide1 = {}  # avec délimiteurs
dico_vide2 = dict()  # avec constructeur
Lecture/modification dans un dictionnaire

Les dictionnaires sont des objets mutables en Python, ils sont accessibles en lecture ou écriture comme les objets de type list. Pour rappel les objets de type tuple sont juste accessibles en lecture.

Python
# Accéder à une valeur
print(dico["nom"])  # Affiche "Alice"

# Modifier ou ajouter une valeur
dico["âge"] = 26  # Modification
dico["pays"] = "France"  # Ajout

# Supprimer une entrée
del dico["ville"]

Différences entre liste et dictionnaire

Les méthodes append et insert n'existent pas pour un dictionnaire car il n'y a pas de notion d'ordre d'insertion. En revanche la méthode pop existe.

La fonction sorted ne trie que les clefs et la méthode sort n'est pas définie. Enfin, les fonctions min et max n'opèrent de même que sur les clefs.

Type Opération Syntaxe
list ajout d'un élément à la fin lis.append(element)
dict ajout d'une association clef: valeur dico[clef] = valeur
list extraire l'élément d'index k lis.pop(k)
dict extrait la valeur associée à la clef dico.pop(clef)

Un petit exemple avec le nombre de titres de champions de France de Football en 2024:

Python
>>> titres = {'PSG': 12, 'ASSE': 10,
             'OM': 10,  'ASM': 8, 'OL': 7}
>>> titres['OM'] = titres['OM'] - 1
# Affaire OM/VA le titre de 1993 est retiré pour tricherie
>>> titres['FCNA'] = 8 # on avait oublié le FC Nantes !
>>> titres.pop('PSG') # exclu pour concurrence déloyale
12
>>> titres
{'ASSE': 10, 'OM': 9, 'FCNA': 8, 'ASM': 8, 'OL': 7}
>>> sorted(titres) # on ne trie que les clefs
['ASM', 'ASSE', 'FCNA', 'OL', 'OM']
Valeurs mutables ou immuables
Type Propriété Sens
list, dict mutable acessible en lecture et écriture
tuple, int, bool, str immuable accessible en lecture seule / non modifiable

Attention, dans les associations clef: valeur d'un dictionnaire, la clef ne peut être que d'un type immuable c'est-à-dire non modifiable en écriture : tuple, int, bool, str. Il n'y a pas de restriction sur le type de la valeur.

Python
# un dictionnaire dont les valeurs sont des listes
carnet_notes = {'Alex' :[14, 11, 13], 'Sabri': [18, 15, 14]}
# valeur d'une position (ligne, colonne) dans un jeu de plateau
# on peut utiliser des tuples comme clefs car ils sont immuables
valeur = {(1, 2): 10, (4, 5): -1}
# on ne pourrait pas utiliser [1, 2] et [4, 5] comme clefs
Parcours de dictionnaires

Trois méthodes de parcours d'une dictionnaire sont possibles. Le parcours par index n'est pas possible car il n'y a pas d'index dans un dictionnaire mais des clefs.

Python
# Parcours par les clés
for cle in dico.keys():
    print(cle)

# Syntaxe simplifiée pour le parcours par les clés
for cle in dico:
    print(cle)

# Parcours par les valeurs
for valeur in dico.values():
    print(valeur)

# Parcours par paires clé-valeur
for cle, valeur in dico.items():
    print(f"{cle}: {valeur}")
Exercice 11 : QCM

Questions

QCM sur les dictionnaires en Python. Une question peut avoir plusieurs bonnes propositions de réponse.

Compétences évaluées :

  • 📝 Accéder aux éléments d’un dictionnaire
  • 📝 Ajouter, modifier et supprimer des éléments
  • 📝 Parcourir un dictionnaire avec une boucle
  • 📝 Vérifier la présence d’une clé
  • 📝 Travailler avec une liste de dictionnaires
  • 📝 Utiliser get() pour éviter des erreurs
  • 📝 Inverser un dictionnaire

  1. On dispose d'un dictionnaire stockant les prix de plusieurs articles en euros :

    Python
    prix_articles = {"ordinateur": 1200, "souris": 25, "clavier": 45}
    

    Quelle est la bonne syntaxe pour accéder au prix du clavier ?

    • prix_articles["clavier"]

    • prix_articles(2)

    • prix_articles["2"]

    • prix_articles.get("2")

  2. On considère le dictionnaire suivant représentant un carnet de notes :

    Python
    notes = {"Paul": 14, "Emma": 16}
    

    Quelle instruction permet d’ajouter Léo avec une note de 12 ?

    • notes["Léo"] = 12

    • notes.add("Léo", 12)

    • notes.insert("Léo", 12)

    • notes.append("Léo", 12)

  3. On a le dictionnaire suivant contenant des stocks de livres en bibliothèque :

    Python
    stock_livres = {"Python": 5, "JavaScript": 3, "C++": 2}
    

    Quelle expression permet de vérifier si le livre "JavaScript" est disponible dans ce dictionnaire ?

    • "JavaScript" in stock_livres

    • stock_livres.contains("JavaScript")

    • stock_livres.has_key("JavaScript")

    • "JavaScript" in stock_livres.values()

  4. On souhaite retirer Emma du carnet de notes suivant :

    Python
    notes = {"Paul": 14, "Emma": 16, "Léo": 12}
    

    Quelle instruction faut-il utiliser ?

    • del notes["Emma"]

    • notes.remove("Emma")

    • notes.popitem("Emma")

    • notes.clear("Emma")

  5. On considère un dictionnaire contenant le nombre de médailles d’or remportées par des pays :

    Python
    medailles = {"France": 10, "USA": 25, "Chine": 20}
    

    Quelle boucle permet d'afficher chaque pays et son nombre de médailles au format :

    "Le pays [nom] a obtenu [nombre] médailles d’or."

    • Python
      for nb, pays in medailles.items():
          print(f"Le pays {pays} a obtenu {nb} médailles d’or.")
      

    • Python
      for pays, nb in medailles.items():
          print(f"Le pays {pays} a obtenu {nb} médailles d’or.")
      

    • Python
      for pays in medailles:
          print(f"Le pays {pays} a obtenu {medailles[pays]} médailles d’or.")
      

    • Python
      for pays in medailles.keys():
          print(f"Le pays {pays} a obtenu {pays} médailles d’or.")
      

  6. On dispose du dictionnaire suivant :

    Python
    cours = {"Maths": 18, "Physique": 14}
    

    Quelle est la meilleure façon d’accéder à la note d’Histoire, en évitant une erreur si la matière n’est pas présente ?

    • cours.get("Histoire", 0)

    • cours["Histoire"]

    • cours.has_key("Histoire")

    • cours.contains("Histoire")

  7. On a un tableau de dictionnaires contenant des informations sur des smartphones :

    Python
    smartphones = [
        {"modèle": "iPhone 14", "prix": 999, "marque": "Apple"},
        {"modèle": "Galaxy S23", "prix": 899, "marque": "Samsung"},
        {"modèle": "Pixel 7", "prix": 649, "marque": "Google"}
    ]
    

    Quelle instruction permet d’accéder au prix du Galaxy S23 ?

    • smartphones[1]["prix"]

    • smartphones["Galaxy S23"]["prix"]

    • smartphones[1].prix

    • smartphones["prix"][1]

  8. On a le dictionnaire suivant qui associe des étudiants à leurs matières préférées :

    Python
    preferences = {
        "Alice": "Maths",
        "Bob": "Physique",
        "Charlie": "Maths",
        "David": "Informatique"
    }
    

    On veut construire un dictionnaire inverse qui associe chaque matière à la liste des étudiants qui l’aiment. Quelle boucle permet de le faire ?

    • Python
      inverse = {}
      for etudiant, matiere in preferences.items():
          if matiere not in inverse:
              inverse[matiere] = []
          inverse[matiere].append(etudiant)
      

    • Python
      inverse = {}
      for matiere, etudiant in preferences.items():
          inverse[matiere].append(etudiant)
      

    • Python
      inverse = {}
      for etudiant, matiere in preferences.items():
          inverse[etudiant] = matiere
      

    • Python
      inverse = preferences.reverse()
      

Exercice 11

Compléter le script suivant pour qu'il affiche la liste pokemons_rapides des noms des pokémons dont la vitesse est supérieure à 60.
On doit obtenir l'affichage : ['Salameche', 'Reptencil'] ou ['Reptencil', 'Salameche']

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

Correction possible utilisant la méthode items:

pokemon1 = {'Nom' : 'Carapuce', 'HP' : 44, 'Attaque' : 48, 'Defense' : 65, 'Vitesse' : 43, 'Type' : ['Eau']}
pokemon2 = {'Nom' : 'Evoli', 'HP' : 55, 'Attaque' : 55, 'Defense' : 50, 'Vitesse' : 55, 'Type' : ['Normal']}
pokemon3 = {'Nom' : 'Salameche', 'HP' : 39, 'Attaque' : 52, 'Defense' : 43, 'Vitesse' : 65, 'Type' : ['Feu']}
pokemon4 = {'Nom' : 'Reptencil', 'HP' : 58, 'Attaque' : 64, 'Defense' : 58, 'Vitesse' : 80, 'Type' : ['Eau']}
liste_pokemon = [pokemon1, pokemon2, pokemon3, pokemon4]
pokemons_rapides = []
for pokemon in liste_pokemon:
    for cle, valeur in pokemon.items():
        if cle == 'Vitesse':
            if valeur > 60 :
                pokemons_rapides.append(pokemon['Nom'])
print(pokemons_rapides)
Solution 2

Correction possible sans utiliser la méthode items:

pokemon1 = {'Nom' : 'Carapuce', 'HP' : 44, 'Attaque' : 48, 'Defense' : 65, 'Vitesse' : 43, 'Type' : ['Eau']}
pokemon2 = {'Nom' : 'Evoli', 'HP' : 55, 'Attaque' : 55, 'Defense' : 50, 'Vitesse' : 55, 'Type' : ['Normal']}
pokemon3 = {'Nom' : 'Salameche', 'HP' : 39, 'Attaque' : 52, 'Defense' : 43, 'Vitesse' : 65, 'Type' : ['Feu']}
pokemon4 = {'Nom' : 'Reptencil', 'HP' : 58, 'Attaque' : 64, 'Defense' : 58, 'Vitesse' : 80, 'Type' : ['Eau']}
liste_pokemon = [pokemon1, pokemon2, pokemon3, pokemon4]
pokemons_rapides = []
for pokemon in liste_pokemon:
    if pokemon['Vitesse'] > 60:
        pokemons_rapides.append(pokemon['Nom'])
print(pokemons_rapides)
Solution 3

😀 : Solution beaucoup plus élégante avec une liste en compréhension :

pokemon1 = {'Nom' : 'Carapuce', 'HP' : 44, 'Attaque' : 48, 'Defense' : 65, 'Vitesse' : 43, 'Type' : ['Eau']}
pokemon2 = {'Nom' : 'Evoli', 'HP' : 55, 'Attaque' : 55, 'Defense' : 50, 'Vitesse' : 55, 'Type' : ['Normal']}
pokemon3 = {'Nom' : 'Salameche', 'HP' : 39, 'Attaque' : 52, 'Defense' : 43, 'Vitesse' : 65, 'Type' : ['Feu']}
pokemon4  ={'Nom' : 'Reptencil', 'HP' : 58, 'Attaque' : 64, 'Defense' : 58, 'Vitesse' : 80, 'Type' : ['Eau']}
liste_pokemon = [pokemon1, pokemon2, pokemon3, pokemon4]
pokemons_rapides = [pokemon["Nom"] for pokemon in liste_pokemon if pokemon["Vitesse"] > 60]
print(pokemons_rapides)

Exercice 12 : Eurovision

Exercice 13 : Dictionnaire enversé