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

Ce cours, en construction, 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 en autonomie, et par
touches successives, les concepts de base de la programmation.
:::

:::{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} Comment utiliser ce cours
:class: dropdown tip

:::{admonition} Fédération Éducation Recherche Renater (personnels et étudiants de tous les établissements français du supérieur)
:class: dropdown

1. Ouvrez la version 2026-01 du cours sur le service
   <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-01&targetPath=IntroductionProgrammationPython-2026-01&urlpath=lab%2Ftree%2FIntroductionProgrammationPython-2025-09%2Findex.md&branch=main" target="_blank">MyDocker@Paris-Saclay</a>:

   - cliquez «connexion via fédération renater»;
   - 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} Hors Fédération Renater Éducation Recherche
:class: dropdown

- Vous pouvez travailler sur le matériel pédagogique <a
  href="https://nicolas.thiery.name/Enseignement/intro-prog-en/lite/lab/?path=index.ipynb"
  target="_blank">en ligne avec JupyterLite</a>.\
  Limitation: votre travail sera sauvegardé dans votre navigateur web. Si vous changez
  d'ordinateur ou de navigateur web, vous ne le retrouverez pas. L'adresse du site
  ci-dessus est temporaire.

- Alternativement, vous pouvez télécharger la version 2026-01 du matériel pédagogique depuis
  [ici](https://gitlab.dsi.universite-paris-saclay.fr/IntroductionProgrammationPython/2026-01)
  (Code -> Télécharger le code source -> zip). Vous aurez aussi besoin d'installer un
  certain nombre de logiciels (jupyterlab, jupylates, Laby).

  ::::{admonition} Instructions d'installation avec `uv`
  :class: dropdown tip

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

  2. 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
     ```
  ::::
:::::
::::::

:::{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"}

- [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"}

- [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.
:::

- [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"}

- [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 exponnentielle:

- [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"}

- [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

+++

### 7 - Communiquer : Entrées / sorties

+++

### 8 - Structurer un programme : les modules

+++

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

+++ {"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

- [Géométrie constructive des solides avec pyvista <status>](projets/geometrie-constructive-3D.md)
