Practical Programming
in Python
Introduction
Prof. Kévin Huguenin
OBJECTIFS ET CONTENU
• Objectifs : d’ici la fin du semestre,
1. être capable de produire des programmes puissants, efficaces et robustes (en Python)
• être autonome et méthodique
2. être opérationnel·le pour les autres cours (la programmation ne devrait pas être un frein)
3. être opérationnel·le pour la vie courante
⚠ Approche différente de celle du cours du premier semestre :
info1 != info2
Practical Programming in Python 21/02/22 2
OBJECTIFS ET CONTENU
• Contenu :
• ! Manipulation avancée des types de base (listes, chaînes de caractères et dictionnaires)
• " Interfaces ligne de commande, paramètres, entrées/sorties
• # Programmation orientée objet : classes, objets, héritage, etc. [×3]
• $ Modélisation UML et Patrons de conception
• ! Manipulations de dates et temps
• % Expressions régulières
• " Encodage et formats de fichiers
• & Bases de données
• ' Programmation réseau, HTTP, HTML, API web
• ( Interfaces graphiques
• ) Bibliothèques externes : graphes, cryptographie, apprentissage, sciences des données,
calcul scientifique, traitement d’image, etc.
Practical Programming in Python 21/02/22 3
ÉQUIPE
Kévin Huguenin Alpha Diallo
Assistant Diplômé
Enseignant
! Doctorant (HEC) – depuis 2020
! Professeur (HEC) – depuis 2016
Noé Zufferey
Assistant Diplômé
" Chercheur (CNRS, France)
Chercheur (EPFL, Suisse; McGill, Canada) ! Doctorant (HEC) – depuis 2019
" Doctorat en Informatique (Inria, France)
Lev Velykoivanenko
# Expertise: sécurité et vie privée Assistant Diplômé
! Doctorant (HEC) – depuis 2020
Assistant·e·s étudiant·e·s
Céline Etienne Gabriel Julien Sarah
(UNIL - ESC) (EPFL) (UNIL - ESC) (EPFL) (UNIL - ESC)
Practical Programming in Python 21/02/22 4
ÉQUIPE
• Nous sommes là pour vous !
• E-mail
• Toute l’équipe en copie
• Ajouter « [esc-info2] » au début du sujet
• Règles de courtoisie habituelles
• Inclure les messages d’erreur et le code complet (utiliser un lien SWITCHDrive)
• Réponse par e-mail + Moodle
• Forum
• Espace Moodle : [Link] (clé : python8)
• Travaux pratiques et entretien
• Prendre rendez-vous par e-mail pour un entretien
Kévin Alpha Lev Noé Céline Étienne Gabriel Julien Sarah
🇫🇷🇬🇧 🇫🇷🇬🇧 🇫🇷🇬🇧🇺🇦🇷🇺 🇫🇷🇬🇧 🇫🇷🇬🇧 🇫🇷🇬🇧 🇫🇷🇬🇧🇩🇪🇪🇸🇮🇹 🇫🇷🇬🇧 🇫🇷🇬🇧
Practical Programming in Python 21/02/22 5
PLANIFICATION & EVALUATION
• ! Horaires :
• Cours : Lundi 8:00-9:45
• Travaux pratiques :
• Lundi 13:00-15:00 (Groupe 1) – Etienne, Gabriel, Julien, Kévin, Sarah
• Lundi 15:00-17:00 (Groupe 2) – Alpha, Etienne, Gabriel, Julien, Noé, Sarah
• Mardi 8:00-10:00 (Groupe 1) – Céline, Gabriel, Kévin, Lev, Noé (Zoom)
• Mercredi 8:00-10:00 (Groupe 2) – Alpha, Céline, Gabriel, Lev (Zoom)
• ⚠ Pas de cours / travaux pratiques la semaine du 15 avril (Pâques 🎊)
Practical Programming in Python 21/02/22 6
PLANIFICATION & EVALUATION
• ! Projet : démarrage fin mars/début avril – bonus (+0.75 max.)
• ! Examens : tous les documents sont autorisés
• Mi-parcours (avril)?
• Final (juin) : QCM (sans points négatifs) et questions ouvertes sur tout le cours
• ⚠ Pas de bonus si la note de l’examen final est strictement
inférieure à 3.5.
Practical Programming in Python 21/02/22 7
Découvrir
SpeakUp /
ORGANISATION DES COURS Moodle Quiz
1. Rappels et débriefing de la dernière séance (cours et travaux pratiques)
2. Quiz en « live »
• Questions à choix multiples similaires à celles de l’examen
• SpeakUp : Web ([Link] ou mobile (iPhone/Android) OU
Moodle
! quiz: salle -
À l'idée de commencer le cours info-2, je suis...
A. Très inquiet·ète
B. Moyennement inquiet·ète
C. Un peu inquiet·ète
D. Pas du tout inquiet·ète et monstre motivé·e
Démo
3. Cours magistral (diffusé en live) incluant des démonstrations
" Pause de ~15 minutes
Practical Programming in Python 21/02/22 8
ORGANISATION DES COURS
• " Supports de cours, démonstrations, ressources externes et examens
passés sur Moodle
• ! Présence d’un·e ou plusieur·e·s assistant·e·s
Practical Programming in Python 21/02/22 9
Démo
ORGANISATION DES TP / PROJET
• # Contenu :
• Séances d’exercices : entrainement, boîte à outil, morceaux du projet Projet
• De base et avancé, version avec et sans ! indices
• Séances de projet (démarrage en avril, 2ème séance hebdomadaire) Cours 8: Fichiers
• Aspects pratiques
• Salle machine (POL/140-146) ; « tapis vert »; * Zoom (liens sur Moodle)
• Environnement de travail (tutoriels disponibles sur Moodle)
• Fichiers : clé USB ou SWITCHDrive
• Logiciels : PyCharm (licence professionnelle), Terminal, Python 3
⚠ De préférence, utiliser la même machine !
• 1ère séance : Aide à la configuration de l’environnement de travail
(machines UNIL et machines personnelles, dans une certaine mesure)
Practical Programming in Python 21/02/22 10
Démo
Installer
SWITCHDrive
OUTILS : SWITCHDrive
• ! Gestion des fichiers (tutoriel sur Moodle)
• Synchronisation automatique et transparente (Solution similaire à Dropbox)
• Requiert de créer un compte (à l’aide des identifiants UNIL) et une
configuration initiale
Practical Programming in Python 21/02/22 11
Démo
Installer
PyCharm
OUTILS : PYCHARM
• $ Environnement de développement (Tutoriel sur Moodle)
• Similaire à InteliJ
• Gestion de projet, gestion des paquets et bibliothèques (pip)
• Débogage
• Auto-complétion, suivi de référence, aide contextuelle
• Mise en forme
• Refactoring
Practical Programming in Python 21/02/22 12
RESSOURCES
• Moodle (mis à jour régulièrement)
• [Link]
• Auto-inscription (clé : python8)
• Information, Calcul, Communication (ICC, EPFL)
• Guide de référence de Python 3.x (3.5+)
• Aide mémoire Python 3
⚠ stackoverflow et autres forums : solutions peu fiables
Practical Programming in Python 21/02/22 13
RETOUR SUR L’EDITION 2021
• % ~40% de réussite à l’examen
• 10 étudiant·e·s au rattrapage (oral) : 8 succès
• & Evaluation du cours / TPs : Globalement bonne, mais…
• Charge de travail trop élevée, feuilles d’exercices trop longues
• Manque d’assistant·e·s
• Difficulté et adaptation
• Solution : ! Recrutement + ! Indices + " Coordination
Important : nous avons toujours besoin de votre feedback
Practical Programming in Python 21/02/22 14
Practical Programming
in Python
! Manipulation avancée des objets
de bases (Listes, chaînes de caractères
et dictionnaires)
Prof. Kévin Huguenin
MANIPULATION AVANCÉE
• Pourquoi ?
• Listes et structures « itérables » sont omniprésentes ; il faut absolument être
« agile » avec ces objets
• Simplification du code ; meilleure compréhension (proche de l’écriture
mathématique)
• Efficacité de l’implémentation et de l’exécution
Practical Programming in Python 21/02/22 16
Démo
RAPPELS : LISTES
• Initialisation
>>> l = list() # liste vide
>>> l = [] # idem
>>> l = [1, 2, 3]
>>> l = range(5) # range créé une liste d’entiers
>>> print(len(l)) # affiche la longueur de la liste. #
• Accès et affectation
>>> print(l[0], l[-1]) # l[-1] est le dernier élément. #
>>> print(l[1:2]) # l[1:2] est la sous-liste composé des éléments
d’indice 1 à 2 (2 non inclus). #
>>> l[0] = "a"
Practical Programming in Python 21/02/22 17
Démo
RAPPELS : LISTES (SUITE)
• Itération
>>> for x in l:
>>> print(x)
>>> # si on a besoin de l’indice
>>> for (i, x) in enumerate(l): # fonctionne sur toutes les « itérables »
(listes, dictionnaires, sets, etc.)
>>> print(i, x)
• Opérations : append, extend (+), remove, etc.
• Test d’appartenance : in
>>> print(5 in range(5)) # teste si 5 est dans la liste range(5). #
Practical Programming in Python 21/02/22 18
Démo
RAPPELS : CHAINES / STRINGS
• Les chaînes de caractères sont des listes de caractères qui ne peuvent pas être
modifiées (p. ex. pas de append ; on peut seulement créer une nouvelle chaîne à
partir d’une autre)
• Initialisation
>>> l = "abcde"
• Opérations : concaténation (+), etc.
>>> print("abc" + "def") # affiche « abcdef »
• Itération : c.f. listes
• La méthode join :
>>> [Link](l) # retourne la chaîne de caractères formée des éléments de l
(des chaînes de caractères) avec s intercalé entre chaque paire d’éléments
successifs
>>> "--".join(["a", "b", "c"]) # retourne «a--b--c»
Practical Programming in Python 21/02/22 19
Démo
RAPPELS : DICTIONAIRES
• Initialisation
>>> d = dict() # dictionnaire vide
>>> d = dict([("un", 1),("deux", 2)]) # dictionnaire construit à partir
d’une liste de couples clé-valeur
>>> d = {} # idem
>>> d = {"un": 1, "deux": 2}
• Accès, affectation, suppression
>>> print(d["un"]) # l’accès est rapide
>>> d["trois"] = 3
>>> del d["trois"] # supprime la valeur associée à "trois » dans d
• Itération
>>> for k in d: # par défaut on itère sur les clés
>>> print(k)
• Test d’appartenance (d’une clé) : in
>>> print(2 in {1: 2, 3: 4}) # # qu’affiche cette instruction?
Practical Programming in Python 21/02/22 20
! Regarder le
type set
Practical Programming in Python 21/02/22 21
Démo
LES FONCTIONS
• Les fonctions sont un type de variables ordinaire
• Une variable peut contenir une fonction (directement ou dans une structure)
>>> f = [Link]
>>> f = str
>>> l = [[Link], [Link]]
>>> d = dict([("cos", [Link]),("sin", [Link])])
>>> d["cos"]([Link]) # #
• Les fonctions peuvent être passées en paramètre d’autres fonctions
>>> def valeur_en_zero(f):
>>> return f(0)
• Comment faire pour passer une fonction en paramètre sans avoir à la définir de
manière permanente ? En utilisant une fonction lambda.
lambda arg1, arg2, …, argn: expression_du_resultat
lambda x: 2 * x # 𝑓: 𝑥 ↦ 2𝑥
lambda x, y: x + y # 𝑓: 𝑥, 𝑦 ↦ 𝑥 + 𝑦
Practical Programming in Python 21/02/22 22
Démo
LES FONCTIONS MAP ET FILTER
• La fonction map prend en argument une fonction f et une liste l. Elle retourne la
liste composée des éléments de l auxquels on a appliqué f:
map(f, [e1, e2, …, en]) renvoie [f(e1), f(e2), …, f(en)]
[e1, e2, …, en]
f f f
[f(e1), , …, ]
• " Comment multiplier tous les éléments d’une liste d’entiers par 2 ?
• " Comment est la taille de map(f, l) par rapport à la taille de l?
Practical Programming in Python 21/02/22 23
Démo
LES FONCTIONS MAP ET FILTER
• La fonction filter prend en argument une fonction booléenne g et une liste l.
Elle retourne la liste composée des éléments de l pour lesquels g renvoie
True :
filter(g, [e1, e2, e3]) renvoie [e1, e2] si g(e1) et g(e2) valent
True et g(e3) vaut False
[e1, e2, …, en]
g(·) = True True False
" " !
[e1, , … ]
• Comment ne garder que les éléments pairs d’une liste d’entiers ?
• Comment est la taille de filter(g, l) par rapport à la taille de l?
Practical Programming in Python 21/02/22 24
Démo
LES FONCTIONS MAP ET FILTER
⚠ Attention : Les objets map et range ne sont pas calculés
directement. Ils ne le sont que lorsqu’ils sont évalués. Pour forcer
l’évaluation, il faut appeler la fonction list().
D’autre part, lorsqu’ils sont évalués, leurs éléments sont consommés et
disparaissent de l’objet map.
>>> l = map(str, range(5))
>>> print(l) # affiche <map object at 0x102dce278>
>>> print(list(l)) # affiche ["0", "1", "2", "3", "4"]
>>> print(list(l)) # affiche []. "
! Il est possible d’utiliser map et filter sur plusieurs listes: la fonction
passées en paramètre doit prendre autant d’arguments que de listes
>>> map(lambda x,y: x+y, l1,l2)
Practical Programming in Python 21/02/22 25
Démo
LES LIST EN COMPRÉHENSION
• La notation en compréhension permet de définir une liste à partir d’une autre liste en
appliquant une fonction (~map) et/ou un filtrage (~filter)
[expression(x) for x in l]
[x for x in l if condition(x)]
[expression(x) for x in l if condition(x)] # {expr(x), ∀x ∈ l | cond(x)}
• >>> [3 * x for x in range(3) if x % 2 == 0]
[0, 6]
Practical Programming in Python 21/02/22 26
Démo
LES DICT EN COMPRÉHENSION
• La notation en compréhension peut également être utilisée pour les dictionaires
{expression1(x):expression2(x) for x in l}
>>> d = {str(i): i for i in range(5)}
{"0": 0, "1": 1, "2": 2, "3": 3, "4": 4}
Practical Programming in Python 21/02/22 28
Démo
LA FONCTION REDUCE
• La fonction reduce prend en argument une fonction f (prenant elle même deux
arguments) et une liste l. Elle réduit la liste à une seule valeur calculée en
appliquant successivement f au résultat intermédiaire et à un élément de la liste :
reduce(f, [e1, e2, …, en]) renvoie f(…f(f(f(e1, e2), e3), …), en)
[e1, e2, e3, …, en]
f
…
f
reduce(f, [e1, e2, …, en])
⚠ Attention : la fonction reduce est définie dans le module functools.
from functools import reduce
Practical Programming in Python 21/02/22 29
Démo
LA FONCTION REDUCE
• Comment ré-implémenter join et sum à l’aide de reduce?
f
…
f
reduce(f, [e1, e2, …, en])
Practical Programming in Python 21/02/22 30
NOUVEAU PYTHON 3.10 : MATCH / CASE
• Permet de simplifier les if, elif, else
• Equivalent de switch / case dans d’autres langues de programmation.
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _: # attrape-tout, equivalent de else
<action_wildcard>
• subject doit être une donnée qui a un type et une forme
• Le subject est évalué dans le match
• Ensuite chaque case est testé (équivalent a faire des elif)
• Le case _ est équivalent a un else
• + [Link]
Practical Programming in Python 21/02/22 31
Démo
EXEMPLE
• On dispose d’un fichier contenant les noms et prénoms des enseignant·e·s et
assistant·e·s du cours d’Informatique 2, avec une ligne par enseignant·e et un espace
entre le nom et le prénom.
Huguenin Kevin
Diallo Alpha
Zufferey Noe
Velykoivanenko Lev
…
On veut leur envoyer un e-mail. Le client mail (le logiciel Mail ou le site web Gmail)
accepte une liste d’adresses e-mail de destinataires séparées par des points virgule ‘;’.
Les e-mails à l’UNIL sont systématiquement sous la forme pré[Link]@[Link]
• Comment générer une chaîne de caractère permettant de spécifier en une fois tous les
destinataires ? C’est à dire :
[Link]@[Link];[Link]@[Link];[Link]@[Link];
[Link]@[Link] …
Practical Programming in Python 21/02/22 32
À suivre…
# Stay safe!
(and $ % &)
Practical Programming in Python 21/02/22 33