From a439c5775708f2613d8bd9d1a14b478d283b4d6d Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Tue, 6 Dec 2022 16:05:35 +0100 Subject: [PATCH] Include a part about dictionaries --- chapters/python.tex | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/chapters/python.tex b/chapters/python.tex index 7155198..40a7e35 100755 --- a/chapters/python.tex +++ b/chapters/python.tex @@ -122,6 +122,63 @@ Il suffit dès lors de réaliser la soustraction matricielle entre deux objets d En fait, l'intérêt concerne surtout la représentation de nos modèles, puisque chaque classe du modèle est représentée par la définition d'un objet Python. Nous pouvons donc utiliser ces mêmes \textbf{dunder methods} (\textbf{double-underscores methods}) pour étoffer les protocoles du langage. +\section{Structures de données} + +Les principales structures de données sont : + +\begin{itemize} + \item Les listes (y inclus les tableaux) et tuples + \item Les dictionnaires (y inclus les \texttt{maps}) + \item Les \textit{namedtuples} et \textit{dataclasses} + \item Les classes +\end{itemize} + +\subsection{Dictionnaires} + +Dans le langage Python, un dictionnaire est un objet. +Cela signifie qu'il ne se limite pas à modéliser une structure de données, mais qu'il embarque son propre comportement, avec ses méthodes. + +Au hasard des internets multimédias, on est tombé sur un morceau de code à base de \texttt{pop} et de réinitialisation. +Quelque chose comme ceci: + +\begin{minted}{python} +width = OPT_CMD_ARGS.pop(width_arg_name) +heigth = OPT_CMD_ARGS.pop(heigth_arg_name) +args_list.append(width) +args_list.append(heigth) +OPT_CMD_ARGS[width_arg_name] = width +OPT_CMD_ARGS[heigth_arg_name] = heigth +\end{minted} + +Techniquement, un dictionnaire est mutable et peut donc être modifié. +Dans ce cas-ci, le dictionnaire sert à récupérer l'association entre un nom de paramètre et sa valeur pour la ligne de commande. +Le `pop` est donc utilisé uniquement pour récupérer une valeur: dans ce cas, il est possible d'utiliser la méthode `get`, qui permettra de définir une valeur par défaut: + +\begin{minted}{python} +>>> canevas = dict() # on aurait aussi pu déclarer le dictionnaire avec canevas = {} +>>> canevas["a"] # avec un accès direct, si la clé n'existe pas, une exception est levée +Traceback (most recent call last): + File "", line 1, in +KeyError: 'a' +>>> canevas.get("a", "abracadabra") # par contre, si on utilise get, aucune exception n'est levée +'abracadabra' +>>> canevas +{} +\end{minted} + +Y'a une méthode du fieu de dieu: `setdefault` ! +en gros, ça te retourne la valeur de la clé si elle existe, et si pas, cela te crée une nouvelle clé et te la retourne: + +\begin{minted}{python} +>>> d = {} +>>> d.setdefault(1, "Yolo") +'Yolo' +>>> d +{1: 'Yolo'} +\end{minted} + +Ca évite, dans une boucle, de vérifier si la clé existe déjà, et si pas, de la créer + \section{The Zen of Python} (aussi connue sous PEP20 ;)) \index{PEP!PEP20}