# Introduction à la programmation, Master d'Optométrie
Ce document partagé a deux objectifs
- Collecter tous les retours pour le cours et notamment le [support pédagogique](https://introductionprogrammationpython.pages.centralesupelec.fr/): critiques constructives, qu'est-ce qui marche bien ou pas, remarques, suggestions, correctifs (y compris typos triviales). N'hésitez pas à l'éditer!
- Vous mettre à disposition des [annexes](#Annexes) au support pédagogique
## Participants
NT, DJ, ML, ABD, CB, Gaudiche Charlotte, EB, HV, LJ, LL, AC, CV, MB, LG, TL, MF, LM,MA,JB
## Retours généraux sur le cours
Si le cours vous a plu, vous pouvez le noter aussi! Ce sera notre livre d'or :-)
- ...
## Retours
### Synthèse des avis des étudiants recoltés sur papier
- 4h dans la journée c'est trop: ×10
- Activités plus en lien avec le métier: ×10
notamment via mini-projet(s) à commencer plus tôt
- approche ludique: 👍×8
- structurer et varier le format pour maintenir la stimulation: ×6
- bonne progression au début puis saut dans la courbe d'apprentissage:×5
- 12h c'est beaucoup: ×2
- consignes et explications très claires: ×2
- facilité de prise en main du language, adapté à la population
- facilité de prise en main des outils, adapté à la population
- temps d'attente un peu long pour avoir une explication individuelle:×2
- autonomie: 👍
- pas assez de lien entre les différents blocs
- des boggues à fluidifier: 1
- IA: 👍
### Analyse a posteriori par les enseignants
Retrospectivement, beaucoup d'heures ont été consacrées aux exercices de découverte (avec Laby), et tout particulièrement aux exercices plus algorithmiques et avancés marqués d'un ♣. Cela a fortement empiété sur le temps de travail sur le cœur du contenu. Visiblement la consigne donnée de ne faire ces exercices que si l'on est déjà très à l'aise de fonctionne pas. Nous avons commencé à revoir le parcours pédagogique pour reporter certains de ces exercices à plus tard, pour ludifier la phase d'ancrage des concepts. Il faudra poursuivre cette réorganisation et définir des attendus pour l'avancement minimum sur chaque séance. Premier jet: Séance 1: découverte. Séance 2: un peu de découverte (?) + calculer + s'adapter au contexte. Séance 3: s'adapter au contexte + répéter. Séance 4: répéter + structurer les programmes. Séance 5: structurer les programmes + données (listes). Séance 6: données (numpy, pandas, ...); Séance 7 et 8: mini projet et prérequis
### Infrastructure
Notez ici votre avancement et vos retours sur l'accès au cours (page web), à l'environnement de travail (mydocker), interface Jupyter, ...
### [Parcours pédagogique](https://introductionprogrammationpython.pages.centralesupelec.fr/Sources/index.html#decouvrir-jupyter)
Notez ici vos commentaires sur le parcours pédagogique (dans quel ordre vous sont proposées les feuilles).
- ...
- ...
### Découvrir Python
A terminé: DJ, MB, EB, ML, MF, AC, HV, LM, LL, CV, CB, MA, JB, ABD, TL
A terminé: DJ, CG, AC, MF, ML, HV, EB, LM, LL, JB, CV, MB, CB, MA, ABD, TL, LJ
Notez ici vos commentaires sur les feuilles individuelles:
- PremiersPas/01-PriseEnMainLaby
...
### Calculer
A terminé: DJ, CG, MF, AC, ML, HV, LM, CV CB, LL, MA, JB, TL LJ, ABD, EB, MB
Commentaires sur les fiches:
- valeurs et types: vérifier si on a bien défini float et nombre à virgule flottante; les rajouter dans l'index.
### S'adapter au contexte
A terminé: DJ, CG, AC, LM, CV, LL, MF CB,MA LJ, MB, ,EB , TL, ABD, HV
Commentaires sur les fiches:
- ...
### Répéter
A terminé: DJ, CG, LM, CV, LL, LM, AC, MB, EB, MA, ML, ABD,HV, MF, TL,HV, LJ, CB
Commentaires sur les fiches:
- boucle for: changer l'exercice carré pour dessiner un carré en semant des petits cailloux. Du coup, rappeler comment semer des cailloux. À vérifier si laby python peut faire
- affichage : expliquer «concaténation»
- Labyrinthe aléatoire: donner une indication, cachée par défaut, décrivant l'algorithme; rappeler de passer les exercices trèfle et revenir dessus ultérieurement dès qu'ils paraissent difficile
### Structurer un programme
A terminé: AC, LM, LJ, CB
Commentaires sur les fiches:
- exponnentielle: rajouter un lien vers «nombre à virgule flottante»
- exponnentielle:
- fonction puissance: préciser que l'on pourrait utiliser l'opérateur `**` mais que, à titre d'exercice pédagogique, l'on souhaite ici réimplanter la fonction puissance
- ...
### Structurer les données
A terminé: GC, ML, AC, LM, ABD
Commentaires sur les fiches:
- ...
## Annexes
### Utilisation d'agents conversationnels
Jupyter permet d'intégrer un agent conversationnel (avec [jupyter-ai](https://jupyter-ai.readthedocs.io/)). Sur myDocker, un agent conversationnel libre et souverain est disponible (projet [Aristote](https://www.centralesupelec.fr/fr/aristote-une-ia-au-service-de-lenseignement-superieur)); son usage est gratuit et il n'y a pas de collecte de données personnelles. D'ici peu, il pourra être **contextualisé** à un cours donné. Vous pouvez l'utiliser pour poser des questions, générer du code, obtenir des explications, etc.
Pour y accéder: cliquer sur l'item "Jupyter AI Chat" dans la barre de droite.
::: info
**Exemples:**
> En programmation, qu’appelle-t’on une boucle?
> Pourrais-tu traduire en Allemand «....»
:::
::: info
**Exemple:**
> Pourrais-tu écrire du code Python pour afficher la fonction sinus?
Puis utiliser les icônes pour insérer le code produit dans le notebook
:::
::: info
**Exemple:**
Après avoir sélectionné du code (ou le texte d'une erreur) dans le notebook:
> Pourrais-tu m'expliquer le code suivant?
Puis cliquez sur «envoyer la sélection» avec la question
:::
::: info
**TODO** ajouter un exemple demandant une indication pour résoudre un exercice
:::
Quelques conseils:
- **Principes**: Les outils d'IA générative fonctionnent sur la base des statistiques. Ici, l'agent conversationnel s'appuie sur un *grand modèle de language*: un logiciel qui a été entraîné sur un grand corpus de texte (ex: wikipedia, bases de code, ...) pour, étant donné un début de texte, essayer de choisir le mot suivant le plus probable. En réitérant, il génère du texte qui, statistiquement, ressemble à un texte moyen du corpus sur lequel il a été entraîné. Le texte produit va donc fortement dépendre (qualité, biais, connaissances), du choix du corpus par les concepteurs du modèle (ligne éditoriale).
Vous pouvez vous le représenter comme un beau parleur qui a très confiance en lui; il peut raconter n'importe quoi: raisonnements faux voire inexistants, faits inventés (hallucinations), biais (de genre, de culture, ...). À vous d'exercer un regard critique sur ce qui est produit avant de l'utiliser. Et de croiser les informations auprès des sources fiables.
- **Soyez précis dans vos consignes**: vous pouvez donner des indication de rôle «Tu es un enseignant de ...», de contexte «Programmation Python», de style «formel, lyrique, concis», de contenu: «Résumer le texte suivant `...`», de format de la réponse souhaitée «N'écrire que le code» ... Plus les consignes sont précises, plus la réponse a des chances d'être pertinente.
- **Itérez**: lorsque la réponse ne vous convient pas complètement, vous pouvez demander de la reformuler avec des consignes supplémentaires. L'agent garde en mémoire les quelques dernières questions et réponses de la conversation.
- **Impact environnemental:** Chaque requête a un coût environnemental de l'ordre de dix requêtes sur un moteur de recherche; chacune de ces dernières étant déjà coûteuse. Le coût d'une requête est quadratique en la taille de l'entrée (si votre question est deux fois plus longue, le coût est multiplié par quatre) et proportionnel à la taille de la sortie. Réfléchissez avant de poser vos questions. Formulez vos questions pour amener des réponses courtes.
### Pour aller plus loin:
Suivez les sections plus avancées du cours [Introduction à la programmation pour la biologie](https://python.sdv.u-paris.fr/) de Patrick Fuchs et Pierre Poulain.
**Indications:**
- Vous pouvez ignorer la section sur l'installation des logiciels: tout ce dont vous avez besoin est disponible sur myDocker
- Créez au fur et à mesure des nouvelles feuilles Jupyter pour travailler sur chaque section du cours
Structures de données:
- [Dictionnaires et tuples](https://python.sdv.u-paris.fr/08_dictionnaires_tuples/)
Programmation:
- [Fichiers](https://python.sdv.u-paris.fr/07_fichiers/)
- [Modules](https://python.sdv.u-paris.fr/09_modules/)
- [Bonnes pratiques de programmation](https://python.sdv.u-paris.fr/16_bonnes_pratiques/)
- [Programmation objet](https://python.sdv.u-paris.fr/23_avoir_la_classe_avec_les_objets/)
Calcul, traitement et visualisation de données:
- [Numpy](https://python.sdv.u-paris.fr/20_module_numpy/)
- [Matplotlib](https://python.sdv.u-paris.fr/21_module_matplotlib/)
- [Pandas](https://python.sdv.u-paris.fr/22_module_pandas/)
Vous trouverez d'autres recommandations de ressources pédagogiques sur le [wiki de Jupyter à Paris-Saclay](https://jupyter.gitlab.dsi.universite-paris-saclay.fr/RessourcesP%C3%A9dagogiques/index.html).
::: warning
Suite à la cyberattaque, ce wiki n'est actuellement disponible que depuis le campus.
:::
### Où trouver de l'information?
Avec les éléments de programmation que vous avez découvert vous avez maintenant au bout de vos doigts une foultitude d'outils pour manipuler des images, du son, . Pour découvrir comment les utiliser, vous pouvez:
- Utiliser votre agent conversationnel pour produire des exemples
- Utiliser des recherches sur internet pour chercher des sources, comme typiquement:
- la page wikipedia des bibliothèques pour avoir des informations sur les conditions d'utilisation, la pérénité, ...
- la documentation des bibliothèques: elle est souvent hébergée sur un site dédiée (ex: https://matplotlib.org pour MatPlotLib) ou sur des services comme ReadTheDocs (ex: https://jupyter-ai.readthedocs.io pour JupyterAi)
- les sites de Foires Aux Questions comme Stackoverflow:
- Suivre des tutoriels; le plus souvent, chaque bibliothèque en inclue un dans sa documentation
### Mini projets
#### Test de sensibilité au contraste
1. Écrivez une fonction qui prend en entrée un diamètre `d`, une fréquence spatiale, un contraste et une orientation donnés, et qui génére une image en niveau de gris, avec une mire sinusoidale de luminance de diamètre `d`.
**Indications:** générer l'image sous forme d'un tableau `numpy`, avec valeurs entre 0 et 255.
2. Écrivez un programme qui affiche des mires successives en variant le contraste, avec une orientation aléatoire. On commence par un contraste maximal et on se donne un pas $n$. À chaque itération on demande à l'utilisateur l'orientation. Si la réponse est inverse de la réponse précédente, on divise le pas `n` par 2. Si la réponse est correcte, on diminue le contraste de `n`; sinon on l'augmente de `n`. On s'arrête au bout de cinq inversions et on affiche le contraste obtenu.
Commentaires sur les mini projets:
- le tableau en 3 dimension n'apparait pas dans la fiche numpy
Merci, corrigé; en attendant que vous ayez la correction, voici la figure:

- indiquer pour la compréhension que T3D [ligne, colonne, couche]
:::info
Exemple: afficher une image en niveau de gris à partir d'un tableau:
```
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
T = np.array([[0, 50, 100],
[0, 100, 200]])
plt.imshow(T, cmap="Greys", vmin=0, vmax=255);
```
:::
:::info
**Indications**:
1. Construisez une image rectangulaire de taille 4 par 6 blanche
2. Construisez une image rectangulaire de taille 4 par 6 où le pixel de coordonnées (i,j) a pour valeur i + j
3. Construisez une image rectangulaire de taille 4 par 6 blanche à gauche et noire à droite
4. Construisez une image rectangulaire de taille 4 par 6 blanche avec des bandes verticales alternativement blanches et noires
5. Reprennez les mêmes questions avec des images de taille 100 par 100.
:::info
**Indication**
Évidemment cette fois il ne sera pas envisageable de remplir le tableau à la main. On va vouloir automatiser le processus.
1. Construisez un tableau 10×10 rempli de 0 avec:
```
T = np.zeros((10,10))
```
Changez une valeur de ce tableau avec l'instruction suivante:
```
T[2,3] = 17
```
Visualisez le résultat.
2. Maintenant construisez un tableau de taille 100×100. Et utilisez une double boucle `for` pour définir la valeur de ce tableau pour chaques indices i et j.
:::
:::
## À venir
- import et modules
- Vers l'autonomie: où chercher l'information, des tutoriels, utilisation d'agent conversationnel
- Tableau de données, statistiques, histogrammes: récupérer depuis ISD? ou renvoyer vers ISD?
- Séries, plots et ajustement de données: renvoyer sur le cours Méthodes Numériques? Ou PythonBio?
- Manipulation d'images: afficher, ...
- Manipulations de fichiers: récupérer depuis PythonBio?
- Widgets et mini applications: sous forme de projet? renvoyer vers le tutoriel ipywidgets?