Différences entre versions de « 100daysofcode/R2 »
De Mi caja de notas
< 100daysofcode
(→R2D2) |
|||
(54 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | 2ème défi [[100daysofcode]] | + | 2ème défi du[[100daysofcode]] démarré le lundi [[2018-246|3 septembre 2018]]. |
− | |||
− | |||
− | 1. [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/courseware/c77f2cc9fb2a42589f0d723e8fefbd35/a073ff660d7747eea52200aa737feb57/ Param + config Python] + Spyder | + | ## Objectifs |
+ | |||
+ | - '''coder 1 heure par jour''' pendant 100 jours. | ||
+ | - assimiler quelques fondamentaux de programmation Python | ||
+ | - tout en poursuivant quelques routines d'exploration indieweb | ||
+ | |||
+ | Un "marathon Python" où je tenterai de documenter ma progression sous forme de log chronodaté (sous la forme R2DX, X étant le numéro du jour). Premiers pas démarrés avec joie avec quelques exercices de logique accessibles aux enfants - lecture en cours de "Python pour les Kids"- Impatient de compléter les premières foulées avec le [https://www.fun-mooc.fr/courses/course-v1:UCA+107001+session02/about MOOC de Fun UNCA] le 17 septembre prochain. -- <span class="h-card" style="white-space:nowrap">{{sparkline|http://ducamp.me/images/d/d3/Portrait-xtof.png}} [[User:Christopheducamp.com|xtof]]</span> 7 septembre 2018 à 11:25 (UTC) | ||
+ | |||
+ | == Supports == | ||
+ | |||
+ | Quelques [[MOOC]]s et ressources en ressources à compléter en-dessous | ||
+ | |||
+ | === MIT Edx === | ||
+ | |||
+ | * MIT : Introduction to Computer Science and Programming Using Python | ||
+ | * Critique du cours Edx [https://medium.com/@seismatica/mit-6-00-1x-review-ef4f3561e114 MIT 6.00.1.x review] - 2017-10-21 | ||
+ | * Livre du cours "Introduction to Computation and Programming Using Python - Guttag" [[:File:Intro-Computation-Programming-using-Python.pdf]] | ||
+ | |||
+ | 1. [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/courseware/c77f2cc9fb2a42589f0d723e8fefbd35/a073ff660d7747eea52200aa737feb57/ Param + config Python] + Spyder (Environnement de dév) | ||
1. Semaine 1 : [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/course/#block-v1:MITx+6.00.1x+2T2018+type@chapter+block@fc8f42302c644118adfcfa720f9f403e Fondamentaux Python] | 1. Semaine 1 : [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/course/#block-v1:MITx+6.00.1x+2T2018+type@chapter+block@fc8f42302c644118adfcfa720f9f403e Fondamentaux Python] | ||
1. Support Slides Partie 1 et 2 : [[:File:lec1.pdf]] + [[:File:lec2_branch_loops.pdf]] | 1. Support Slides Partie 1 et 2 : [[:File:lec1.pdf]] + [[:File:lec2_branch_loops.pdf]] | ||
+ | |||
+ | === UCA Fun-mooc === | ||
+ | ''inscrit'' | ||
+ | |||
+ | * Python 3 : des fondamentaux aux concepts avancés du langage - démarrage 17 sept 2018 https://www.fun-mooc.fr/courses/course-v1:UCA+107001+session02/about (recommandé par jaxom kaplan https://mamot.fr/@jaxom_kaplan/100672842299195451) | ||
+ | |||
+ | === OpenClassroom === | ||
+ | |||
+ | * Cours en français chez OpenClassroom (inscrit mais non démarré) [https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python Apprenez à Programmer en Python]. | ||
+ | |||
+ | |||
+ | == Env de dev (IDE) == | ||
+ | |||
+ | à raffiner. essai en cours du navigateur Anaconda + Spyder | ||
+ | |||
+ | 1. [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/courseware/c77f2cc9fb2a42589f0d723e8fefbd35/a073ff660d7747eea52200aa737feb57/ Paramétrage + config Python] + Spyder (Environnement de dév) | ||
+ | 2. tutoriel de Sonnie (ligne de commande) : https://sonniesedge.co.uk/posts/data-science-tools | ||
+ | |||
+ | |||
+ | === Slides et ouvrages === | ||
+ | |||
+ | 1. Semaine 1 MIT : [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/course/#block-v1:MITx+6.00.1x+2T2018+type@chapter+block@fc8f42302c644118adfcfa720f9f403e Fondamentaux Python] | ||
+ | 11. Support Slides Partie 1 et 2 : [[:File:lec1.pdf]] + [[:File:lec2_branch_loops.pdf]] | ||
+ | 1. [[:File:Python Data Science Handbook.pdf|Python Data Science Handbook]] | ||
+ | 1. [[:File:Python pour les kids Eyrolles.pdf|Python pour les kids]] & [[:File:Python_r9_complement-ebook.pdf|caract.spéciaux]] | ||
+ | |||
+ | === Raccourcis-clavier === | ||
+ | ''à tester et compléter''. | ||
+ | |||
+ | L'usage des flèches gauche et droite pour avancer et reculer peut être complété par ces raccourcis | ||
+ | |||
+ | * Ctrl + a renvoie le curseur en début de ligne | ||
+ | * Ctrl + e renvoie le curseur en fin de ligne | ||
+ | * Ctrl + b recule le curseur d'un caractère | ||
+ | * Ctrl + f avance le curseur d'un caractère | ||
+ | |||
+ | |||
+ | * Ctrl + d efface le caractère suivant dans la ligne | ||
+ | * Ctrl + k coupe le texte en partant du curseur jusqu'à la fin de la ligne | ||
+ | * Ctrl + u | ||
+ | * Ctrl + y | ||
+ | * Ctrl + t | ||
+ | * Ctrl + | ||
+ | * Ctrl + I nettoie l'écran du terminal | ||
+ | |||
+ | == R2D1 == | ||
Conditionnelle imbriquée : | Conditionnelle imbriquée : | ||
Ligne 35 : | Ligne 97 : | ||
== R2D2 == | == R2D2 == | ||
+ | |||
[[2018-247]] | [[2018-247]] | ||
− | |||
− | |||
− | |||
− | === | + | === Config python sur navigateur anaconda === |
* Mise à jour ''en cours'' de Spyder 3.2.8 vers la 3.3.1 | * Mise à jour ''en cours'' de Spyder 3.2.8 vers la 3.3.1 | ||
Ligne 51 : | Ligne 111 : | ||
Note : mise à jour faite directement dans le navigateur Anaconda | Note : mise à jour faite directement dans le navigateur Anaconda | ||
− | |||
=== cours 2 === | === cours 2 === | ||
Ligne 62 : | Ligne 121 : | ||
* Control Flow | * Control Flow | ||
* Iteration | * Iteration | ||
− | * | + | |
+ | == R2D3 == | ||
+ | [[2018-248]] | ||
+ | |||
+ | '''... Suite Python comparaison avec exercice de comparaison de variables. Révision sur la [[wikibooks:Programmation_Python/Opérateurs#Priorité_des_opérations|priorité des opérateurs Python]]''' | ||
+ | |||
+ | === Exercice vara varb === | ||
+ | |||
+ | * [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/courseware/fc8f42302c644118adfcfa720f9f403e/35f82f6c3ecb4e9e913dc279a9b73a9f/11?activate_block_id=block-v1%3AMITx%2B6.00.1x%2B2T2018%2Btype%40vertical%2Bblock%40e3096921cf7949ce92e6756306bd877b source] | ||
+ | |||
+ | Supposons que deux variables, `varA` and `varB`, soient deux valeurs déclarées, que ce soit des nombres ou des chaînes. | ||
+ | |||
+ | Écrire un bout de code Python qui évalue `varA` et `varB`, et affiche ensuite l'un des messages suivants : | ||
+ | |||
+ | |||
+ | * `"string involved"` si l'une des `varA` ou `varB` sont des chaînes | ||
+ | * `"bigger"` si `varA` est plus grand que `varB` | ||
+ | * `"equal"` si `varA` est égal à `varB` | ||
+ | * `"smaller"` si `varA` est plus petit que `varB` | ||
+ | |||
+ | <html> | ||
+ | <script src="https://gist.github.com/ChristopheDucamp/ec76414c4944109eba84f54737835fdd.js"></script> | ||
+ | </html> | ||
+ | |||
+ | |||
+ | |||
+ | ==== truc sur les priorités des opérateurs ==== | ||
+ | |||
+ | Est ce que | ||
+ | |||
+ | `type(varA) == str or type(varB) == str` | ||
+ | |||
+ | est équivalent à | ||
+ | |||
+ | `type(varA) or type(varB) == str` ? | ||
+ | |||
+ | Celles-ci ne sont pas équivalentes du fait de la [priorité des opérateurs de Python](https://docs.python.org/3.5/reference/expressions.html#operator-precedence) (quelques opérateurs ont une priorité plus haute que d'autres). | ||
+ | |||
+ | Le `==` a une priorité plus haute que le `or` et sera évalué en premier. | ||
+ | |||
+ | Par conséquent : | ||
+ | |||
+ | `type(varA) or type(varB) == str` | ||
+ | |||
+ | sera évalué comme suit, si nous plaçons explicitement des parenthèses : | ||
+ | |||
+ | `type(varA) or ( type(varB) == str )` | ||
+ | |||
+ | `True or ( type(varB) == str )` | ||
+ | |||
+ | `( True )` | ||
+ | |||
+ | Parce que "n-importe-quoi" ou "True" prendra simplement la valeur de "True" (en algèbre booléen). | ||
+ | |||
+ | Et l'autre expression : | ||
+ | |||
+ | `type(varA) == str or type(varB) == str` | ||
+ | |||
+ | sera évaluée comme suit, si nous y plaçons des parenthèses : | ||
+ | |||
+ | `( type(varA) == str ) or ( type(varB) == str )` | ||
+ | |||
+ | Aussi, nous devrons vérifier que chacune des expressions entre parenthèses pour voir si elles sont vraies ou non pour déterminer le résultat final. | ||
+ | |||
+ | Par conséquent ces deux expressions ne sont pas égales. | ||
+ | |||
+ | |||
+ | ==== PEMDAS ==== | ||
+ | Extrait de [[wikibooks:Programmation_Python/Op%C3%A9rateurs#Priorit%C3%A9_des_op%C3%A9rations]] | ||
+ | |||
+ | Lorsqu'il y a plus d'un opérateur dans une expression, l'ordre dans lequel les opérations doivent être effectuées dépend de ''règles de priorité''. Sous Python, les règles de priorité sont les mêmes que celles qui vous ont été enseignées au cours de mathématique. Vous pouvez les mémoriser aisément à l'aide d'un « truc » mnémotechnique, l'acronyme '''PEMDAS''' : | ||
+ | |||
+ | * '''P''' pour ''parenthèses''. Ce sont elles qui ont la plus haute priorité. | ||
+ | Elles vous permettent donc de « forcer » l'évaluation d'une expression dans l'ordre que vous voulez.<br /> | ||
+ | Ainsi `2*(3-1) = 4`>, et `(1+1)**(5-2) = 8`. | ||
+ | |||
+ | * '''E''' pour ''exposants''. Les exposants sont évalués ensuite, avant les autres opérations.<br /> | ||
+ | Ainsi `2**1+1 = 3`(et non 4), et `3*1**10 = 3` (et non 59049 !). | ||
+ | |||
+ | * '''M''' et '''D''' pour ''multiplication'' et ''division'', qui ont la même priorité. | ||
+ | Elles sont évaluées avant l'''addition'' `A` et la ''soustraction'' `S`, lesquelles sont donc effectuées en dernier lieu. <br /> | ||
+ | Ainsi `2-2*2` renvoie -2 et non 0 ! Et `2+4/2` renvoie 4.0 et non 3.0 | ||
+ | |||
+ | (Rappelez-vous que `/` est l'opérateur de la division décimale). | ||
+ | |||
+ | Si deux opérateurs ont la même priorité, l'évaluation est effectuée de gauche à droite. <br /> | ||
+ | Ainsi dans l'expression `59*100/60`, la multiplication est effectuée en premier, et la machine doit donc ensuite effectuer `5900/60`, ce qui donne `98.0`. | ||
+ | Si la division était effectuée en premier, le résultat serait `59.0` (rappelez-vous ici encore qu'il s'agit d'une division ''classique''). | ||
+ | |||
+ | * '''A''' et '''S''' pour ''addition'' et ''soustraction''. | ||
+ | |||
+ | |||
+ | == R2D4 == | ||
+ | |||
+ | ; [[2018-249]] jeudi 6 septembre 2018 : 4ème jour de mon défi [[100daysofcode]]. Apprendre quelques fondamentaux Python. Aujourd'hui, entraînement sur la boucle `while`. | ||
+ | |||
+ | === Livre === | ||
+ | * révisé la section `while` dans le chapitre 6 "Tourner en Boucle" extrait de l'ouvrage "Python pour les Kids" publié chez Eyrolles. | ||
+ | |||
+ | [[File:Python-pour-les-kids-Eyrolles-boucle-while.jpg|400px|[https://www.eyrolles.com/Chapitres/9782212140880/extrait_python_pour_les_kids.pdf extrait]] | ||
+ | |||
+ | === MAJ version Python === | ||
+ | "revisité l'installation initiale Python sur Mac OSX" | ||
+ | |||
+ | * téléchargé la version 3.70 sur python.org | ||
+ | * créé un script de lancement avec "Automator > Applications > Exécuter un Script Shell" contenant<br> `open -a "/Applications/Python 3.7/IDLE.app" --args` | ||
+ | |||
+ | * script baptisé "IDLE" et enregistré sur le bureau m'ouvrant un "Shell Python" -bien plus rustique que l'IDE Spyder- avec son invite de commande ">>>". | ||
+ | |||
+ | === exercices while === | ||
+ | |||
+ | Achevé le dernier exercice de la section [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/courseware/fc8f42302c644118adfcfa720f9f403e/35f82f6c3ecb4e9e913dc279a9b73a9f/13?activate_block_id=block-v1%3AMITx%2B6.00.1x%2B2T2018%2Btype%40vertical%2Bblock%400f5d6ac8ebd24fb3a223206bf5d56e61 "while"]. Écrire une boucle while qui ajoute les valeurs de de 1 à `fin`. (`fin` inclus). Par exemple si `fin` égale 6, votre code devrait produire 21 (à savoir 1 + 2 + 3 + 4 + 5 + 6). | ||
+ | |||
+ | <script src="https://gist.github.com/ChristopheDucamp/abed87213061a12e6f0110bbe39812e6.js"></script> | ||
+ | |||
+ | == R2D5 : pause [[micropub]] == | ||
+ | ''vendredi 7 septembre : #MarathonPython mis en pause. étude [[micropub]].'' | ||
+ | |||
+ | |||
+ | |||
+ | == R2D6 == | ||
+ | ''samedi 8 septembre' Pause Python - travaux [[indieweb]] [[micropub]]' | ||
+ | |||
+ | == R2D7 == | ||
+ | '''dimanche 9 septembre'' travaux [[micro.blog]] | ||
+ | |||
+ | Python : série de [https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2018/courseware/fc8f42302c644118adfcfa720f9f403e/35f82f6c3ecb4e9e913dc279a9b73a9f/13 3 exercices sur la boucle `for'] |
Version actuelle datée du 9 septembre 2018 à 08:36
2ème défi du100daysofcode démarré le lundi 3 septembre 2018.
- Objectifs
- coder 1 heure par jour pendant 100 jours. - assimiler quelques fondamentaux de programmation Python - tout en poursuivant quelques routines d'exploration indieweb
Un "marathon Python" où je tenterai de documenter ma progression sous forme de log chronodaté (sous la forme R2DX, X étant le numéro du jour). Premiers pas démarrés avec joie avec quelques exercices de logique accessibles aux enfants - lecture en cours de "Python pour les Kids"- Impatient de compléter les premières foulées avec le MOOC de Fun UNCA le 17 septembre prochain. -- xtof 7 septembre 2018 à 11:25 (UTC)
Supports
Quelques MOOCs et ressources en ressources à compléter en-dessous
MIT Edx
- MIT : Introduction to Computer Science and Programming Using Python
- Critique du cours Edx MIT 6.00.1.x review - 2017-10-21
- Livre du cours "Introduction to Computation and Programming Using Python - Guttag" File:Intro-Computation-Programming-using-Python.pdf
1. Param + config Python + Spyder (Environnement de dév) 1. Semaine 1 : Fondamentaux Python 1. Support Slides Partie 1 et 2 : File:lec1.pdf + File:lec2_branch_loops.pdf
UCA Fun-mooc
inscrit
- Python 3 : des fondamentaux aux concepts avancés du langage - démarrage 17 sept 2018 https://www.fun-mooc.fr/courses/course-v1:UCA+107001+session02/about (recommandé par jaxom kaplan https://mamot.fr/@jaxom_kaplan/100672842299195451)
OpenClassroom
- Cours en français chez OpenClassroom (inscrit mais non démarré) Apprenez à Programmer en Python.
Env de dev (IDE)
à raffiner. essai en cours du navigateur Anaconda + Spyder
1. Paramétrage + config Python + Spyder (Environnement de dév) 2. tutoriel de Sonnie (ligne de commande) : https://sonniesedge.co.uk/posts/data-science-tools
Slides et ouvrages
1. Semaine 1 MIT : Fondamentaux Python 11. Support Slides Partie 1 et 2 : File:lec1.pdf + File:lec2_branch_loops.pdf 1. Python Data Science Handbook 1. Python pour les kids & caract.spéciaux
Raccourcis-clavier
à tester et compléter.
L'usage des flèches gauche et droite pour avancer et reculer peut être complété par ces raccourcis
- Ctrl + a renvoie le curseur en début de ligne
- Ctrl + e renvoie le curseur en fin de ligne
- Ctrl + b recule le curseur d'un caractère
- Ctrl + f avance le curseur d'un caractère
- Ctrl + d efface le caractère suivant dans la ligne
- Ctrl + k coupe le texte en partant du curseur jusqu'à la fin de la ligne
- Ctrl + u
- Ctrl + y
- Ctrl + t
- Ctrl +
- Ctrl + I nettoie l'écran du terminal
R2D1
Conditionnelle imbriquée :
x = int(input('Entre un nombre entier : ')) if x%2 == 0: if x%3 == 0: print('Divisible par 2 et 3') else: print('Divisible par 2 et pas par 3') elif x%3 == 0: print('Divisible par 3 et non par 2')
Indentation :
x = float(input("Entre un nombre pour x : ")) y = float(input("Entre un nombre pour y : ")) if x == y: print("x et y sont égaux") if y!= 0: print("par conséquent, x / y donne ", x/y) elif x < y: print("x est le plus petit") else: print("y est le plus petit") print("Merci !")
R2D2
- Mise à jour en cours de Spyder 3.2.8 vers la 3.3.1
Ouvert Anaconda et à l'invite de mise à jour de Spyder (IDE de dév Python), fermeture de Spyder et lancement du terminal :
conda update qt pyqt conda update spyder
Note : mise à jour faite directement dans le navigateur Anaconda
cours 2
Éléments clés des programmes
- Bindings
- Strings
- Input/Output
- IDEs
- Control Flow
- Iteration
R2D3
... Suite Python comparaison avec exercice de comparaison de variables. Révision sur la priorité des opérateurs Python
Exercice vara varb
Supposons que deux variables, `varA` and `varB`, soient deux valeurs déclarées, que ce soit des nombres ou des chaînes.
Écrire un bout de code Python qui évalue `varA` et `varB`, et affiche ensuite l'un des messages suivants :
- `"string involved"` si l'une des `varA` ou `varB` sont des chaînes
- `"bigger"` si `varA` est plus grand que `varB`
- `"equal"` si `varA` est égal à `varB`
- `"smaller"` si `varA` est plus petit que `varB`
truc sur les priorités des opérateurs
Est ce que
`type(varA) == str or type(varB) == str`
est équivalent à
`type(varA) or type(varB) == str` ?
Celles-ci ne sont pas équivalentes du fait de la [priorité des opérateurs de Python](https://docs.python.org/3.5/reference/expressions.html#operator-precedence) (quelques opérateurs ont une priorité plus haute que d'autres).
Le `==` a une priorité plus haute que le `or` et sera évalué en premier.
Par conséquent :
`type(varA) or type(varB) == str`
sera évalué comme suit, si nous plaçons explicitement des parenthèses :
`type(varA) or ( type(varB) == str )`
`True or ( type(varB) == str )`
`( True )`
Parce que "n-importe-quoi" ou "True" prendra simplement la valeur de "True" (en algèbre booléen).
Et l'autre expression :
`type(varA) == str or type(varB) == str`
sera évaluée comme suit, si nous y plaçons des parenthèses :
`( type(varA) == str ) or ( type(varB) == str )`
Aussi, nous devrons vérifier que chacune des expressions entre parenthèses pour voir si elles sont vraies ou non pour déterminer le résultat final.
Par conséquent ces deux expressions ne sont pas égales.
PEMDAS
Extrait de wikibooks:Programmation_Python/Opérateurs#Priorité_des_opérations
Lorsqu'il y a plus d'un opérateur dans une expression, l'ordre dans lequel les opérations doivent être effectuées dépend de règles de priorité. Sous Python, les règles de priorité sont les mêmes que celles qui vous ont été enseignées au cours de mathématique. Vous pouvez les mémoriser aisément à l'aide d'un « truc » mnémotechnique, l'acronyme PEMDAS :
- P pour parenthèses. Ce sont elles qui ont la plus haute priorité.
Elles vous permettent donc de « forcer » l'évaluation d'une expression dans l'ordre que vous voulez.
Ainsi `2*(3-1) = 4`>, et `(1+1)**(5-2) = 8`.
- E pour exposants. Les exposants sont évalués ensuite, avant les autres opérations.
Ainsi `2**1+1 = 3`(et non 4), et `3*1**10 = 3` (et non 59049 !).
- M et D pour multiplication et division, qui ont la même priorité.
Elles sont évaluées avant l'addition `A` et la soustraction `S`, lesquelles sont donc effectuées en dernier lieu.
Ainsi `2-2*2` renvoie -2 et non 0 ! Et `2+4/2` renvoie 4.0 et non 3.0
(Rappelez-vous que `/` est l'opérateur de la division décimale).
Si deux opérateurs ont la même priorité, l'évaluation est effectuée de gauche à droite.
Ainsi dans l'expression `59*100/60`, la multiplication est effectuée en premier, et la machine doit donc ensuite effectuer `5900/60`, ce qui donne `98.0`.
Si la division était effectuée en premier, le résultat serait `59.0` (rappelez-vous ici encore qu'il s'agit d'une division classique).
- A et S pour addition et soustraction.
R2D4
- 2018-249 jeudi 6 septembre 2018
- 4ème jour de mon défi 100daysofcode. Apprendre quelques fondamentaux Python. Aujourd'hui, entraînement sur la boucle `while`.
Livre
- révisé la section `while` dans le chapitre 6 "Tourner en Boucle" extrait de l'ouvrage "Python pour les Kids" publié chez Eyrolles.
MAJ version Python
"revisité l'installation initiale Python sur Mac OSX"
- téléchargé la version 3.70 sur python.org
- créé un script de lancement avec "Automator > Applications > Exécuter un Script Shell" contenant
`open -a "/Applications/Python 3.7/IDLE.app" --args`
- script baptisé "IDLE" et enregistré sur le bureau m'ouvrant un "Shell Python" -bien plus rustique que l'IDE Spyder- avec son invite de commande ">>>".
exercices while
Achevé le dernier exercice de la section "while". Écrire une boucle while qui ajoute les valeurs de de 1 à `fin`. (`fin` inclus). Par exemple si `fin` égale 6, votre code devrait produire 21 (à savoir 1 + 2 + 3 + 4 + 5 + 6).
<script src="https://gist.github.com/ChristopheDucamp/abed87213061a12e6f0110bbe39812e6.js"></script>
R2D5 : pause micropub
vendredi 7 septembre : #MarathonPython mis en pause. étude micropub.
R2D6
samedi 8 septembre' Pause Python - travaux indieweb micropub'
R2D7
'dimanche 9 septembre travaux micro.blog
Python : série de 3 exercices sur la boucle `for'