Aller au contenu

Construction par compréhension

I. Premiers tableaux en compréhension⚓︎

Un tableau peut s'initialiser avec des éléments par défaut de plusieurs manières.

En voici deux :

🐍 Script Python
>>> tableau = [0, 0, 0, 0]
>>> tableau = [0] * 4  

Le langage Python permet une autre manière pour créer des tableaux : il s'agit de la construction par compréhension.

Cela permet de créer des tableaux que nous n'aurions pas su créer avec la méthode précédente. Par exemple, comment créer le tableaux contenant les 1000 premiers carrés : 1, 4, 9, 16, 25 etc ? Nous allons étudier comment procéder dans ce cours.

Le code suivant permet également de créer un tableau de 4 éléments initialisés à 0. C'est une création de tableau par compréhension. on dit aussi que le tableau est écrit en compréhension

🐍 Script Python
>>> tableau = [0 for i in range(4)]
>>> tableau
[0, 0, 0, 0]
De la même façon, la boucle suivante :
🐍 Script Python
tableau = [0]*4
for i in range(4):
    tableau[i] = i
peut s'écrire :
🐍 Script Python
tableau = [i for i in range(4)]

Question
🐍 Script Python
tableau = [i for i in range(5, 15)]
  • tableau = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
  • tableau = [i, i, i, i, i, i, i, i, i, i]
  • tableau = [0, 0, 0, 0, 0, 0, 0, 0, 0]
  • tableau = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
  • ❌ La valeur 15 est exclue.
  • ❌ i prend les valeurs de l'intervalle.
  • ❌ La valeur n'est pas contante.
  • ✅ i prend tour à tour les valeurs de 5 jusqu'à 14.
Question

Ecrire en compréhension la liste [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] qui contient 20 fois l'entier 5.

Puzzle

Question

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"
(Shift+Esc ; 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

.128013cPw- sSfbgnk]vei(hl,mdo0p5_2)=tay1/[ur050w0p0F0G0q0t0g0f0b0t0G0g0g0E010F0q0z010406050g0L0v0v0G0M0H040h0x0t0L0%0x0l050J0.0:0=0@0,0z040517101a0J170,0w0q0o0V0X0Z0#0X0l0k0L0G0k0p0e0z0H0F0s0~0f0s0q0k0s0t1C0s0F0*050Q0j0t0p1j0Y0!011B1D1F1D0F1L1N1J0F0M181x0V0`0g0z0G0l0#0C011P1l010i0S0p0l0G0v0p1J1+1-1=1R1^1N1{1}0*0a0f0c0M0x0z0x0g0q0}0l0f0O1)0M0M0p0b2i10200l180J1x2v1#1%1$1K0w221m0q0l1`2f1J1g1i0W1Q2F2H0l0x2L1J0z2o182t2v2Y0-1,2j2N1?2R0M0;0t1J0G1A2o0i0#030B0B0b2S0p1F2Q0x0e0A0e0I0*0I100G2Z2$0+2#212(1R2*2,2.2:0p2=012@2_2{2}2I300e1:040C36381-2v2V0p2v2L2y0w1%2D3d0#2`0O2K1h183A2X392s3R3K3B3b2j0q0w0#2^2t3r33182/3Y3!3n0O3p2R3%1;260p3,3U3/2 313(3w3W2E010l0*0b1`0F0g3S3y0f3 3I010x0*0E482u4a2t400)040K4h3Q3c1k1R0v0q340y0y4p4j2$400m0*0i0x0M4z4b4s0#42040m4I4k4c0x0d0*2G4P4B4c0l0j0*0M1-1s4p4J2O014m0r4)4Q4K014u4w4/4X4;4m0D0n4p0,113R4k3+013#2$3r3t053*3Z543-2|2G3q311:0f3?3^3o5f3:5h1J0J374*2)0*450q0p0M4750495t1R4e044g5B4i5D0#4m4o5I4q2%4;4M4O5O4A4r4+4D044F4H5U5K410*5T2Y5V5Q4+4S4U0 5$4:4+4Z4#4%0p4^5W1?4-5|5-1?4?04355O5%4m0u4W5}4t4v64652!5?5~0*4|4~4)0J3U3z2W103D100F3F6t2B2w0G1M3V0J3D4 0O0Q0S0g04.
Solution
🐍 Script Python
# un tableau cents en compréhension qui contient 10 entiers 100.
cents = [100 for k in range(10)]

# un tableau entiers en compréhension qui contient les 10 entiers entre 1 et 10 compris.
entiers = [k for k in range(1, 11)]

On peut aussi utiliser des chaînes de caractères :

Testez

Exécuter 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"
(Shift+Esc ; 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

Question

Ecrire en compréhension : ['NSI-1', 'NSI-2', 'NSI-3', 'NSI-4', 'NSI-5', 'NSI-6', 'NSI-7', 'NSI-8', 'NSI-9', 'NSI-10']

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; 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
mon_tab = ["NSI-"+ str(i) for i in range(1, 11)]
print(mon_tab)

Quelques exemples⚓︎

Question

Compléter ci dessous le script : Ecrire en compréhension lst3 qui donne la liste de la somme des éléments de [2, 3, 1, 5] et de [4, 1, 7, 0]. On doit obtenir : [6, 4, 8, 5]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; 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
lst1 = [2, 3, 1, 5]
lst2 = [4, 1, 7, 0]
lst3 = [lst1[p] + lst2[p] for p in range(len(lst1))]
print(lst3)
Question

Répondre sur papier.

Donner les listes lst1, lst2, lst4, lst6 et lst7

🐍 Script Python
lst1 = [3 for i in range(4)]
lst2 = [4 - i for i in range(3)]
lst3 = [1, 2, 3]
lst4 = [lst3[i]**2 for i in range(len(lst3))]
lst5 = ["a", "b", "c"]
lst6 = [lst5[i] * 2 for i in range(len(lst5))]
lst7 = [elem * 2 for elem in lst5]
Solution
🐍 Script Python
lst1 = [3, 3, 3, 3]
lst2 = [4, 3, 2]
lst4 = [1, 4, 9]
lst6 = ['aa', 'bb', 'cc']
lst7 = ['aa', 'bb', 'cc']

II. Utilisation plus élaborée des tableaux en compréhension⚓︎

Grâce à la construction par compréhension, il est possible d'appliquer un traitement (opération, fonction...) à chaque élément d'un tableau.

Testez

Exécuter 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"
(Shift+Esc ; 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

Question
🐍 Script Python
double = [i*2 for i in range(10)]
  • double = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • double = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
  • double = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  • double = [4, 8, 12, 16]
  • ❌ Un traitement est appliqué aux valeurs prises par i.
  • ❌ Le mauvais traitement est appliqué.
  • ✅ le tableau est composé du double de chaque valeur de l'intervalle [0,9]
  • ❌ Le tableau double doit contenir autant d'éléments que le tableau d'origine.
Question

Compléter pour obtenir la liste dizaines = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

Puzzle

III. Appliquer un filtre⚓︎

La construction par compréhension permet d'appliquer un filtre à une structure de données de départ, afin de ne garder que certains éléments. On utilise pour cela une condition précédée du mot-clé if.

On peut ainsi créer un tableau qui ne conserve que les nombres pairs d'un tableau initial.

🐍 Script Python
>>> tableau = [0, 1, 6, 5, 4, 11, 12, 23, 26]
>>> pairs = [p for p in tableau if p%2 == 0]
>>> pairs
[0, 6, 4, 12, 26]
Question
🐍 Script Python
tableau = [i for i in range(5, 15)]
nouveau_tableau = [j for j in tableau if j < 10]
  • nouveau_tableau = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
  • nouveau_tableau = [5, 6, 7, 8, 9]
  • nouveau_tableau = [9, 8, 7, 6, 5]
  • nouveau_tableau = [10, 11, 12, 13, 14]
  • ❌ La condition entraine la sélection de certaines valeurs.
  • ✅ on sélectionne tous les éléments du tableau inférieurs à 10.
  • ❌ Les éléments conservent l'ordre dans lequel il se trouvent dans le tableau initial.
  • ❌ La condition indique les éléments qui sont conservés.
Question

Créer en compréhension la liste des carrés des nombres de la liste nombresqui sont négatifs.

Puzzle

Question

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"
(Shift+Esc ; 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
# un tableau positifs en compréhension qui contient 
# les nombres réels positifs du tableau nombres
nombres = [1, 0, -2, 9, -5, 4, -7, 5, -8]
positifs = [k for k in nombres if k > 0]

# un tableau voyelle_phrase en compréhension qui ne contient que les voyelles 
# contenues dans la chaine de caractère phrase
phrase = "je ne suis pas sans voix !"
VOYELLES = "aeiouy"
voyelle_phrase = [caractere for caractere in phrase if caractere in VOYELLES]

IV. Les tableaux de tableaux⚓︎

Pour construire un tableau de tableaux de même longueurs, on peut utiliser des compréhensions imbriquées.

Dans les exemples qui suivent nous appelerons matrice notre tableau de tableaux.

🐍 Script Python
>>> matrice = [[k for k in range(4)] for j in range(3)]
>>> matrice
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

Pour bien visualiser le tableau matrice que nous venons de créer, nous pouvons l'écrire de la façon suivante :

🐍 Script Python
    matrice = [ [0, 1, 2, 3],
                [0, 1, 2, 3],
                [0, 1, 2, 3] ]         
👉 Chaque élément de matrice correspond donc à une "ligne".

On peut considérer que matrice a quatre "colonnes". Par exemple la première colonne (de rang 0) est [0, 0, 0], et la dernière est [3, 3, 3].

💡 Il est possible d'extraire une ligne de matrice.

🐍 Script Python
>>> ligne_0 = matrice[0]
>>> ligne_0
[0, 1, 2, 3]

💡 Il est possible d'extraire une colonne de matrice.

🐍 Script Python
>>> colonne_2 = [ligne[2] for ligne in matrice]
>>> colonne_2
[2, 2, 2]
QCM 1
🐍 Script Python
matrice = [[j for i in range(4)] for j in range(4)]
  • matrice = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
  • matrice = [[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]]
  • matrice = [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
  • matrice = [0, 1, 2, 3]
  • ❌ La valeur j est constante pour chaque ligne.
  • ✅ La valeur j prend la valeur 0 pour la première ligne, puis 1, etc.
  • ❌ La valeur j est constante pour chaque ligne.
  • ❌ Les constructions imbriquées engendrent un tableau de tableaux.
Puzzle 1

Créer en compréhension la matrice [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Puzzle

À vous de jouer 1

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"
(Shift+Esc ; 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
# un tableau matrice_carre_10 en compréhension, matrice 10x10
# dont chaque ligne contient les entiers de 1 à 10.
matrice_carre_10 = [[k for k in range(1, 11)] for j in range(10)]

# un tableau ligne_5 en compréhension qui contient la colonne 5 (située à l'indice 4)
# de la matrice matrice_carre_10
colonne_5 = [ligne[4] for ligne in matrice_carre_10]

# un tableau diagonale en compréhension qui contient les éléments situés 
# à la 1ère colonne de la 1ère ligne,
# à la 2ème colonne de la 2ème ligne ... de la matrice carrée matrice_carre_10
diagonale = [matrice_carre_10[i][i] for i in range(len(matrice_carre_10))]
À vous de jouer 2

Compléter la fonction donne_colonne qui prend en paramètres une matrice matrice, un entier colonne et renvoie la liste des éléments de la colonne colonne.

Nous avons déjà réalisé cet exercice dans le chapitre : listes de listes. Vous devez ici absolument utiliser une liste en compréhension.

Par exemple :

🐍 Console Python
>>> m = [[1, 3, 4],
    [5, 6, 8],
    [2, 1, 3],
    [7, 8, 15]]
>>> donne_colonne(m, 0)
[1, 5, 2, 7]
>>> donne_colonne(m, 2)
[4, 8, 3, 15]
>>> 

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

.128013cPw- sSfEbgn3ké]vei;(h4l,mdoqp65_:2)=tay1/[ur050B0s0M0N0t0y0g0f0b0y0N0g0g0L010M0t0E010406050g0S0A0A0N0T0O040h0C0y0S0.0C0m050Q0^0`0|0~0?0E04051e171h0Q1e0?0B0t0r0$0(0*0,0(0m0l0S0N0l0s0e0E0O0M0w150f0w0t0l0w0y1J0w0M0;050X0k0y0s1q0)0+011I1K1M1K0M1S1U1Q0M0T1f1E0$110g0E0N0m0,0J011W1s010i0Z0s0m0N0A0s1Q1=1@1|1Y1 1U22240;0a0f0c0T0C0E0C0g0t140m0f0V1:0T0T0s0b2p17270m1f0Q1E2C1,1.1-1R0B291t0t0m212m1Q1n1p0%1X2M2O0m0C2S1Q0E2v1f2A2C2)0@1?2q2U1}2Y0T0{0y1Q0N1H2v0i0,030H0H0b2Z0s1M2X0C0e0J0J0e0P0;0P170N2*2-0=2,282/1Y2;2?2^2`0s2|012~3032342P37391`040J3e3g1@3i2A2L013n0N2@1f2_0w2{2}2 310V3x2Y3z0e0n0;0n3E2z3h0?3I3l0,3L3N053P3R3t3T3w2N3y380e0x0;0x3%183)3j2.1r3m0C2=3M3p3Q3r3S3v3V3_3X3{0G0;0G402)3*2-3J3.4a3=3u3U334g363{0F0;0F4m3h1i2%172S2F0B1.2K3,014v2R1o1f2$0s2(4E413G054v4V280t0B0,2 2A3Y3b3O0f4%4)4e4w354,1{2d0s4;4v3W4y394-3%3+450,0o0;0V0i3(3G0f434q0i57152O3v0y5h0s5a2B5d4N0:040v5n4#442V3K0;0{1,0t0b5m4X5o535x5r0z5u5c5H2:0;0m5j5l5u5p54015r0K5L5U5x0C0;0e020l0M0u5Z5N3m0k0;1M0g0M5-4p5q0;0I5u0?5F5v4/4(014*2-3Y3B3:614|3^4@3{1`0f4`6a4f6c3A1Q0Q3f5!1}0d0;0f6s5c5 6o1Y0g0B0;020D0S0C5+6B6D6F6C6E5,5 5~2+3I4:630H4+3{3!4.6Q3@6i3`393!6f234{6R4}4x3Y6V525_5V6y6r6t0j0m1,0p1V0I0f5A0T5C6|0f0S2O0f5=0M1V2s770s0g0z732q210.0s0T6f5R0m751U6f0_0p2j2r1V0(1:5k7n5E4n5T6P62641@3Y3}6W7E4=4~7H4_6(6h4?6!3|6l6n5.0,6=046t0f100T7i0f6}317y756}747v0t5?79150M767c0f0p0y0p246_0#0g7@7_0#7|7~7h0#7a2_7+5l7q0A7s0C7l8c7z5}7C4p6X6S654i3p8o6+6j0e4j6%247Q7M8r2C7V6:5x7Y7!6G6K8J6I6H6L7B6v7D4;6T394A7J8A6,4z7O8z6*6b7S8V3E7!6w550;2v0M0S0T165 5M8F1}5r0R8m3k5V0m5;1J2O8}5w8`0;8|8Q8_3m5P7m93998~5I0;0q5^9g1}56040i479k959b041$9e2)8^9l1Y0C6q042N9r4q5z0N5B5D943J5r9j6M5T0Q4!4F4U4H4R170M4K9X2I2D0N1T9U0Q4I5~0V0X0Z0g04.
À vous de jouer 3

Compléter le script ci-dessous :

👉 Vous pouvez tester les ### en haut à droite de la fenêtre.

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

.128013.128073.128161csSbg9vi(,d0A6_=t1u5rPw-7 fE.ên8xOkRé;e]h4lmqop:à2)ay/[3050n0P0t0$0k0T0e0C0d0T0$0e0e0s010t0k0X010406050e0v0U0U0$0x0%040f0W0T0v0~0W0H0C020$0U0X0O0C0M0P180x0V0v0P0e050(1517191b130X04051G1z1J0(1G130n0k0j0?0^0`0|0^0H0h0v0$0h0P0A0X0%0t0R1i0C0R0k0h0R0T1/0R0t11050.0g0T0P1S0_0{011.1:1=1:0t1{1}1_0t0x1H1*0?1e0e0X0$0H0|0!011 1U010D0:0P0H1m0P1_2h2j2o212r1}2u0U2w040a0C0y0x0W0X0W0e0k1h1j0,2f0x0x0P0d2R1z2y0H1H0(1*2%2b2d2c1`0n2A1V0k0H2t2O1_1P1R0@202;2?0H0W2`1_0X2W1H2#2%37142i1j2|2p300x180T1_0$1-2W0D0|030r0r0d310P1=2 0W0A0!0*0A0u110C0u1z0$383b123a2z3d213f3h3j3l0P3n013p3r3t3v2@3y3A2m040C0!3G3I2j3K2#2:013P0$3i1H3k0R3m3o3q3s0,3Z303#0A0*3D0*3+2!3J133/3N0|3=3@053_3{3V3}3Y2=3!3z0A0S3D0S471A493L3c1T3O0W3g3?3R3`3T3|3X3 4m414o0w3D0w4t374a3b3:4e4D4i3W3~3u4J3x4o0q3D0q4P4v4b4y4d4A3Q3^3S3U4X4l3w420B3D0B4*3-4R3M4-3;4/4C4;4E4?4k4I4_4o0I3D0I4~2$504x2}534B4f4h4F4j4H4Z5b3A0i3D0i5g3.4S4c5l4:4g4=4G4Y404#3A0u0o115L5y5i4T545n5F5q5H4!420u3C045Z5P4w5R5m4V5p4@5a4n5K3%0u3*0(3H484 5(5B4U564W595s5/3B445#465@3,5h5{525}5E575G4^620u4q5#4s675_694,5k6c5o585r5I5Y4M5#4O6m4u3-1K351z2`2*0n2d2/5B4Y2_1Q1H340P363J6n1H4Y6S2z0k0n0|3q2#5Y3R6Z6#6u5X4o3C0C2E0P6+5W5t3B1_6m6p2p0L110,0D6U0C6a6q0D111#0t0r1P1!0r5?396|2110040l6U743e110;0t7l7g0|7i0#727m210W110A020h0t0O7w7s3;0g7o0k0e7q6B2$737H7i0Y6U137O6X1j6*016$3b423%5E7Z606v4o2m6:2v6?6g4K3$6`5^7H0z3D0C7}7r5A520e0n11021v0W7E850v870O898b7U7 6Y6!7!0r6%4o647)8i7+6-3A447/2F7;5.7?437^7X3:827|7}0E0H2b0N1~0Y0C7p0C8L0v2?8M7L0t1~2T1=7M1x0C2T0U0G2F0=0T1i1Y0P0v0x1y7W7V7f4S7*8k7$4o6j8o8w618y4q8u6=8j6@628|6{805k8D3(7}0C1d0x0~8K8!0k7c0!8O0C8Q1~8X8U8!1i0t8M8Z0N0T0N2F8H0=0e9u9w0=9y9A2t0t0=8W3k0!1s8V9k0h1i3?1~8f7W5(8^8l3A6x8}947=5J0A4M928~7,9$8A7x0|9b9d0C0l0n02030*0i0O2t1-0$1g7}0n2L2Q1~0Z0Ca20g0_0Cab0ha40d0R0P7v8;8g7Y8p8_2j424%4;8^958y4%9.9)8x9+av477H9^9d7C887D8caM0C0U0C0s0C0)aT0u0m0C0*aX0S0Q0m9X8?8h6+9#0A4{awaray9+4{aB8q6^a.aG992paI9_a 9d0)0w0C0m0qb40Ia$a(6T3/9!8`3A5da/9/8r0A5da@6,6^bga{519a839cb0b00)0!aXaWaY0Q0C0Qba6Cbcara,5vbhaC8 9+5vbma;42bKbq5ja}bt9_aKaNaL7E0C787a9S7d0l0Uan4Qap0Cbdat6.5MbLa^6h5MbQ9*5Yb^bU8CbXb10SaX0qaX0!bEao9YbHa+be3B5!9(b`8y5Z2n6;bi6^cl2%3H8=bb8@bIcf5=6)a:b~6.7.cnbM9:3B7(98brbW8E1k8688cO8ccQbF2$9Zcwb?5K8n3kaxcBcYcm7:cFbj0u8n67ctbGcvcecX3B8|c!cAaD5Y91cEcj9+6i8A9_9?3;112=1P0d0P0r180J7Ga|7y110sdecK3O7J042Db:5B7i7kccdf4d7o7Mdp527udjbVdg040AdB3:0U0k5NcT8Bb=0H6wczco6h9-c~bndSd29dd46~042W0t8.0HdGdq110)dy6qdw7Na)dC7td,d.7n040kd_7h110Qd-dtdkdvd{0Hd8dadcd}0|7zdEead5d{ee7ica377Qdu01d!0D4Ad*6bd6er5k0W7{e5eu3edm0x2j1#eh11dsd=4Tdmdoe2d?01dree0Hd:eF040#0#ej4v9Y0(6W6D6R6F6O1z0t6Ie*2-2(0$1|e%0(6G1F8B5B2W0U0r0D0$0Lda0R641r1t1v8Z7TeZ1N1I040c0C0K1j0X8-9va40`0k9o0~8X0P0x9w0Ce~2Q0Cf6fs0,0x0H0kfq0C9I9B9v0n009p8S8Yac7M8!00d70kd90C3BaX0T000$0j2jfHfqfBfDfIfRfT3yac0t0d0F1K3K1G0b0C0p1g2W0C0x0N2N0H0e1~2Nfle;9nf=1O1Q3:1W1Y1!1$1(1*1,231;1?1^e_522C2t2v112I0f0d0x0 9v0y1)1+d)9Y6Q7X686V3tdMcWdO0!0S6_b_dV4KgN6/dUbRgM6_5U5-bN3ygS9=7Hd!70ez3O7604b(7b0h7deTeHcue3ef7peTb.3Jelg_ec7BaMg+4deK8Th4eO11f8b/eMb;gKg#3ydQc*5bgNcDc)c hg7.6e5VcBhlg%emexd3hd5B9b8dcP8ahD8ecbeIdNhgcZhedRgR8zb}c{gW8thrgZ7,gNc-7_ema~0C8G8I9i8N8P8R9r8V9q8T8Z8#8%8Z8*1X1w8.0ef;hHg^aqc=gLgNc^hMhj4ni3c(8vi6hO91hUhogW97hZg_h#9f9h9ng:7d9nfKh-9t8H9GfE9zfG9D9F1}9Hix9K9M9q9O9Q9j1!9U1}73h~c:a*8j8lgN9%c_hN4#iTi993ifiYgYi#9,hvijc37}9{9}9 a11j0Ra49v8!a89sabadafahajalg}5`hdhJgWaFiVibiX0AaAgUhtjb2niegQjaaFcJeNh#bZjoaOaQaSaU0)bAaZ0Ca#a%iOcUcdiR8`gNa`j8i(a?jdhRjFjg5 jihga`jlc2cMbvb1b3b5b7b9jAgJi1hgbpjHjPgWbljKg!j,jN5,i(bpjShAi,jVb1by3EaX0*bCeXj3hIhfgWbTj*gVgNbPj.hW0AbPjhk9kei*jmj`jpb#1pg/b*0!b,j269j4k5gSc0k8je5LiZiWhgkBi%j+kxkjjTbuaTc50Cc73)k2kuk4j%gWcqcikHcgkCj9kE6/kgkAchc.b:j5gS7(kzjLcHk!i(cykGkhcycrgnbscMhCcRhEl1hGhckTjDb?gShLc#k;c,k?kYldk_kAhY3KkvkUgSi4lbj/lnlek`idjOltdX7~g(11d$d(h87ie1eI5|eShzdzd^lJd/eglM2peilFh 3:h1eedIdKlPdDdFlZe4d|l$h904kR3(dZ11ep0xh8eRlOekd4ewd6gCl^7H0HeBeD0Pg?eQeK2tm3l)l?g{l)7ueWdL1ze#1M6Ee?6O7V0,0.0:0e04.
Solution
🐍 Script Python
def get_diag_2(lst) -> list :
"""
Entrée : lst : une liste de listes de mêmes longueurs
Sortie : diag_2 : une liste dont les éléments sont les éléments de 
la 2eme diagonale (de en bas à gauche à en haut  droite)
>>> m = [ [1, 3, 4],
        [5 ,6 ,8],
        [2, 1, 3] ]
>>> get_diag_2(m)
[4, 6, 2]

"""

indice_max = len(lst) - 1
return [lst[i][indice_max-i] for i in range(len(lst))]

V. Exercices⚓︎

1. Exercices variés⚓︎

Nombres pairs

Ecrire en compréhension le liste des cinq premiers entiers pairs.

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
>>> mon_tab = [2 * p for p in range(5)]

Vérifier avec :

>>> mon_tab 
À vous de jouer 1 : Table de multiplication

Ecrire La liste des entiers de la table de multiplication de 9 : [9, 18, ..., 90]

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
>>> tab_9 = [9*i for i in range(1, 11)]

Vérifier avec :

>>> tab_9 
À vous de jouer 2 : les puissances de 2

Ecrire en compréhension la liste suivante des tuples donnant les puissances de 2 :
[(0, 1), (1, 2), (2, 4), (3, 8), (4, 16), (5, 32), (6, 64), (7, 128)]

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
>>> mon_tab = [(p, 2**p) for p in range(8)]

Vérifier avec :

>>> mon_tab 
Une liste dans une liste en compréhension

Tester :

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

Des filtres

Tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; 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 de jouer 3

Ecrire la liste des entiers inférieurs à 100 qui sont à la fois multiples de 3 et de 5.

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
>>> reponse = [i for i in range(100) if i % 3 == 0 and i % 5 == 0]

Vérifier avec :

>>> reponse 
À vous de jouer 4

On donne une liste de coordonnées de points : points. Compléter le script pour afficher la liste des coordonnées des points se trouvant sur la droite d'équation \(y=2x+1\)

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

.128013cPw*- sSfbgn3k+]veih4lmdo0p_2=tay1/[ur050y0s0F0G0t0w0h0g0b0w0G0h0h0E010F0t0B010406050h0L0x0x0G0M0H040i0z0w0L0%0z0m050J0.0:0=0@0,0B040517101a0J170,0y0t0r0V0X0Z0#0X0m0l0L0G0l0s0f0B0H0F0u0~0g0u0t0l0u0w1C0u0F0*050Q0k0w0s1j0Y0!011B1D1F1D0F1L1N1J0F0M181x0V0`0h0B0G0m0#0D011P1l010j0S0s0m0G0x0s1J1+1-1=1R1^1N1{1}0*0a0g0c0M0z0B0z0h0t0}0m0g0O1)0M0M0s0b2i10200m180J1x2v1#1%1$1K0y221m0t0m1`2f1J1g1i0W1Q2F2H0m0z2L1J0B2o182t2v2Y0-1,2j2N1?2R0M0;0w1J0G1A2o0j0#030C0C0b2S0s1F2Q0z0f0n0v0f0I0*0I100G2Z2$2v2V0s2v2L2y0y1%2D2(1R2`0O2K1h183c2X3a2s3t3m3d2#210t0y0#2^2t303234182/3A3C2_2{2}2I3F331;260s3L3w3O2R3Q3H373s213k0#0m0*2e2G0F0h0C0.0M0C0y2c2h0s3u1-040g3y2%1k1R0z0*0E3{2u3~2t2E010)040K463$402O013*042|0s0x4f482$4a0o0*0j0z0M4p3 4a4k4m4o113a4q3%410#0z0d0*2G4y493(4j3+0z3-0h4O4r4Q4t040t0j4W4H4i0x0t0*0D4%4h1?43040e4.4A0*4C4f4z4Q4c4e4E3|4|4I014*0*0A4{4P534c0q4@4Q4;0p5d535504365047524i4;0E455m3}5o2)4_1N4D2!594i4~584X5i4+5k5E4(1?5b5c5t0,5t103w3b2W103f100F3h5X2B2w0G1M3x0J3f5P0O0Q0S0h04.
À vous de jouer 5

On donne une liste d'élèves d'un groupe : lst_eleves. Compléter le script pour écrire une liste en compréhension qui contient la liste des élèves dont le nom commence par A ou B.

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

.128013cPw- sSfbBgn3k]vei;(hlmdo0qpA5_2)=tay1/[ur050y0r0J0K0s0w0g0f0b0w0K0g0g0I010J0s0C010406050g0P0x0x0K0Q0L040h0z0w0P0+0z0m050N0=0@0_0{0:0C04051b141e0N1b0:0y0s0q0Z0#0%0)0#0m0l0P0K0l0r0e0C0L0J0v120f0v0s0l0v0w1G0v0J0.050U0j0w0r1n0$0(011F1H1J1H0J1P1R1N0J0Q1c1B0Z0~0g0C0K0m0)0G011T1p010i0W0r0m0K0x0r1N1/1;1_1V1|1R1 210.0a0f0c0Q0z0C0z0g0s110m0f0S1-0Q0Q0r0b2m14240m1c0N1B2z1)1+1*1O0y261q0s0m1~2j1N1k1m0!1U2J2L0m0z2P1N0C2s1c2x2z2$0;1:2n2R1`2V0Q0^0w1N0K1E2s0i0)030F0F0b2W0r1J2U0z0e0n0E0e0M0.0M140K2%2*2z2Z0r2z2P2C0y1+2H2,1V2~0S2O1l1c3g2#3e2w3x3q3h2)250s0y0)2|2x3436381c2?3E3G2}2 312M3J371^2a0r3P3A3S2V3U3L3b3w253o0)0m0.300r0q0r0g0F0D0F0k3y1;040f0f3C2+1o1V0z0.0I3|2y402x2I010-040O483*422S013.043g2V0x4h4a2*4c0o0.0i0z0Q4r414c4m4o0z4q153e4s3+430)0z0d0.2K4A4b3,4l3/1R3=0g4R4t4T4v040s0i4Z4K4k4e0u4h4B4T4D2s4p4/4S4L4d0.4g4H3}4:4`0x0s0.0A4^4!4`4e0p4*4j1`45040I474~49504k0g1@04020B0P0z0J0t0D5p5r5t5b4c4N0.4y5z4;0.4E4G2(4_4,4|564+1`52545N5c1V595E4`5e5g5W5l5n5w5s0t0k5%5y5i4i4c4e0H5a5-0:5-143A3f2!143j140J3l5 2F2A0K1Q3B0N3j5@0S0U0W0g04.
À vous de jouer 6

On donne une liste de séquences ADN. Ecrire une liste extraite de la précédente, avec seulement les séquances contenant "AAT"

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

.128013cPw- sSfbgn3Tk]vei;hlmdoqpA6_2=tay1/[ur050x0r0G0H0s0v0g0f0b0v0H0g0g0F010G0s0A010406050g0M0w0w0H0N0I040h0y0v0M0(0y0l050K0/0;0?0^0-0A040518111b0K180-0x0s0q0W0Y0!0$0Y0l0k0M0H0k0r0e0A0I0G0u0 0f0u0s0k0u0v1D0u0G0+050R0j0v0r1k0Z0#011C1E1G1E0G1M1O1K0G0N191y0W0{0g0A0H0l0$0E011Q1m010i0T0r0l0H0w0r1K1,1.1?1S1_1O1|1~0+0a0f0c0N0y0A0y0g0s0~0l0f0P1*0N0N0r0b2j11210l190K1y2w1$1(1%1L0x231n0s0l1{2g1K1h1j0X1R2G2I0l0y2M1K0A2p192u2w2Z0.1-2k2O1@2S0N0=0v1K0H1B2p0i0$030D0D0b2T0r1G2R0y0e0m0C0e0J0+0J110H2!2%2w2W0r2w2M2z0x1(2E2)1S2{0P2L1i193d2Y3b2t3u3n3e2$220s0x0$2_2u313335192:3B3D2`2|2~2J3G341=270r3M3x3P2S3R3I383t223l0$0l0+0g0r0z0D0H0x0l0D0B0B0n3v1.040f0f3z2(1l1S0y0+0F3{2v3 2u2F010*040L473%412P013+042}0r1~0l0G4g492%4b0o0+0i0y0N4s404b4l4n4p4r123b4t3(420$0y0d0+2H4B4a3)4k3,3.3:3=4S4u4U4w040s0i4!4L4j0g1;04020z0M0y0G0t3^0n4;4?4^4+4i1@4O4Q104I3|4K501S4E1O4G4g4C4U4d0p4g0-552v113x3c2X113g110G3i5s2C2x0H1N3y0K3g5j0P0R0T0g04.
À vous de jouer 7 : simuler un jeu

💡 Encore plus fort : utilisation du booléen.

1. Tester ci-dessous :

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

À quoi sert ma_liste_2 ?

Solution

Cette liste permet de simuler 20 lancers de dés, et de noter pour chacun True ou False suivant que le dé est tombé sur 6 ou non.

2. On va simuler le jeu suivant :
On tire au hasard un numéro parmi 1, 2, 3, 4, 5, 6, 7, 8, 9 et 10.
Si le numéro obtenu est strictement inférieur à 7 (parmi 1, 2, 3, 4, 5, 6), on gagne un bonbon. Sinon, on perd.
On veut créer la liste parties de 50 résultats obtenus, si l'on joue 50 fois.
On obtient le booléen True lorsque l'on gagne, et le booléen False lorsque l'on perd. La liste parties est donc composée de ces 50 booléens.
A-t-on plus de chance de gagner ou de perdre ?
Compléter ci-dessous pour qu'il s'affiche le nombre de True et le nombre de False de la liste.
Exécuter votre code plusieurs fois pour observer les résultats obtenus.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; 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
parties = [randint(1, 10) < 7 for i in range(50)]
print(parties)
nbre_T = 0
nbre_F = 0
for elt in parties:
    if elt == True:
        nbre_T = nbre_T + 1
    else:
        nbre_F = nbre_F + 1
print("nombre de True : ", nbre_T)
print("nombre de False : ", nbre_F)

3. Dans la question 2. nous avons simulé 50 parties. Nous voulons maintenant pouvoir simuler un nombre quelconque de parties.
Compléter la fonction simulation qui prend en paramètre un entier n et renvoie un tuple dont le premier élément est le nombre de True et le second le nombre de False obtenus pour n parties. Il ne faut pas faire afficher les listes obtenues.
Compléter également le script pour qu'il s'affiche le nombre de True et de False respectivement pour 100 puis 1000 parties.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; 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
def simulation(n):
    """
    n est le nombre de parties que l'on va simuler
    """
    parties = [randint(1, 10) < 7 for i in range(n)]
    nbre_T = 0
    nbre_F = 0
    for elt in parties:
        if elt == True:
            nbre_T = nbre_T + 1
        else:
            nbre_F = nbre_F + 1
    return (nbre_T, nbre_F)

(nbre_T_100, nbre_F_100) = simulation(100)
(nbre_T_1000, nbre_F_1000) = simulation(1000)
print("Pour 100 parties -> nombre de True : ", nbre_T_100, " - nombre de False : ", nbre_F_100)
print("Pour 1000 parties -> nombre de True : ", nbre_T_1000, " - nombre de False : ", nbre_F_1000)

4. Plus on prend des échantillons de grande taille, plus les effectifs obtenus se rapprochent de ceux calculés avec des probabilités théoriques :
ici 60% de True et 40% de False .
Vous pouvez tester avec 10 parties (😢trop petit) ou 1000000 de parties (🤣déjà grand!)

Tester ici

La fonction simulation n'a pas été écrite, car elle est dans du code caché.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; 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 de jouer 8 : réaliser des graphiques avec matplotlib

La bibliothèque matplotlib fonctionne avec des listes d'abscisses et d'ordonnées (qui doivent être de même tailles)

1. Tester ci-dessous pour comprendre les syntaxes:

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

Votre figure

Votre tracé sera ici

2. Compléter ci-dessous pour tracer la droite d'équation \(y=2x+1\) pour \(-2 \leq x \leq 3\)
Toutes es listes doivent être écrites en compréhension.

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

Votre figure

Votre tracé sera ici

Solution
abscisses = [i for i in range(-2, 4)]
ordonnees = [2*x + 1 for x in abscisses]

2. "π à Monte-Carlo"⚓︎

Sujet - π à Monte-Carlo

La méthode de Monte-Carlo est un ensemble de méthodes algorithmiques visant à déterminer la valeur approchée d'une constante en utilisant des procédés aléatoires.

On peut utiliser cette méthode afin de déterminer une valeur approchée de \(\pi\). L'idée est la suivante :

  • on considère un carré de \(2\) unités de côtés. Son aire vaut donc \(4\) ;
  • on considère un disque de rayon \(1\) centré au centre du carré. Son aire vaut donc \(\pi \times 1^2=\pi\) ;
  • on génère un grand nombre de points aléatoires répartis de façon uniforme dans le carré.

Il reste alors à compter le nombre de points à l'intérieur du disque. On peut montrer que leur fréquence tend vers \(\frac{\pi}{4}\) quand le nombre de points aléatoires devient très grand.

Une valeur approchée de \(\pi\) est donc :

\[\pi \approx 4 \times \frac{\text{nombre de points dans le disque}}{\text{nombre de points dans le carré}}\]

On observe ci-dessous le carré de départ ainsi que de nombreux points. On a représenté de couleur différente ceux qui sont dans le cercle et ceux qui n'y sont pas.

Méthode de Monte-Carlo

On se donne donc :

  • une liste de nb_points aléatoires, tous dans le carré décrit ci-dessus. Cette liste est nommée points et chaque point est représenté par ses coordonnées. Par exemple [(-0.5313, 0.0936), (0.9638, 0.3577), ...].

  • une fonction distance_origine prenant en argument les coordonnées x et y d'un point et renvoyant sa distance à l'origine du repère (et donc au centre du cercle)

On demande d'extraire la liste des points situés dans le cercle à l'aide d'une liste en compréhension.

La fonction random

Le module random de Python propose une fonction random qui génère des nombres aléatoires uniformément répartis entre 0 et 1.

👉 On a donc 2 * random() qui est compris entre 0 et 2

👉 On en déduit que 2 * random() - 1 est compris entre -1 et 1.

À 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"
(Shift+Esc ; 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

Pour ne pas surcharger le site, nous avons choisi ici nb_points = 1000. Chez vous, sur votre prpre éditeur Python, vous pouvez tester avec nb_points = 100_000, pour obtenir une meilleure précision.

🐍 Script Python
from math import sqrt
from random import random

def distance_origine(x, y):
    return sqrt(x*x + y*y)

nb_points = 1000
points = [(2 * random() - 1, 2 * random() - 1) for _ in range(nb_points)]
dans_cercle = [p for p in points if distance_origine(p[0], p[1]) <= 1]

# Affiche une valeur approchée de pi
approximation = 4 * len(dans_cercle) / nb_points
print("Pi est environ égal à : ", approximation)

VI Crédits⚓︎

Jean-Louis Thirot, Pierre Marquestaut, Nicolas Revéret et Mireille Coilhac