\makeatletter
\@ifundefined{complet}
{\documentclass[10pt]{report}
\title{Python}
\newcommand{\categorie}{Python}
\input{latex_entete_perso}

\begin{document} %Cours

\setcounter{chapter}{6}
% xelatex -shell-escape cours_python
}
{}
\makeatother

\IfFileExists{variable_locale.png}{}{\write18{wget https://doc.infoforall.fr/activite/python/images/variables/variable_locale.png}}

\IfFileExists{variable_globale.png}{}{\write18{wget https://doc.infoforall.fr/activite/python/images/variables/variable_globale.png}}


\chapter{Créer un programme}

\section{structure et exécution d'un programme}

\begin{multicols}{3}


\subsection{Différence entre console interactive et programme}

\subsubsection{Cas de la console}

Lorsqu'une ligne contient \gras{uniquement une expression}, l'interpréteur l'\gras{évalue et affiche} le résultat.

\small{
\begin{minted}{python}
>>> a = 10
>>> b = a + 2
>>> b
12
\end{minted}
}

\subsubsection{Cas du programme}

Lorsqu'une ligne contient \gras{uniquement une expression}, l'interpréteur l'évalue et... c'est tout. \gras{Pas d'affichage}.

\begin{minted}[linenos=true, bgcolor=lightgray, tabsize=4, gobble=0, fontfamily=courier, fontsize=\small, xleftmargin=20pt, xrightmargin=5pt]{python}
a = 10
b = a + 2
b
\end{minted}

Dans un programme, si vous voulez voir quelque chose s'afficher, il faut le demander explicitement~:

\begin{minted}[linenos=true, bgcolor=lightgray, tabsize=4, gobble=0, fontfamily=courier, fontsize=\small, xleftmargin=20pt, xrightmargin=5pt]{python}
a = 10
b = a + 2
print(b)
\end{minted}

\end{multicols}

\subsection{COMMENTAIRES : expliquer le fonctionnement}

Les commentaires sont destinés à un lecteur humain et ils visent à rendre  \gras{le code interne facile à comprendre}. L'interpréteur Python ne tentera pas d'exécuter les commentaires. 

\begin{itemize}
\item \gras{Commentaire sur toute une ligne}

\begin{minted}[linenos=true, bgcolor=lightgray, tabsize=4, gobble=0, fontfamily=courier, fontsize=\small, xleftmargin=20pt, xrightmargin=5pt]{python}
# Toute cette ligne est un commentaire.
\end{minted}

\item \gras{Commentaire en fin de ligne}

\begin{minted}[linenos=true, bgcolor=lightgray, tabsize=4, gobble=0, fontfamily=courier, fontsize=\small, xleftmargin=20pt, xrightmargin=5pt]{python}
print("Bonjour tout le monde") # Ceci est également un commentaire
\end{minted}

\item \gras{Cette ligne ne comporte aucun commentaire puisque le \# fait juste partie d'un string.}

\begin{minted}[linenos=true, bgcolor=lightgray, tabsize=4, gobble=0, fontfamily=courier, fontsize=\small, xleftmargin=20pt, xrightmargin=5pt]{python}
print("Cette ligne ne contient pas de # commentaire")
\end{minted}

\end{itemize}   


       
\begin{multicols}{3}

\subsection{Structure d'un programme}

\begin{itemize}
\item \gras{Importation des modules nécessaires}.
\item \gras{Déclarations des CONSTANTES}.
\item \gras{Déclaration des variables globales} destinées à être lue depuis des fonctions : à utiliser avec modération.
\item \gras{Déclaration des fonctions}.
\item \gras{Les instructions du programme en lui-même}~: on nomme cette partie "programme principal" parfois. On y place également les variables globales qu'on envoie simplement en tant que paramètres.
\end{itemize}  


\paragraph{Convention} On sépare les parties par au moins deux lignes vides.


\subsection{Noms des variables globales et locales}

Deux utilisations des variables globales (voir le site)~:

\begin{itemize}
\item \gras{lues directement par les fonctions}. Pratique mais si vous changez le nom dans le programme, c'est l'ensemble des lignes de vos fonctions qu'il faut modifier.
\item \gras{transmises aux fonctions en tant que paramètres}. Avantage : le nom de la variable globale n'a pas d'importance.
\end{itemize} 

\subsection{Evitez les variables globales lues directement}
Trois raisons d'éviter la lecture directe~?
\begin{itemize}
\item Votre fonction n'est pas ré-utilisable dans un autre programme, à moins de d'utiliser les mêmes noms de variables.
\item Le moindre changement de nom de votre variable globale provoquerait l'échec de toutes fonctions qui utiliseraient l'ancien nom.
\item Dans un grand programme, quelqu'un pourrait avoir l'idée de créer une nouvelle variable globale qui aurait malheureusement le même nom que la votre.

\end{itemize} 

\end{multicols}




\section{IHM console}

\begin{multicols}{3}

\subsection{IHM Console}

Le disposif qui permet de faire interagir deux systèmes sans connaître les détails de fonctionnement de l'autre se nomme une \gras{interface}. Lorsque l'interface se fait entre un homme et une machine, on la nomme \gras{IHM : Interface Homme Machine}.

L'IHM-console gère l'interaction avec \fo{print()} et \fo{input()}.


\subsection{\fo{print()}}

\subsubsection{Affichage avec \fo{print()}}

\small{
\begin{minted}{bat}
>>> a = "Salut à toi !"
>>> print(a)
  Salut à toi !
\end{minted}
}

\subsubsection{Aucune mémoire avec \fo{print()}}

On ne \remarque{mémorise pas} l'information affichée avec \fo{print()}.

\paragraph{Exemple explicite} : on récupére dans \fo{rep} la réponse de la fonction \fo{print()}. rep ne contient rien.

\small{
\begin{minted}{bat}
>>> a = "Reçu ?"
>>> rep = print(a)
  Reçu ?
 
>>> rep
>>>
\end{minted}
}

\subsubsection{Que peut-on envoyer comme entrée à \fo{print()} ?}

Tout ce que vous voulez.

\subsubsection{Plusieurs arguments}

On peut envoyer plusieurs arguments en les séparant par des virgules.

\begin{minted}[linenos=true, bgcolor=lightgray, tabsize=4, gobble=0, fontfamily=courier, fontsize=\small, xleftmargin=20pt, xrightmargin=5pt]{python}
c = 15
print("Var c : ", c)
\end{minted}

\small{
\begin{minted}{python}
  Var c : 15
\end{minted}
}

\subsubsection{\fo{f}-string}

On utilisera plutôt un \remarque{\fo{f}-string}. C'est un string :

\begin{itemize}
\item Précédé d'un \fo{f}
\item Pouvant contenir des \gras{expressions entre accolades} qui seront évaluées puis affichées.
\end{itemize}

\begin{minted}[linenos=true, bgcolor=lightgray, tabsize=4, gobble=0, fontfamily=courier, fontsize=\small, xleftmargin=20pt, xrightmargin=5pt]{python}
c = 15
print(f"Var c : {c}")
\end{minted}

\small{
\begin{minted}{python}
  Var c : 15
\end{minted}
}

\subsection{print() et caractères de contrôle}

Les caractères de contrôle n'affichent rien mais provoquent un effet)~: le passage à la ligne \fo{/n}, la tabulation \fo{/t}...

Pour provoquer l'effet voulu, il faut utiliser \fo{print()}.

Pour connaitre le code UNICODE d'un caractère, il faut utiliser \fo{ord()}.
Signature : \fo{ord(str) -> int}

Pour connaître le caractère correspondant à un numéro, il faut utiliser \fo{chr()}.
Signature : \fo{chr(int) -> str}

\subsection{Un print() n'est pas un return !}

La fonction \fo{print()} ne renvoie rien. Il faut lire l'énoncé :

\begin{itemize}
\item fonction qui renvoie : mot-clé \fo{return}
\item fonction qui affiche : fonction \fo{print()}
\end{itemize}



\subsection{\fo{input()}}

\subsubsection{Principe fondamental}

La fonction native \fo{input()} récupère la réponse tapée au clavier \gras{sous forme d'un string, même les nombres}. Pour valider la réponse, il faut appuyer sur entrée \fo{↲}.

\small{
\begin{minted}{bat}
>>> note = input()
18↲
 
>>> note   >>> note * 2
'18'       '1818'
 
\end{minted}
}
 
\subsubsection{Récupérer un entier ou un flottant}

Il faut tenter de convertir le string reçu en integer, en utilisant la fonction native \fo{int()} ou \fo{float()}.

\small{
\begin{minted}{bat}
>>> reponse = int(input())
5↲
 
>>> reponse  >>> reponse * 3
5            15 
 
\end{minted}
}

\subsubsection{Utilisation complète}

On peut aussi lui transmettre un string contenant la question.

\fo{reponse = input("Veuillez fournir un nombre entier : ")}

Python va alloir faire trois choses :

\begin{itemize}
\item Afficher votre message mais \gras{sans passage à la ligne}.
\item Récupérer la réponse \gras{sous forme d'un string}
\item Placer ce string dans \fo{reponse}
\end{itemize}
    
\small{
\begin{minted}{bat}
>>> reponse = int(input("Note ? "))
Note ? 5↲
 
>>> reponse
5
\end{minted}
}
 
\subsubsection{Et en cas d'impossibilité de conversion ?}

HP. Voir le site pour \fo{try...except}.


\end{multicols}



\input{licence}

\makeatletter
\@ifundefined{complet}
{\end{document}}

{}
\makeatother

