---
jupytext:
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
kernelspec:
  display_name: Python 3 (ipykernel)
  language: python
  name: python3
---

+++ {"tags": ["locked"], "grade_id": "cell-2df857546d357cc2"}

# Introduction à la programmation, avec Python et Jupyter

+++ {"tags": ["locked"], "grade_id": "cell-5f1adcdce194d1c0"}

## À propos de ce cours

+++ {"tags": ["locked"], "grade_id": "cell-5f1adcdce194d1c1"}

:::{admonition} Sites web
:class: seealso dropdown

- [Site web du cours](https://Nicolas.thiery.name/Enseignement/intro-prog) (avec
  solutions)
- [Groupe de travail Python du CNRS](https://python-cnrs.netlify.app/)
:::

:::{admonition} Objectifs pédagogiques
:class: dropdown

% Références
% - https://www.enseignementsup-recherche.gouv.fr/sites/default/files/content_migration/document/Referentiels_de_competences_licence_formatMESR_2014_12_29_ssblancs_380001.pdf

% Sous différents vocables selon les modes – big data, intelligence artificielle, etc. – le numérique scientifique – calcul, science des données, apprentissage, programmation, etc. – joue un rôle croissant dans tous les domaines. Cette évolution va de pair avec la montée en puissance de la science ouverte, portée notamment par le développement de larges écosystèmes de logiciels libres et données ouvertes (le numérique scientifique libre).

Ce cours, propose une introduction à la programmation, en s’appuyant sur le langage de
programmation Python et l’environnement interactif Jupyter. Il est composé d’une
collection de feuilles interactives vous faisant découvrir par touches successives les
concepts de base de la programmation (variables, types, conditionnelles, boucles,
fonctions, modules, entrées-sorties), avec une initiation au calcul (tableaux de données,
vectorisation, statistiques, visualisation) et aux bonnes pratiques (typage, tests,
documentation, usage efficace et raisonné des carnets numériques, etc.). Ces éléments
sont rendus concrets par des applications, notamment à l'occasion d'un mini projet final.

À l'issue de ce cours, vous aurez acquis les compétences suivantes:

- Être conscient du potentiel offert par les outils de calcul scientifique et mis en
  confiance sur la capacité à s'en emparer.
- Connaître les concepts de base de programmation.
- Savoir les mettre en œuvre dans un environnement interactif pour analyser des problèmes
  simples issus des sciences, estimer ce qui est automatisable, et l'automatiser par
  itérations successives en utilisant quelques bibliothèques classiques de calcul, de
  traitement de données et de visualisation (numpy, pandas, matplotlib).
- Savoir rédiger un rapport interactif sur un traitement de données, avec description,
  observation, interprétation, conclusion.
- Savoir analyser et poser un regard critique sur un programme ou calcul simple d'origine
  extérieure: collègue, internet, IA générative, etc.
- découvrir de nouvelles fonctionnalités et obtenir des suggestions: introspection,
  exploration de la documentation et des forums, usage léger d'IA générative, etc.
- Avoir quelques notions sur l'informatique en tant que science et sur les enjeux: impact
  environnemental, science ouverte, données sensibles, usage de l'IA.

Vous pourrez ultérieurement renforcer ces compétences avec des cours plus avancés, par
exemple sur le traitement des données et l'apprentissage statistique:
([MOOC Scikit-learn](https://www.fun-mooc.fr/en/courses/machine-learning-python-scikit-learn/),
[Fiddle](https://fidle.cnrs.fr/)), etc.
:::

:::{admonition} Prérequis
:class: dropdown

Le cours vise à ne pas avoir de prérequis hors une familiarité avec l'usage d'internet et
du web; il vous suffit de vous laisser guider par les instructions. Quelques feuilles ou
exercices -- identifiées comme telles et non essentielles -- font l'hypothèse d'une
familiarité avec les mathématiques du lycée.
:::

:::{admonition} Édition 8-10 juin 2026
[Document partagé](https://codimd.math.cnrs.fr/EPJPC23kS1qwWsQ2mWogLw?both)
:::

:::::{admonition} Comment utiliser ce cours
:class: dropdown tip

::::{admonition} Option 1: En ligne, sur le service myDocker, pour les personnels et étudiants de tous les établissements français du supérieur (Fédération Éducation Recherche Renater)
:class: dropdown tip

1. Ouvrez la
   <a href="https://mydocker.universite-paris-saclay.fr/shell/join/IvvgFOBBFzGLwuGJeFSb/user-redirect/git-pull?repo=https%3A%2F%2Fgitlab.dsi.universite-paris-saclay.fr%2FIntroductionProgrammationPython%2F2026-06&targetPath=IntroductionProgrammationPython-2026-06&urlpath=lab%2Ftree%2FIntroductionProgrammationPython-2026-06%2Findex.md%3Freset&branch=main" target="_blank">version
   2026-06 du matériel pédagogique</a> sur le service
   [MyDocker@Paris-Saclay](https://mydocker.universite-paris-saclay.fr/documentation)</a>:

   - cliquez «connexion universitaire»;
   - choisissez votre institution (astuce: tapez par exemple «Sacl» pour trouver
     Université Paris-Saclay) et entrez vos identifiants;
   - cliquez «connexion à l'interface».

2. Suivez le parcours pédagogique de la page d'accueil (qui sera similaire à ce
   document).
::::

::::{admonition} Option 2: En ligne, sur le service notebook.link
:class: dropdown tip

[notebook.link](https://notebook.link) n'est pas un service institutionnel, mais est
hébergé sur serveurs français par une société de confiance
([QuantStack](https://quantstack.net)).

1. Si vous n'en avez pas encore un, <a href="https://notebook.link/signup"
   target="_blank">créez un compte sur notebook.link</a>. Cette étape est optionnelle,
   mais vous permettra de conserver votre travail d'une fois sur l'autre, même si vous
   changez d'ordinateur ou de navigateur web.

2. Ouvrez la <a
   href="https://notebook.link/@nthiery/intro-prog-fr"
   target="_blank">version 2026-06 du matériel pédagogique</a> sur notebook.link.

3. Suivez le parcours pédagogique.

:::{admonition} Limitation
:class: attention

Certains éléments du cours ne sont pas fonctionnels sur notebook.link: exercices à
répétition Jupylates, usage du débogueur,
:::
::::

::::{admonition} Option 3: Directement sur votre ordinateur
:class: dropdown tip

1. Téléchargez <a
   href="https://gitlab.dsi.universite-paris-saclay.fr/IntroductionProgrammationPython/2026-06"
   target="_blank">la version 2026-06 du matériel pédagogique</a> (Code -> Télécharger le
   code source -> zip).

   Si vous avez l'habitude de `git`, vous pouvez simplement faire:

   ```
   git clone git+https://gitlab.dsi.universite-paris-saclay.fr/IntroductionProgrammationPython/2026-06.git
   ```

Vous aurez aussi besoin d'installer un certain nombre de logiciels (jupyterlab,
jupylates, Laby). Vous pouvez par exemple utiliser `uv` pour cela:

2. Si vous ne l'avez pas déjà, installez le gestionnaire d'environnements
   [uv](https://docs.astral.sh/uv/getting-started/installation/).

3. Allez dans le dossier contenant le matériel pédagogique et lancez JupyterLab. Les
   logiciels requis seront automatiquement installés dans ce dossier.

   ```
   uv run jupyter lab index.md
   ```

4. Suivez le parcours pédagogique.
::::
:::::

:::{admonition} Un cours libre et réutilisable
:class: dropdown hint

![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/CC_BY-SA_icon.svg/88px-CC_BY-SA_icon.svg.png)

Ce cours mutualisé a pour vocation à devenir un socle commun de feuilles réutilisables
pour divers cours d'introduction à la programmation, à Saclay ou ailleurs. Il peut aussi
être utilisé de façon autonome.

Dans l'esprit des communs numériques, ce cours reprend ou s'inspire de nombreuses
ressources pédagogiques existantes, à la Faculté d'Orsay
([Info 111: Introduction à la programmation, en C++](https://nicolas.thiery.name/Enseignement/Info111/),
etc.) et ailleurs ([Laby](https://sgimenez.github.io/laby/),
[Introduction à la programmation en Python pour la biologie](https://python.sdv.u-paris.fr/)
de P. Fuchs et N. Poulain). Ces éléments seront cités au fur et à mesure (🚧en chantier🚧).
Ce cours lui-même est sous licence CC-BY-SA
([Creative Commons](https://fr.wikipedia.org/wiki/Licence_Creative_Commons), Attribution,
Partage dans les mêmes conditions): vous êtes encouragés à réutiliser tout élément et
diffuser des produits dérivés, à condition de le partager dans les mêmes conditions et
d'attribuer l'œuvre originale aux auteurs. Une collaboration avec
[CodEx](https://codex.forge.apps.education.fr/) est à l'étude. Ce cours s'appuie aussi
sur de nombreux logiciels libres.

% ⚠️Les exercices Codex sont sous une licence plus restrictive (CC-BY-NC-SA). Il conviendra
% donc, pour des usages commerciaux, de ne pas inclure ces exercices.⚠️

Ce cours est aussi une vitrine et un terrain d'expérimentation pour l'enseignement avec
Jupyter. Voir les
[conventions d'écriture](https://python-cnrs.netlify.app/contribute/authoring-conventions.html).
À venir: description des stratégies pédagogiques, outils utilisés: MyST, Jupylates, etc.

Ce projet est soutenu depuis 2024 par
[SaclAI-School](https://www.dataia.eu/saclai-school) et s'inscrit dans le projet plus
large [py-edu-fr](https://python-cnrs.netlify.app/) depuis le lancement de ce dernier en
2025\.
:::

+++ {"tags": ["locked"], "grade_id": "cell-5f1adcdce194d1c0"}

## Parcours Pédagogique

+++ {"tags": ["locked"], "grade_id": "cell-5f1adcdce194d1c2"}

:::{admonition} Note
:class: hint

Vous pouvez adapter le parcours pédagogique proposé ici en fonction de votre expérience.
Vous pouvez aussi explorer la table des matières, où les feuilles sont classées par
thème. Vous noterez que le parcours proposé tourne parmi les thèmes en revenant dessus
tour à tour pour les approfondir (apprentissage en spirale).
:::

+++ {"tags": ["locked"], "grade_id": "cell-5f1adcdce194d1c2"}

### 0 - Découvrir Jupyter

+++ {"tags": ["locked"], "grade_id": "cell-5f1adcdce194d1c3"}

Dans ce cours, vous utiliserez des *feuilles d'exercices interactives `Jupyter`*.
`Jupyter` est une application web qui permet de programmer interactivement dans de
nombreux langages (`Python`, `C++`, ...), un peu comme une super calculatrice, et de
rédiger des documents interactifs.

:::{admonition} Indication
:class: tip

Si vous êtes déjà familier avec l'utilisation de Jupyter, vous pouvez passer directement
à la suite.
:::

1. Ouvrez la feuille de travail
   [Prise en main de Jupyter <status>](jupyter/prise-en-main.md)

2. Suivez les instructions qu'elle contient.

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc810"}

### 1 - Découvrir Python

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc811"}

:::{figure} premiers-pas/media/laby3a.png

:::

Le jeu Laby propose plusieurs défis successifs; pour chacun d'entre eux, le but est de
guider pas-à-pas une fourmi vers la sortie d'un labyrinthe à l'aide d'un programme.
Chacun de ces défis sera l'occasion d'avoir un premier contact ludique avec quelques
concepts (programme, conditionnelles, boucles, fonctions) que nous approfondirons par la
suite.

:::{admonition} En savoir plus sur Laby
:class: seealso, dropdown

Le jeu [Laby](https://sgimenez.github.io/laby/) a été originellement créé par Stéphane
Gimenez et collaborateurs pour la Fête de la Science à Jussieu. Nous utiliserons ici une
[réimplantation de Laby pour Python, dans Jupyter](https://gitlab.dsi.universite-paris-saclay.fr/nicolas.thiery/Laby.git).
:::

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc812"}

Chaque feuille ci-dessous correspond à un défi. Ouvrez-les tour à tour dans l'ordre et
suivez les instructions incluses. Si vous bloquez sur l'un des défis, n'hésitez pas à
passer à la suite et à y revenir ultérieurement.

% Vous pouvez cocher les cases ci-dessous au fur et à mesure que vous finissez les feuilles.

% Déposez votre travail après chaque fiche.

- [Prise en main de Laby <status>](premiers-pas/01-prise-en-main-laby.md)
- [À vous de jouer <status>](premiers-pas/10-premier-exo.md)
- [Un caillou dans la chaussure <status>](premiers-pas/11-un-caillou.md)
- [Encore un caillou! <status>](premiers-pas/12-encore-un-caillou.md)
- [Le débogueur <status>](premiers-pas/13-pas-a-pas.md)

Répéter :

% boucles while

- [Que c'est loin! <status>](premiers-pas/20-on-regarde-devant-soi.md)
- [Le couloir des cailloux <status>](premiers-pas/21-beaucoup-de-cailloux.md)

% et petites fonctions

- [En zigzag <status>](premiers-pas/22-en-zigzag.md)
- [La spirale infernale <status>](premiers-pas/23-la-spirale.md)

%- ♣ [Encore un zigzag <status>](premiers-pas/24-encore-un-zigzag.md)

S'adapter :

% conditionnelles

- [Ahhh des toiles! <status>](premiers-pas/30-si-si-si.md)

%- [Le caillou et la toile <status>](premiers-pas/31-le-caillou-et-la-toile.md)

Compter :

% boucles for et variables

- [Tu répéteras trois fois <status>](boucles/02-boucles-for-introduction-laby.md)
- [Variables <status>](premiers-pas/41-variables.md)
- [Compter les cailloux <status>](premiers-pas/42-compter.md)

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc813"}

### 2 - Calculer

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc814"}

- [Préambule Jupyter: mode édition versus mode commande <status>](jupyter/mode-edition-vs-commande.md)
- [Valeurs et types <status>](premiers-calculs/01-valeurs-types.md)
- [Fonctions mathématiques <status>](premiers-calculs/02-fonctions-maths.md)
- [Prendre des notes <status>](prendre-des-notes.md)
- [Variables <status>](premiers-calculs/03-variables.md)
- [Premières fonctions <status>](fonctions/00-initiation-fonctions.md)

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc815"}

### 3 - S'adapter au contexte : les instructions conditionnelles

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc816"}

- [Préambule Jupyter: le noyau <status>](jupyter/le-noyau.md)
- [Conditions <status>](conditions/01-conditions.md)
- [Laby : Le caillou et la toile <status>](premiers-pas/31-le-caillou-et-la-toile.md)

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc817"}

(repeter)=
### 4 - Répéter : les instructions itératives (boucles)

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc818"}

:::{attention}
Les défis marqués d'un ♣ ou ♣♣ sont (nettement) plus avancés; sauf si vous êtes à l'aise
et recherchez un peu de défi, nous vous recommandons de les sauter et de revenir dessus
ultérieurement lorsque vous aurez vu plus formellement les concepts sous-jacents.
:::

- [Préambule Jupyter: les types de cellules <status>](jupyter/les-types-de-cellules.md)
- [Affichages <status>](entrees-sorties/05-affichages.md)
- [Boucles while <status>](boucles/01-boucles-while.md)
- ♣ [Laby : Encore un zigzag <status>](premiers-pas/24-encore-un-zigzag.md)
- ♣ [Laby : Un labyrinthe aléatoire <status>](premiers-pas/52-labyrinthes-aleatoires.md)
- ♣ [Par où passer? <status>](premiers-pas/50-les-toiles.md)
- ♣ [Toiles et cailloux <status>](premiers-pas/51-toiles-et-cailloux.md)
- [Boucles for <status>](boucles/02-boucles-for.md)
- [Débogueur <status>](entrees-sorties/02-debogueur.md)
- [Compteurs et accumulateurs <status>](boucles/03-compteurs-accumulateurs.md)
- ♣ [Doubles boucles for <status>](boucles/04-dessins-geometriques.md)

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc819"}

(structurer)=
### 5 - Structurer un programme : les fonctions

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc819"}

- [Préambule: L'interface de JupyterLab <status>](jupyter/interface.md)
- [Fonctions <status>](fonctions/01-fonctions.md)

Les deux séries d'exercices suivantes ont le même objectif pédagogique : résoudre un
problème plus complexe par composition de petites fonctions. Vous pouvez choisir celle
que vous préférez, sachant que la première (fonction exponentielle) a un peu plus de
prérequis mathématiques.

Calculer la fonction exponentielle:

- [Partie 1 <status>](fonctions/02-exponentielle1.md)
- [Partie 2 <status>](fonctions/02-exponentielle2.md)
- [Partie 3 <status>](fonctions/02-exponentielle3.md)
- ♣ [Partie 4 <status>](fonctions/02-exponentielle4.md)
- ♣ [Partie 5 <status>](fonctions/02-exponentielle5.md)

Implanter un moteur simple de censure de texte:

- [Partie 1 <status>](fonctions/03-censure-texte1.md)
- [Partie 2 <status>](fonctions/03-censure-texte2.md)
- [Partie 3 <status>](fonctions/03-censure-texte3.md)
- [Partie 4 <status>](fonctions/03-censure-texte4.md)

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc815"}

### 6 - Structurer les données

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc820"}

- [Préambule Jupyter: jeter sa souris <status>](jupyter/jeter-sa-souris.md)
- [Les listes <status>](donnees/01-listes.md)
- [Parcours de listes <status>](donnees/02-parcours.md)
- [Compréhensions de listes <status>](donnees/03-comprehensions.md)
- [Premiers graphiques <status>](donnees/premiers-graphiques.md)
- [Tables de données (Pandas) <status>](donnees/tables.md)
- [Tableaux (Numpy) <status>](donnees/tableaux.md)
- [Graphiques <status>](donnees/graphiques.md)

%- [Images (PIL) <status>](donnees/images.md)

% ## Représenter les données

+++ {"tags": ["locked"]}

### 7 - Communiquer : les entrées / sorties

:::{admonition} Voir le cours [Introduction à la programmation Python pour la biologie](https://python.sdv.u-paris.fr/).
:class: seealso

Chapitre sur les [fichiers](https://python.sdv.u-paris.fr/07_fichiers).
:::

+++ {"tags": ["locked"]}

- [Préambule Jupyter: l'indentation <status>](jupyter/indentation.md)

+++ {"tags": ["locked"]}

### 8 - Structurer un programme : les modules

:::{admonition} Voir le cours [Introduction à la programmation Python pour la biologie](https://python.sdv.u-paris.fr/).
:class: seealso

Chapitre sur les [modules](https://python.sdv.u-paris.fr/09_modules).
:::

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc821"}

### 9 - Défis supplémentaires

+++ {"tags": ["locked"], "grade_id": "cell-c3c9a359567dc822"}

% S'adapter à tout :
% algorithmiques génériques

- ♣♣ [Laby : Fabriquer votre labyrinthe <status>](premiers-pas/54-fabriquer.md)
- ♣♣ [C'est fou! <status>](premiers-pas/53-c-est-fou.md)

### 10 - Mini projets

- [Préambule: Chercher des informations](jupyter/chercher-des-informations.md)
- [Géométrie constructive des solides avec pyvista <status>](projets/geometrie-constructive-3D.md)

### 11 - Aller plus loin avec Jupyter

- [Ordre d'exécution](jupyter/ordre-d-execution.md)
- [Rechercher et remplacer](jupyter/rechercher-remplacer.md)
- [Réordonner les cellules](jupyter/reordonner-cellules.md)
- [Texte riche](jupyter/texte-riche.md)
