\documentclass[fontsize=11pt, paper=a4, DIV=classic]{scrartcl}
\usepackage[french]{babel}

\usepackage{fontspec}
\setmainfont{Old Standard}
%\usepackage{libertine}
\usepackage{comment}
\usepackage{csquotes}

\usepackage[toc]{multitoc}
\usepackage{graphicx}
\usepackage{verse}
\usepackage{framed}
\usepackage[french]{varioref}
\usepackage{setspace}
\onehalfspacing


\subject{}
\title{Python}
\subtitle{Source: openclassrooms}
\author{}
\date{}

\usepackage{hyperref}
\hypersetup{pdfstartview=FitH, backref, colorlinks=true,
  linkcolor=blue, urlcolor=blue, linktocpage=true}%la dernière option est liée à la toc sur deux colonnes.


\usepackage[style=authortitle, backend=bibtex]{biblatex}
\DefineBibliographyStrings{french}{byeditor={{é}d.}}
\addbibresource{mabiblio.bib}



\begin{document}
\maketitle
\renewcommand{\contentsname}{Plan du cours}
\tableofcontents
\section{Premiers pas avec Python}

Crée en 1990, le langage Python tire son nom du fait que le créateur de ce langage est
un fan des comiques anglais les « Monthy PYTHON ». Pourquoi apprendre Python? D'abord parce que c'est un langage parfait pour débuter: il fonctionne sur tous les systèmes d’exploitation et vous n’avez pas à utiliser un logiciel spécifique pour voir le résultat de votre code. Par ailleurs, Python est le 4\up{e} langage le plus populaire selon l’index TIOBE et son usage est resté stable depuis une dizaine d’années. Pinterest, Instagram et le site du New York Times ont été développés en Python. Python est aussi un des langages principaux utilisés en \emph{data analysis} (analyse de données) et en \emph{machine learning} (apprentissage par la machine).

Le projet fil-rouge de ce cours est un programme qui ira chercher des citations de San Antonio sur Internet et les fera dire par un personnage de dessin animé au hasard. Voici les étapes que nous allons suivre:
\begin{itemize}
	\item Installer Python et faire connaissance avec la console

    \item Trouver comment “enregistrer” une citation et la retrouver plus tard.

    \item Créer des phrases sous la forme ‘<personnage> a dit : “<citation>”’ et la modifier automatiquement.

    \item Créer des listes pour stocker plusieurs citations et plusieurs personnages.

    \item Créer des “dictionnaires” pour attribuer plusieurs citations à un même personnage.

   \item  Enregistrer votre programme dans un fichier externe car il commence à faire plusieurs lignes !

    \item Interagir avec notre utilisateur : quand il tape “entrée”, le programme doit afficher une nouvelle citation. Quand il tape “B”, le programme s’arrête.

    \item Afficher une citation au hasard quand on lance le programme.

   \item  BONUS : Stocker nos citations et nos personnages dans un fichier externe.

    \item BONUS : Coder un petit robot qui va parcourir le Web à la recherche de citations et de personnages puis les stocker dans un fichier sur votre ordinateur.
\end{itemize}
    
\subsection{Installer Python}
Rendez-vous sur le site officiel de Python (\url{https://www.python.org/}) et cliquez sur Downloads. C'est avec la version 3 que nous travaillerons. Sous Windows, enregistrez le dossier à télécharger puis suivez les instructions. Quand l’installation est terminée, vous pouvez vous rendre dans Démarrer > Tous les Programmes. Vous devriez y voir un nouveau dossier Python contenant, notamment, Python et IDLE. 

Sous Mac, décompressez le dossier que vous avez téléchargé en double-cliquant dessus, puis cliquez de nouveau sur le document afin de lancer l’installation et laissez-vous guider. 

Sous Linux, Python est pré-installé dans la plupart des distributions Linux mais sa version est certainement obsolète. 

\subsubsection*{La console}
Petites révisions du cours de première année: la console (ou terminal) est un petit programme qui vous permet d’interagir directement avec votre ordinateur en parlant son langage. Lorsque vous utilisez un logiciel, chaque action que vous effectuez avec votre souris est traduite en langage informatique puis exécutée par votre ordinateur. La console vous permet d’aller plus vite puisque vous n’utilisez plus d’interface graphique pour traduire vos commandes. Cette console vous permet de vous déplacer dans l’ordinateur, d’en manipuler les fichiers et même de créer de petits programmes qui automatiseront certaines tâches. Lorsque vous interagissez avec la console, vous parlez en langage bash (sur Linux et Mac) ou en DOS (Windows).

Quelques rudiments pour survivre dans le monde déroutant de la console. Et d'abord pourquoi la console? Au départ, parce qu'on n'avait de toute façon pas le choix ! Les débuts de l'informatique et de la console remontent aux débuts des années 70, à une époque où un écran 2 couleurs était un luxe inimaginable et où la puissance de calcul de ces ordinateurs était cent fois plus faible que celle de n'importe quelle calculatrice d'aujourd'hui. Notez que:
\begin{itemize}
\item les commandes sont courtes, abrégées: écrire pwd est moins intuitif que diredansquelrepertoirejesuis mais ô combien plus rapide!
\item les commandes sont intuitives: il s'agit bien souvent d'une abréviation de termes (en anglais, évidemment).
\end{itemize}

Quand on sait se servir de la console, on va beaucoup plus vite qu'avec l'interface graphique. Vous vous rendrez compte à un moment qu'il y a des choses que seule la console peut faire et qu'il serait de toute façon vraiment inutile de recourir à une interface graphique pour les effectuer. Exemple: en mode graphique, allez dans un répertoire qui contient beaucoup de fichiers en tout genre : des fichiers texte, des images, des vidéos… Vous voudriez savoir combien il y a d'images JPEG dans ce dossier. À la console, en assemblant quelques commandes, on peut obtenir ce résultat sans problème: ls -l | grep jpg | wc -l

\subsubsection*{L'interpréteur Python}
L'interpréteur Python est un programme qui va comprendre les instructions écrites en Python et les “transformer” en langage binaire. Vous n’avez pas envie d’écrire une suite de 0 et de 1 pour que votre programme fonctionne, n’est-ce pas? Pour lancer l'interpréteur, il suffit d'entrer la commande python3.

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image1.png} 
\end{figure}

Sous Windows, lorsque vous installez Python, vous installez également un autre programme qui s'appelle IDLE. Il s'agit d'un logiciel qui vous permettra d'écrire du code Python et de l'exécuter. Cliquez sur le menu Démarrer, puis sur Python et Idle. Une fenêtre s'ouvre et le programme vous invite à écrire des commandes. 

Vous pouvez maintenant coder en Python: pour commencer, tapez “7 + 7”. L'intepréteur vous répond : 14. Poursuivons: voyons ensemble comment enregistrer dans la console une première citation.

\subsection{Le vocabulaire de Python}
Nous venons de voir qu'on pouvait se servir de l'interpréteur comme calculatrice. Mais il est également possible de lui demander de conserver des informations en mémoire. 
Chaque information que vous souhaitez réutiliser plus tard s’appelle une variable. Il s’agit d’un concept basique en programmation et que vous retrouverez dans tous les langages. 

NB: une variable garde en mémoire une information tant que l’interpréteur Python est ouvert. Si vous quittez le programme puis le redémarrez (en tapant  exit()  puis  python3  par exemple), toutes vos variables seront effacées. Python a la mémoire courte !

Pour définir une variable, il faut taper son nom, un signe égal puis sa valeur entre guillemets (si la	 valeur est une chaîne de caractères). Définissons une variable correspondant à une citation de San Antonio (notre hypothèse de départ), sachant que le nom de la variable est quote: \texttt{quote="Ecoutez-moi, Monsieur Shakespeare: Nous avons beau être ou ne pas être, nous sommes!"} 

Retenez que seules les chaînes de caractère sont entourées de guillemets (c'est le cas des citations). D'autres types d’informations (appelées objets en Python) vont être entourés de parenthèses ou de crochets. Pourquoi ne pas avoir la même syntaxe? Parce que la nature des objets diffère. Exemple: si vous tapez  4 + 4 , vous vous attendez à ce que l’interpréteur vous retourne  8.
Et si vous voulez ajouter deux mots les uns à la suite des autres, vous utiliserez certainement le même opérateur, le +:  "tire-" + "bouchon"  et la console vous retournera…  "tire-bouchon". Vous ne voulez pas les additionner, comme avec un nombre, mais bien les concaténer. 

Quels sont les types d'objets qu'on peut créer avec Python?
\begin{itemize}
\item \textbf{des nombres}: il existe deux grands types de nombres en Python : les entiers (\emph{integers}) et les décimaux (\emph{floats}). Tous deux n’ont besoin ni de guillemets, de parenthèses ou de crochets. Notez que les décimales se situent après un point. Ex.: my\_float = 1.3
\item \textbf{des chaînes de caractères}: comme on l'a vu, il s’agit d’un ensemble de signes (lettres, chiffres, ponctuation, caractères spéciaux, …) délimités par des guillemets ouvrants et des guillemets fermants. NB: vous pouvez également insérer des guillemets à l’intérieur des guillemets à condition de les échapper (en utilisant le \textbackslash) ou de ne pas utiliser les mêmes. Exs.: quote = "San Antonio a dit : 'Ecoutez-moi, Monsieur Shakespeare'" ou quote = "San Antonio a dit : \textbackslash"Ecoutez-moi, Monsieur Shakespeare\textbackslash"".
\item \textbf{des booléens}: un booléen est une information Vraie ou Fausse. Ce type nous sera très utile un peu plus tard lorsque nous commencerons à comparer des valeurs entre elles. Sans surprise, vrai est \emph{True} et faux est \emph{False}  (pensez aux majuscules).
\item \textbf{des listes}: on les reconnaît aisément car elles sont entourées de crochets et comprennent des valeurs séparées par des virgules. Ex.: characters = ["Babar", "Betty Boop", "Calimero"]. Pour accéder à un élément stocké, il faut écrire le nom de la liste puis sa position entre crochets. Par exemple, si nous souhaitons accéder au premier élément de la liste characters :  characters[0]. NB: la position du premier élément d’une liste est le 0.
\item \textbf{des tuples}: ils servent à créer des structures dont le nombre d'éléments ne bouge pas. On dit qu’ils sont immuables car leur structure ne peut pas changer. On ne peut ajouter ou supprimer un élément. Ils commencent par une parenthèse ouvrante, un ensemble d’objets séparés par des virgules et une parenthèse fermante. Ex.: représenter les coordonnées géographiques d'une ville: paris = (48.856578, 2.351828).
\item \textbf{des dictionnaires}: un dictionnaire est un ensemble de valeurs auxquelles vous pouvez accéder grâce d’autres objets (des chaînes de caractères par exemple). Ex.: 

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image2.png} 
\end{figure}

Nous pouvons utiliser un dictionnaire pour stocker toutes nos citations et tous nos personnages, par exemple. Pour définir un dictionnaire, il faut commencer par écrire une accolade ouvrante, puis indiquer la première clé, deux points et la valeur associée, et enfin ajouter une accolade fermante. Ex.: my\_dictionary = \{'key': 'value'\}. Accéder à une valeur se fait de la même manière que pour une liste mais au lieu d’indiquer sa position (0, 1, 2, …) vous utiliserez sa clé. Ex.: my\_dictionary['key'].
\end{itemize}


\paragraph{Exercice}
Créez différentes variables pour stocker les éléments suivants :
\begin{itemize}
\item group : le nom de votre groupe de musique préféré
\item year : l'année de formation du groupe
\item still\_together : sont-ils encore ensemble 
\item albums : la liste de leurs albums
\item foundin\_gmembers : un tuple qui stocke le nom des membres fondateurs
\item songs : un dictionnaire qui contient les chansons de leurs albums
\end{itemize}


\begin{figure}[h]
\centering
\includegraphics[scale=0.5]{images/image3.png} 
\end{figure}

\subsection*{Questions}

   \textbf{Question 1}

    Pourquoi l'inventeur de Python a-t-il choisi ce nom ?

        Il aimait beaucoup les serpents.

        Il aimait beaucoup le groupe d'humoristes Monty Python.
    
  \textbf{Question 2}

    Python est très utilisé dans les domaines suivants :

        Big data

        Application mobile pour iPhone (iOS)

        Web

        Robotique
    
   \textbf{Question 3}

    Pour installer Python, vous pouvez :

        Télécharger un dossier sur www.python.org puis suivre les étapes.

        Il n'y a rien à faire, la dernière version de Python est installée par défaut sur tous les ordinateurs.

        Ecrire une ligne de commande dans la console (Mac ou Linux).
  
   \textbf{Question 4}

    Python 3 est rétrocompatible, c'est à dire que vous pouvez travailler sur des fichiers utilisant la version 2 de Python si vous avez installé la version 3.

        Vrai

        Faux
    
    \textbf{Question 5}

    La console (pas l'interpréteur) sert à...

        Naviguer dans un ordinateur en ligne de commande.

        Lancer des programmes en ligne de commande.

        Coder en Python (vous pouvez écrire  7 + 7  et la console affichera  14 )
    
    \textbf{Question 6}

    L'interpréteur Python (pas la console) sert à...

        Ecrire du code Python.

        Se déplacer dans l'ordinateur en langage Bash ou DOS (je peux écrire  ls ).
  
    \textbf{Question 7}

    Une chaine de caractère est :

        Un ensemble de chiffres et de lettres encadrés par des guillemets simples ou doubles. Exemple :  "Ceci est une chaîne" 

        Un ensemble de caractères spéciaux sans guillemets. Exemple : les crochets, les parenthèses, etc.

        Un ensemble de chiffres et de lettres à la suite, sans majuscule, espace ou caractère spécial. Exemple :  ceci\_est\_une\_chaîne 
   
    \textbf{Question 8}

    Une variable est :

        Un ensemble de chiffres et de lettres encadrés par des guillemets simples ou doubles. Exemple : "Ceci est une variable"

        Un ensemble de chiffres et de lettres à la suite, sans majuscule, espace ou caractère spécial, qui sert à sauvegarder une valeur pour la réutiliser ultérieurement. Exemple :  ma\_variable = "Une valeur" 
   
    \textbf{Question 9}

    Une liste organise un ensemble de valeurs. On peut retrouver ces valeurs grâce à leur position (leur index) dans la liste. Exemple :  ma\_liste = ["chien", "chat"] 

        Vrai

        Faux
    
    \textbf{Question 10}

    Un dictionnaire organise un ensemble de valeurs. On peut les retrouver grâce à leur clé. Exemple :  mondict = {"one": "un", "two": "deux"} 

        Vrai

        Faux
        
\section{Poser les fondations d'un programme}
\subsection{Créer son premier script}
Force est de constater qu’il devient de plus en plus compliqué de travailler avec l’interpréteur. Quand vous le quittez, tout s’efface et il faut donc se souvenir du code créé. De plus, vous ne pouvez pas modifier facilement une variable. Nous allons donc créer un fichier externe qui conservera nos commandes, puis lancer ce fichier avec python. Au lieu d’entrer, à la main, chaque commande, il suffira donc de lancer le programme. 

Travailler avec un fichier externe se fait en deux étapes : il faut d'abord créer le document puis l'exécuter. 
\begin{enumerate}
\item Avant de créer le fichier, pensez à créer un dossier (par exemple "cours") dans lequel vous allez l'enregistrer. Pour créer le fichier, ouvrez un éditeur de textes: vous nommerez le fichier san\_antonio.py. Pour qu'il ne soit pas vide, écrivez: print("Hello world!") et sauvegardez.
\item Pour exécuter le fichier, au terminal allez dans votre dossier "cours" et lancez python: python3 san\_antonio.py\footnote{Sous Windows, utilisez IDLE. Dans le menu, cliquez sur File > New File puis sauvegardez. Pour lancer votre programme, cliquez sur Run > Run Module. IDLE va exécuter votre programme dans l'interpréteur Python qui était déjà ouvert.}.
\end{enumerate}

Nous pouvons maintenant sauvegarder dans notre fichier le code dont nous avons besoin pour notre programme. Notez que nous avons besoin d'indiquer dans quel encodage nous souhaitons travailler.

\begin{figure}[h]
\includegraphics[scale=0.4]{images/image4.png} 
\end{figure}

\subsection{Comparer les valeurs avec les opérateurs}
Intéressons-nous maintenant à l’interaction avec l’utilisateur. La première phrase qui s’affichera sera une citation au hasard. Puis, nous proposerons deux alternatives : si l’utilisateur tape "B", le programme se ferme, sinon une nouvelle citation apparaît. Nous allons commencer par écrire du pseudo-code, c’est-à-dire écrire ce que nous voulons que le programme fasse avec nos propres mots. Il s’agit d’une pratique très courante chez les développeurs. Et c'est l'anglais qui est d'usage (possibilité de partager avec des non-francophones, pas de caractères accentués).

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image5.png} 
\end{figure}

On distingue les opérateurs de comparaison des opérateurs mathématiques:

\paragraph{Les opérateurs de comparaison} Commençons par découvrir les opérateurs qui nous permettront de comparer user\_answer et B. La logique voudrait qu’on utilise le signe  =  pour comparer deux valeurs. Mais, comme on l'a vu, ce signe est déjà utilisé pour assigner une valeur à une variable. C’est pourquoi nous doublons le signe égal par un autre égal pour signifier la comparaison, comme ceci: == . Les opérateurs de comparaison renvoient un booléen (True ou False) car vous posez une question fermée : c’est vrai ou ça ne l’est pas. Voici la syntaxe:

Égal: 1 == 1

True

Différent: 1 !=2

True

Supérieur: 1 > 2 ou Inférieur 2 < 1

False

Supérieur ou égal: 1 >= 2 ou Inférieur ou égal:  2 <= 1

False

\paragraph{Les opérateurs mathématiques}
Ce sont les signes + - * / auxquels s'ajoute le modulo noté \%: il s'agit du reste quand une division ne tombe pas juste. Ex.: 14 \% 5 --> le modulo est 4.

\subsection{Ajouter un peu de logique avec les conditions}
Nous savons comment comparer deux valeurs, mais nous ne savons pas encore comment écrire des conditions. Voici la syntaxe:

\paragraph{La condition if} 

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image6.png} 
\end{figure}

%if user\_answer == "B":

%\hspace{1\vgap}    \# leave the program

\texttt{Commentaire:} vous commencez par écrire if, puis vous indiquez la condition à remplir et terminez la ligne par deux points (sans espace avant). Vous indiquez les actions à effectuer juste en-dessous. Afin de différencier ces actions, qui sont à l’intérieur d’une condition, du reste de votre programme, vous ajoutez quatre espaces au-début de la ligne. Nous appelons cela l’indentation et Python est très strict sur le sujet.


\paragraph{else} Comment définir ce que se passe si la condition n’est pas remplie ? En utilisant else:

if user\_answer == "B":

\hspace{1\vgap}    \# leave the program

else:

\hspace{1\vgap}    \# show another quote
    
     

\paragraph{elif} Vous pouvez également proposer d’autres choix grâce au mot-clé elif  (contraction de else et if):

if user\_answer == "B":

\hspace{1\vgap}   \# leave the program

elif user\_answer == "C":

\hspace{1\vgap}    print("Essaie encore!")

else:

\hspace{1\vgap}    \# show another quote
    
\paragraph{pass} Pour quitter le programme, on utilise le mot-clé: pass.

\subsection{Structurer son programme grâce aux fonctions}
Revenons à la première phrase de notre programme: \# Show random quote. Il nous faut donc une liste composée d'au moins deux citations:

quotes = ["Ecoutez-moi, Monsieur Shakespeare, nous avons beau être ou ne pas être, nous sommes !", "On doit pouvoir choisir entre s'écouter parler et se faire entendre."]

Afin d’afficher dans le terminal une citation au hasard, nous devons avant choisir une position aléatoirement dans la liste. Il nous faut donc commencer par chercher comment Python peut nous renvoyer un nombre compris entre une valeur minimale (0, le début de la liste) et une valeur maximale (le nombre total d’items - 1).
Je vous propose de diviser cette étape en plusieurs sous-étapes :

\# Show random quote:

\hspace{1\vgap}    \# get a random number

\hspace{1\vgap}    \# get a quote from a list

\hspace{1\vgap}    \# show the quote in the interpreter
    
\paragraph{Fonctions}
Pour pouvoir stocker cet ensemble d'actions, nous allons utiliser une fonction. Une fonction est un ensemble de commandes regroupées sous un nom unique. Pour définir une fonction, vous utilisez le mot-clé def, suivi d’un nom, de parenthèses et de deux points. Puis vous indentez tout ce qui se trouve à l’intérieur. Exemple :

def get\_random\_quote():

\hspace{1\vgap}   \# get a random number

\hspace{1\vgap}   \# get a quote from a list

\hspace{1\vgap}   \# show the quote in the interpreter

\hspace{1\vgap}      pass
    
Ensuite, pour exécuter la fonction, il suffit d'écrire son nom: get\_random\_quote()

\paragraph{Paramètres}
Les paramètres sont des variables que vous fournissez à votre fonction et figurent dans les parenthèses. En effet, l’intérêt d’une fonction est de pouvoir être réutilisée dans des contextes différents. Par exemple, notre fonction actuelle affichera une citation au hasard, mais nous voudrons certainement en faire de même pour les personnages. Allons-nous copier / coller la fonction et changer son nom ? Non. Nous allons simplement passer la liste en paramètre.%: voir la figure p. \pageref{parametres}.


\begin{figure}[h]
\includegraphics[scale=0.5]{images/image7.png}
\label{parametres} 
\end{figure}

NB: le dièse permet de commenter le code: vous pouvez ainsi laisser des annotations qui vous aideront à mieux comprendre ce que vous écrivez.

\bigskip

\bigskip

\bigskip

Python contient de nombreuses fonctions qui rendent la vie plus simple. Vous voulez connaître le type d’un objet ? Utilisez type(MyObject). Vous voulez afficher une valeur ? Utilisez  print(my\_value).

%Une des fonctions par défaut très utiles est  input(mon\_message). Elle vous permet de demander son avis à l’utilisateur. Le message affiché est passé en paramètre à la fonction. Quand elle est exécutée, elle renvoie la valeur saisie par l’utilisateur. Pour l’utiliser vous devez l’assigner à une variable.
%
%\begin{figure}[h]
%\includegraphics[scale=0.5]{images/image8.png} 
%\end{figure}

Une fonction exécute un ensemble d’actions mais, par défaut, elle ne renvoie pas d’information spécifique. Pour que votre fonction renvoie une certaine valeur, utilisez le mot-clé \emph{return}:

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image9.png}
\end{figure}

Votre programme san\_antonio.py s'est étoffé au fur et au mesure. Exécutons-le au terminal:

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image10.png}
\end{figure}

\subsection{Répéter une action grâce aux boucles}
Python nous offre deux boucles principales : \texttt{while} et \texttt{for}. 

\paragraph{La boucle while} While est la traduction de “tant que...”. Concrètement, la boucle s’exécutera tant qu’une condition est remplie (donc tant qu’elle renverra la valeur True). Reprenons le cas de notre programme de citations: nous affichons une citation tant que la réponse de l’utilisateur n’est pas B.

while user\_answer != ‘B’:

\hspace{1\vgap}    print(get\_random\_item\_in(program['quotes']))

Voici notre programme complété par cette boucle:

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image11.png}
\end{figure}

Si vous exécutez le programme, vous vous apercevrez que l’interpréteur vous affiche, en boucle, le même message ! En effet, nous sommes dans une boucle infinie: la valeur de  user\_answer  étant  A, et la boucle ne se terminant que si  user\_answer  est égal à  B, le programme ne se termine jamais. Pour fermer la boucle, il faut utiliser la variable  user\_answer = "B" à la fin du programme.

\paragraph{La boucle for} Imaginons que nous voulons utiliser une boucle pour mettre en majuscule chaque nom de personnage. Voici la syntaxe:

for item in a\_list:

\hspace{1\vgap}    \# do something

Si on applique cette syntaxe à notre exemple précis, voici ce qu'il faut écrire:

for quote in quotes:

 \hspace{1\vgap}   quote.capitalize()
 
Notez que certaines fonctions sont réservées à certains objets: on ne peut mettre en majuscule que des mots, par exemple. C’est ce qui s'appelle des méthodes.

\subsection*{Questions}
\textbf{Question 1}

Pour lancer l'interpréteur Python, j'écris dans la console le mot suivant :  python (oupython3, selon votre système d'exploitation).

    Vrai

    Faux

\textbf{Question 2}

Pour lancer un programme  mon\_fichier.py  qui utilise Python, j'utilise la commande suivante :

     python mon\_fichier.py -o python 

     python mon\_fichier.py 

     python 

     python5 
     
\textbf{Question 3}

Comment comparer si deux valeurs sont différentes ?

     a != b 

     a == b     
     
\textbf{Question 4}

Comment comparer que deux valeurs sont égales ?

     a = b 

     a == b 
     
\textbf{Question 5}

Modulo est représenté par un signe pourcentage (\%). Il sert à:

    Changer le contenu d'une variable.

    Enregistrer des échantillons de notes d'instruments de musique.

    Réaliser une division et renvoyer l'entier restant.   

\textbf{Question 6}

Je souhaite afficher le message "I'm aliiiiiiiiiiiive !" si le contenu de la variable est "Sia". Comment faire ?

A/ if only singer = "Sia":

\hspace{1\vgap} print("I'm aliiiiiiiiiiiive!")

B/ if singer == "Sia":

\hspace{1\vgap}  print("I'm aliiiiiiiiiiiive!")
  
C/ only singer = "Sia":

\hspace{1\vgap} print("I'm aliiiiiiiiiiiive!")

D/ if singer == "Sia"

print("I'm aliiiiiiiiiiiive!")

\textbf{Question 7}

Le mot-clé  pass  est notamment utilisé :

    Pour vérifier que deux valeurs sont identiques.

    à l'intérieur d'une fonction pour que celle-ci s'exécute même si elle ne contient aucune "action".

\textbf{Question 8}

Pour créer une nouvelle fonction "message" qui prend deux paramètres ("recipient" et "sender"), j'écris :

A/ def message(recipient, sender):

\hspace{1\vgap}   pass

B/ func message(recipient, sender):

\hspace{1\vgap}    pass
  
C/ function message(recipient, sender):

D/ def message recipient, sender

\hspace{1\vgap}    pass


\textbf{Question 9}

Pour utiliser une fonction dans votre code, vous suivez ces deux étapes :

    Exploration et indexation

    Définition et exécution

    Vérification et exécution
    
\textbf{Question 10}

La fonction  print()  sert notamment à...

    Envoyer votre code chez l'imprimeur.

    Afficher le message passé entre paramètres dans la console.

    Concaténer deux valeurs.    
    
\section{Manipuler des objets}
\subsection{Modifier des chaînes de caractères}
Chaque type d’objet dispose de différentes méthodes qui nous permettent d’interagir avec lui. Une méthode est une fonction associée à un type d’objet bien précis. En d’autres termes, une action que seul ce type d’objet peut faire. Étudions seulement les méthodes les plus utiles:

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image12.png}
\end{figure}

Une dernière méthode, très utilisée, vous permet de remplacer des valeurs à l’intérieur d’une chaîne à la manière d’un texte à trous. Il s’agit de la méthode format(). Chaque variable que nous souhaitons utiliser est entourée d’accolades puis définie en paramètres. 

\textbf{Exemple :} 
"\{character\} a dit : \{quote\}".format(character="Babar", quote="Tout n'est pas cirrhose dans la vie, comme dit l'alcoolique.")

Sachez qu'il est plus usuel de ne pas définir de variable et de se contenter de donner les valeurs à remplacer dans le même ordre que la phrase: 

"\{\} a dit : \{\}".format("Babar", "Tout n'est pas cirrhose dans la vie, comme dit l'alcoolique.")

\paragraph{Exercice} Créez une fonction create\_message qui prend deux paramètres : character et quote. À l'intérieur, utilisez la méthode .format() pour créer une chaîne de caractère sur ce modèle : "\{character\} a dit : \{quote\}".
Enfin, exécutez la fonction avec le personnage et la citation de votre choix.

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image13.png}
\end{figure}


\subsection{Ranger des données dans des listes}
Nous avons vu précédemment comment accéder à la première valeur d’une liste ou d’un tuple :  my\_list[0] (vous vous souvenez que le premier index d'une liste est toujours 0). Mais comment accéder aux valeurs suivantes ? En indiquant son index entre crochets. Ainsi, pour accéder au quatrième élément d'une liste, on écrira: my\_list[3] et pour accéder au dernier élément d'une liste: my\_list [-1]. Voici d'autres méthodes (ajouter, modifier ou supprimer un élément).

\begin{itemize}
\item Ajouter un élément à la fin de la liste: \texttt{characters.append("Mowgli")}
\item Ajouter un élément à un certain index. Le premier argument est l’index, le second la valeur à insérer:  \texttt{characters.insert(4, "Balou")}
\item Modifier un élément : y accéder grâce à son index et lui donner une nouvelle valeur: \texttt{characters[1] = "La Fée Clochette"}
\item Supprimer un élément de la liste sans renvoyer sa valeur: \texttt{characters.remove("Mowgli")}
\end{itemize}

\paragraph{Exercice} Créez une liste qui s'appelle characters et qui contient 5 personnages de dessins animés. Puis supprimez un des personnages de la liste. Ajoutez ensuite un personnage à votre liste. Enfin, remplacez "Mowgli" par "Balou".

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image15.png}
\end{figure}

\newpage

\subsection{Organiser des données dans un dictionnaire}
Nous avons déjà vu comment accéder à la valeur d’un élément stocké dans un dictionnaire : grâce à sa clé.

\textbf{Reprenons un exemple :}
program = \{"quotes": ["Ecoutez-moi, Monsieur Shakespeare, nous avons beau être ou ne pas être, nous sommes !", "C'est vraiment trop injuste!"]\}

Pour accéder aux éléments d’une liste qui est elle-même dans un dictionnaire, il faut ajouter  l’index de l’élément souhaité à la suite, entre crochets : \texttt{program["quotes"][0]}. Quelles sont les autres méthodes qu'on peut utiliser?

\begin{itemize}
\item Remplacer ou ajouter une valeur : même méthode que pour une liste: \texttt{program["quotes"] = "Une nouvelle citation"}
\item Mettre à jour ou ajouter plusieurs valeurs en même temps: \texttt{program.update(\{"characters" : ["Père Noël"], "quotes": ["Une citation unique qui sera sauvegardée"]\})}
\item Supprimer une clé et renvoyer sa valeur. Vous pouvez utiliser cette même méthode sur une liste: 

program.pop("quotes")

\hspace{1\vgap} "quotes"
\end{itemize}

\subsection*{Questions}%bonne réponse=étoile
\textbf{Question 1}

Pour transformer une chaîne de caractères en liste, j'utilise la méthode suivante :

     .list() 

     .to\_list() 

     .split() *
     
\textbf{Question 2}

Pour supprimer les espaces blancs au début et à la fin d'une chaîne de caractères, j'utilise la méthode suivante :

     .without\_blanks() 

      .strip() *

      .remove\_blanks()   
      
\textbf{Question 3}

La méthode format s'utilise de la manière suivante:% 2 bonnes réponses

A/ "\{character\} a dit : \{quote\}".format(character="Babar", quote="Tout n'est pas cirrhose dans la vie, comme dit l'alcoolique.")

B/ "(character) a dit : (quote)".format(character="Babar", quote="Tout n'est pas cirrhose dans la vie, comme dit l'alcoolique.")

C/ "\{\} a dit : \{\}".format("Babar", "Tout n'est pas cirrhose dans la vie, comme dit l'alcoolique.")

D/ "[] a dit : []".format("Babar", "Tout n'est pas cirrhose dans la vie, comme dit l'alcoolique.")


\textbf{Question 4}

Pourquoi met-on un nombre entre parenthèses quand nous voulons exécuter une méthode sur cet objet ? Exemple :  (1.5).is\_integer() 

    C'est purement décoratif, je peux exécuter cette méthode sans les parenthèses.

    Sinon il y aurait trop d'ambiguïté : Python ne saurait pas si la méthode fait partie du nombre (pour former un décimal) ou s'il s'agit bel et bien d'une méthode. 
    
\textbf{Question 5}

Dans books = ["Cent ans de solitude", "Amours aux temps du Choléra",  "L'automne du Patriarche"], que représente books?

    une chaîne de caractères.

    une liste. *

    un dictionnaire.

    un tuple.
    
\textbf{Question 6}

Chaque élément d'une liste est associé à son index, c'est à dire à sa position.

    Vrai

    Faux
    
\textbf{Question 7}

Dans friends = {"Doctor Who" : "Le tardis", "Red" : "Storybrooke", "Frodon" : "La Terre du Milieu"}, que représente friends  ?

    une liste.

    un tuple.

    un dictionnaire. *

    une chaîne de caractères.

\textbf{Question 8}

Chaque élément d'un dictionnaire est associé à une clé.

    Vrai

    Faux
    
\textbf{Question 9}

 books = ["Cent ans de solitude", "Amours aux temps du choléra", "L'automne du patriarche"] 

Pour remplacer "L'automne du patriarche" par "Le Général dans son labyrinthe", j'écris :

    books[0] = "Le Général dans son labyrinthe"

    books[2] = "Le Général dans son labyrinthe" *

    books.replace("L'automne du patriarche", "Le Général dans son labyrinthe")
    
\textbf{Question 10}

 friends = {"Doctor Who" : "Le tardis", "Red" : "Storybrooke", "Frodon" : "La Terre du Milieu"} 

Pour remplacer "Le tardis" par "Gallifrey", j'écris :

    friends[0] = "Gallifrey"

    friends["Doctor Who"] = "Gallifrey" *

    friends.replace('Le tardis', "Gallifrey")   
    
\section{Utiliser des ressources externes} 
Python offre de nombreux modules par défaut qui vous permettent d’aller au-delà des fonctionnalités. Un module est comme une extension : elle vous donne accès à d’autres méthodes spécialisées. Afin de ne pas alourdir Python bien des modules ne sont pas chargés par défaut. Mais ils sont déjà installés sur votre ordinateur: il vous suffit de les activer en utilisant le mot clé  \texttt{import}  suivi du nom du module. %Exemple: \texttt{import turtle} puis \texttt{turtle.forward(100)}. Une fenêtre s’ouvre et Python dessine, pour vous, un trait ! Turtle est une librairie de dessin graphique. 

\subsection{Importer un module}
% Il faut bien sûr lancer python3 avant de commencer.
Prenons le module \texttt{random}: après l'avoir importé en utilisant la commande \texttt{import random}, la méthode \texttt{randint(a, b)} renvoie un nombre compris entre a et b (donnés en paramètre). Par exemple :  \texttt{random.randint(3, 7)} renverra un nombre entre 3 et 7 (compris).

Nous allons pouvoir mettre à jour notre fonction  \texttt{get\_random\_item(my\_list)}.

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image16.png}
\end{figure}

\paragraph{Commentaire} Voici comment comprendre chaque élément de la fonction:

\begin{itemize}
\item     0  : l’index de ma première citation est 0

\item     len(my\_list) - 1  : calcule le nombre d’items dans ma liste (puisque le premier index est 0).  my\_list[-1]  renverra le dernier objet de la liste.

\item     random.randint(0, len(my\_list) - 1)  : renvoie un nombre compris entre 0 et la longueur totale de ma liste.

\item     item = my\_list[rand\_numb]  : trouve l’item qui correspond à l’index déterminé au hasard.

\item     return\ item  : renvoie la valeur de l’item
\end{itemize}

Nous avons fini notre programme ou presque. Il ne reste plus qu'à ajouter autant de citations que l'on veut dans les deux premières listes, puis à lancer le programme. Pour éviter une saisie fastidieuse, nous allons récupérer des citations automatiquement depuis internet et les stocker dans un fichier externe.

\subsection{Stocker des citations dans un fichier avec le module JSON}
L'idéal est de stocker citations et personnages sous forme de dictionnaire: la meilleure manière de le faire est d’utiliser un format de données qui s’appelle JSON (JavaScript Object Notation). Ce format est souvent utilisé pour représenter le contenu d’une page web car il est très facile d’imbriquer des listes à l’intérieur d’autres listes. Avant de l'utiliser, pensez à l'importer: \texttt{import json}.

Chaque valeur ayant forcément une clé, voici la manière dont nous allons stocker nos objets : \texttt{\{"nom\_objet": "valeur"\}}. Commençons par les citations. Créons un nouveau document quotes.json et remplissons-le :

[\{"quote": "Ecoutez-moi, Monsieur Shakespeare, nous avons beau être ou ne pas être, nous sommes !"\},

\{"quote": "C'est vraiment trop injuste!"\}]


Faisons de même pour les personnages dans un fichier characters.json:

[\{"character": "Babar"\},

\{"character": "Calimero"\}]


\bigskip

Je veux maintenant lire le fichier characters.json et le convertir en liste. Voici ce qu'il en est en pseudo-code:

def read\_values\_from\_json():

\hspace{1\vgap}    \# Create a new empty list
 
\hspace{1\vgap}    \# open a json file with my objects

\hspace{1\vgap}    \# load all the data contained in this file

\hspace{1\vgap}    \# add each item in my list

\hspace{1\vgap}    \# return my completed list

\bigskip

Complétons avec ce qu'on sait déjà faire:

def read\_values\_from\_json():

\hspace{1\vgap}    values = []

\hspace{1\vgap}    \# open a json file with my objects

\hspace{1\vgap}    \# load all the data contained in this file. data = entries

\hspace{1\vgap}    for entry in data:

\hspace{2\vgap}        values.append(entry["character"])

\hspace{1\vgap}    return values

\bigskip

Il reste deux points à traiter. Le premier consiste à charger un document: nous utiliserons la méthode  \texttt{open('path\_to\_file')} qui est souvent utilisée avec un bloc \texttt{with}. Voici la fonction complétée:

def read\_values\_from\_json(key):

\hspace{1\vgap}    values = []

\hspace{1\vgap}    with open("characters.json") as f:

\hspace{1\vgap}    \# load all the data contained in this file. data = entries

\hspace{1\vgap}    for entry in data:

\hspace{2\vgap}        values.append(entry["character"])

\hspace{1\vgap}    return values

\bigskip

Il ne reste plus qu'à charger le contenu d'un fichier json et le convertir en objet Python (car pour le moment ce n'est que du texte). Nous utiliserons la méthode \texttt{load}:

\begin{framed}
def read\_values\_from\_json(key):

\hspace{1\vgap}    values = []

\hspace{1\vgap}    with open("characters.json") as f:

\hspace{1\vgap}        data = json.load(f)

\hspace{1\vgap}        for entry in data:

\hspace{2\vgap}            values.append(entry["character"])

\hspace{1\vgap}    return values 
\end{framed}

\subsection{Collecter des citations automatiquement avec Scrapy}
La communauté Python est très active et a produit plusieurs milliers de modules. Pip est l’outil de gestion de paquets utilisé pour installer et gérer des modules externes. Il est installé automatiquement quand vous installez Python. Pour installer une librairie, voici la commande: \texttt{python3 -m pip install ma\_librairie}.

Une des librairies les plus populaires pour récupérer de l’information sur Internet est Scrapy. Il s’agit d’un scraper entièrement personnalisable, en d’autres termes un petit robot que vous pouvez configurer vous-même pour qu’il cherche ce que vous souhaitez. Installons-le: \texttt{python3 -m pip install scrapy}.

\paragraph{Le fichier requirements.txt} Une bonne pratique est de réunir toutes les librairies externes dans un fichier qui s’appelle requirements.txt  et qui se trouve à la racine de votre dossier (au même niveau que  san\_antonio.py ). Ainsi, il vous suffit d’écrire  \texttt{python3 -m pip install -r requirements.txt}  pour que toutes les librairies s’installent d’un seul coup. Pour un point sur le code avant d'utiliser Scrapy, voir les dernières captures de console en annexes.


\paragraph{Utiliser Scrapy} Commençons par créer un nouveau document: \texttt{characters\_scrapper.py}. Dans ce document, je colle le code fourni par Scrapy et je commence à l’adapter. Comment fonctionne un scraper ? Il va sur une url que nous lui donnons puis va trouver les éléments qui correspondent à un sélecteur CSS (Cascading StyleSheet) qui sert à la mise en page d'un site. Petit rappel:
\begin{itemize}
\item div:  sélecteur d’une balise HTML  div 
\item .myclass  : cible toutes les balises ayant cette classe
\item \#myid:  cible la balise ayant cet id
\item div .myclass  : cible tous les éléments ayant la classe  .myclass  contenus dans une balise  div
\end{itemize}

Prenons un exemple: rendez-vous sur cette page Wikipedia \url{https://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Personnage_d%27animation} 
qui affiche une liste de personnages que nous voulons récupérer. Afin de trouver le sélecteur, je clique droit sur l’élément que je souhaite cibler et je clique sur inspecter l’élément. Le sélecteur est le nom de la balise HTML (a dans mon cas). Voici le scraper:


\begin{figure}[h]
\includegraphics[scale=0.5]{images/image20.png}
\end{figure}

Pour récupérer les personnages, et les stocker dans un nouveau fichier characters.json , je lance la commande suivante :  \texttt{scrapy runspider characters.py -o characters.json}. Et là tous mes personnages apparaissent ! Vous voyez maintenant comment récupérer des informations grâce à un scraper. Pour information, ces robots sont utilisés par de nombreuses industries pour agréger les données “publiques” accessibles librement ou pour publier du contenu massivement en l’automatisant. Vous pourriez ainsi, tout à fait illégalement, scraper le site du Monde, copier l’intégralité des articles et les publier sur votre site. Il s’agit d’une technique si répandue que Google a créé un formulaire pour dénoncer les sites de scraping...


\newpage

\section*{Annexes}

Voici le fichier \texttt{san\_antonio.py}.

\textbf{Étape 1:}


\begin{figure}[h]
\includegraphics[scale=0.5]{images/image17.png}
\end{figure}
    
    
\newpage

\textbf{Étape 2:}

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image18.png}
\end{figure}

\newpage



\begin{figure}[h]
\includegraphics[scale=0.5]{images/image19a.png}
\end{figure}

\begin{figure}[h]
\includegraphics[scale=0.5]{images/image19b.png}
\end{figure}

\end{document}