python lire

Identification

Infoforall

7 - Interface Console


L'une des raisons de cette activité est de découvrir comment on peut utiliser le mode DEBUG de Thonny. Vous allez normalement obtenir des affichages erronés et des erreurs tout court. Le mode DEBUG vous permettra de voir d'où vient le problème.

Le disposif qui permet de faire interagir un humain et un système informatique se nomme une interface.

L'interface basique disponible dans Python est la console, purement textuelle.

Nous avons vu comment un programme pouvait afficher des informations à destination d'un humain sur l'interface : en utilisant la fonction native print.

Il est temps de voir l'inverse : comment permettre à un utilisateur humain de fournir des informations à l'ordinateur : avec la fonction native input.

  • print affiche une donnée sur l'écran.
    • On dira que l'écran est un ACTIONNEUR car il modifie le monde extérieur.
  • input récupère ce qu'a tapé l'utilisateur sur le clavier.
    • On dira que le clavier est un CAPTEUR car il transforme en données informatiques les actions que le monde extérieur exerce sur lui.

Logiciel nécessaire pour l'activité : Thonny

Evaluation ✎ : questions 02-03-14

Résumé : Version HTML ou fond blanc ou ou PDF (couleur ou gris)

1 - Console

Voici un programme qui demande le nom et l'age de l'utilisateur :

1 2 3 4 5 6
# Acquisition des donnees nom = input("Quel est votre nom ? ") age = input("Veuillez donner votre age : ") # Restitution des donnees print("L’utilisateur est " + nom + " et il a " + age + " ans")

Quelques explications :

2 3
nom = input("Quel est votre nom ? ") age = input("Veuillez donner votre age : ")

On enregistre les réponses de l’utilisateur dans deux variables nommées nom et age.

L'intérêt est donc de voir la question suivante apparaître sur l'écran du bas :

Quel est votre nom ? _

On placera alors la réponse (non connue pour l'instant) de l'utilisateur dans la variable nom.

6
print("L’utilisateur est " + nom + " et il a " + age + " ans")

Création et affichage de la chaîne de caractères à afficher.

Facile. Non ? Non … Du moins, pas tant que cela.

Nous allons donc étudier ce type de code de façon à pouvoir réaliser ensuite des programmes interactifs dont la réaction dépend des réponses de l'utilisateur.

01° Copier le code ci-dessous dans Thonny. Il fait deux demandes auprès de l'utilisateur, les additionne et affiche le résultat. Utiliser la touche ENTREE pour valider votre réponse.

Activez la visualisation des variables via le menu VIEW-VARIABLES.
Lancer le programme.

1 2 3 4 5 6
# Acquisition des donnees pocheGauche = input("Argent dans la poche gauche : ") pocheDroite = input("Argent dans la poche droite : ") # Restitution des donnees print("Dans les poches, on trouve " + argentTotal + " euros au total.")

✎ 02° Quatre questions liées au transfert d'informations HUMAIN vers PROGRAMME via l'interface.

  1. Comment se nomme la fonction qui permet au programme de récupérer ce qu'a tapé l'utilisateur sur le clavier (pourvu que le focus soit sur l'interface Console) ?
  2. Sur quelles lignes se font ces demandes d'informations ?
  3. Dans quelles variables sont stockées les réponses de l'utilisateur ?
  4. Quelle est le type des réponses stockées ? Pensez à regarder l'onglet VARIABLES de Thonny.

✎ 03° Trois questions liées au transfert d'informations PROGRAMME vers HUMAIN via l'interface.

  1. Comment se nomme la fonction qui permet au programme d'afficher à l'écran quelque chose à destination d'un humain (pourvu que le focus soit sur l'interface Console) ?
  2. Sur quelle ligne se fait cette demande d'affichage ?
  3. Expliquer clairement pourquoi le programme affiche 455 lorsqu'on déclare avoir 45 euros dans une poche et 5 euros dans l'autre.

Pas facile n’est-ce pas ? Vous venez d'obtenir 455 euros alors que le programme devrait afficher 50. Pas terrible comme calcul ...

Voici un exemple de déroulement d'acquisition si vous n'avez pas réussi à trouver la raison du 455. Peut-être que ce visuel pourra vous aider.

CLIQUEZ ICI POUR VOIR LE CONTENU DES VARIABLES :

nom :

prenom :

age :

pocheGauche :

pocheDroite :

argentTotal :

1 2 3 4 5 6 7 8 9 10 11 12 13 14
# --- Acquisition des donnees --- nom = input("Quel est votre nom ? ") prenom = input("Quel est votre prénom ? ") age = input("Veuillez donner votre age : ") pocheGauche = input("Argent dans la poche gauche : ") pocheDroite = input("Argent dans la poche droite : ") # --- Restitution des donnees --- print("L’utilisateur est " + nom + " " + prenom + " et il a " + age + " ans") argentTotal = pocheGauche + pocheDroite print("Dans ses poches, on trouve " + argentTotal + " euros au total.") # --- Preparation de l’arret --- input("Tapez sur ENTREE")

2 - Le bon type de variable pour le bon type d’action

En réalité, puisqu’on veut faire du calcul, il ne faut pas chercher à stocker une chaîne de caractères (string en anglais) mais un nombre. Si on additionne avec l’opération + deux chaînes de caractères « 45 » et « 5 », on a la concaténation des deux : « 455 ».

Or, on veut faire le calcul 45+5 qui donne 50.

On doit donc stocker un nombre entier dans les variables de type integer ou  int .

Avant d'aller plus loin, nous allons faire quelques manipulations sur les variables issues d'un  input  :

04° Taper ceci dans le Shell de Thonny (en visualisant également les variables avec le menu VIEW-VARIABLES):

>>> a = 5 >>> a 5 >>> type(a) <class 'int'>

Et voilà, vous avez stocké 5, un integer, dans une zone mémoire qu'on pourra retrouver en tapant simplement a.

05° Lire le code suivant. Que va répondre l'ordinateur si on tape 5 comme réponse ? Taper les instructions pour vérifier.

>>> a = input('Votre réponse ? : ') Votre réponse ? : 5 >>> a à votre avis ? >>> a*2 à votre avis ? >>> type(a) à votre avis ? >>> print(a*2) à votre avis ?

...CORRECTION...

>>> a = input('Votre réponse ? : ') 5 >>> a '5' >>> a*2 '55' >>> type(a) <class 'str'> >>> print(a*2) 55

Le problème est donc que la fonction native  input  stocke toujours son résultat dans un string. Même si on répond 5 au clavier, l'interpréteur place le string '5' en mémoire.

Types de variables avec Python

Rappel : les types de variables disponibles et les contenus attendus de ces variables sont donnés ci-dessous :

Type de variableNom du type pour PythonCe qu'il peut contenir
Booléen / BooleanboolFalse or True (avec une majuscule)
Entier / IntegerintUn nombre entier (attention aux limites maximales) comme 12
Réel / FloatfloatUn nombre à virgule (attention aux limites maximales) comme 12.0 ou 12.5
Chaîne de caractères / StringstrUne chaîne de caractères, c'est-à-dire un mot ou une phrase. On la définit entre deux guillemets doubles ou apostrophes (guillemets simples)."chaîne de caractère" 'autre chaîne de caractère'

Nous avons vu qu'on peut tenter de transformer un type de variable en un autre type. Pour cela, on utilise les fonctions natives suivantes :

  • int pour tenter de transformer en entier.
  • float pour tenter de transformer en réel.
  • str pour tenter de transformer en chaîne de caractères.

06° Tenter de trouver les réponses que va donner l'ordinateur sans taper les instructions. Vérifiez ensuite.

>>> a = "5" >>> type(a) >>> a*2 >>> b = int(a) >>> type(b) >>> b*2

...CORRECTION...

a est un string alors qu'on obtient un integer pour b.

a désigne le string '5'.

a*2 désigne le string '55'.

b désigne l'integer 5.

b*2 désigne l'integer 10.

Bien. Maintenant que les choses sont posées, revenons à notre problème d'argent dans les poches.

07° Utiliser le code ci-dessous qui modifie le type des variables servant à stocker les réponses utilisateurs avant leur addition dans argentTotal.

1 2 3 4 5 6 7 8 9 10 11
# Acquisition des donnees pocheGauche = input("Argent dans la poche gauche : ") pocheDroite = input("Argent dans la poche droite : ") # Traitement des donnees pocheGauche = int(pocheGauche) pocheDroite = int(pocheDroite) argentTotal = pocheGauche + pocheDroite # Restitution des donnees print("Dans les poches, on trouve " + argentTotal + " euros au total.")

Ca fonctionne ou non ?

Normalement, c'est encore pire qu'avant : vous devriez voir une erreur apparaître !

>>> %Run test.py Argent poche droite : 45 Argent poche gauche : 5 Traceback (most recent call last): File "/home/rv/Documents/prog_python/test.py", line 11, in <module> print("Dans les poches, on trouve " + argentTotal + " euros au total.") TypeError: must be str, not int >>>

Attention, écrire ceci ne modifie pas le contenu de la variable :

int(pocheDroite)

Il faut une nouvelle affectation si vous voulez modifier le contenu :

pocheDroite = int(pocheDroite)

Après avoir répondu au deuxième input, on obtient donc l'erreur suivante avec le code de la correction :

>>> %Run test.py Argent poche droite : 45 Argent poche gauche : 5 Traceback (most recent call last): File "/home/rv/Documents/prog_python/test.py", line 11, in <module> print("Dans les poches, on trouve " + argentTotal + " euros au total.") TypeError: must be str, not int >>>

Le problème vient donc du dernier print sur l’argent total : Nous avions déjà vu que Python ne sait pas additionner des strings et des integers.

print("Dans les poches, on trouve " + argentTotal + " euros au total.")

3 - DEBUG de Thonny

Pour trouver la nature exacte d'un 'bug', c'est parfois plus délicat et il faut savoir débugger le programme. Pour cela, il faut l'exécuter pas à pas, et regarder le contenu des variables. Comment ? En utilisant les capacités de débogage de Thonny !

08° Relancer le script mais en utilisant cette fois RUN - DEBUG CURRENT SCRIPT.

Vous allez constater que le script se lance mais se bloque sur la première instruction que doit exécuter l'ordinateur :

Votre programme est figé : l'ordinateur vient de se positionner sur une instruction : il attend sagement votre autorisation pour continuer.

Comment lui indiquer ? Il faut cliquer sur STEP OVER pour autoriser l'instruction à s'exécuter :

09° Faire avancer le script en cliquant sur STEP OVER et en répondant aux questions au fur et à mesure. Le faire jusqu'à la dernière instruction mais sans lui demander de s'exécuter. Vous devriez obtenir ceci : dans l'onglet VARIABLES, on voit bien que argentTotal est un integer valant 50.

Alors ? Comment ne pas provoquer d'erreur ? Vous pouvez parvenir à afficher le bon résultat à l’aide d’une utilisation différente de  print  : on utilise une virgule pour signaler qu’on veut juste afficher le contenu de la variable, pas faire une concaténation avec l'opérateur +.

On remplace donc la première ligne par la seconde :

print("Dans les poches, on trouve " + argentTotal + " euros au total.") print("Dans les poches, on trouve " , argentTotal , " euros au total.")

10° Modifier le print comme proposé. Ca devrait fonctionner maintenant. Ouf !

1 2 3 4 5 6 7 8 9
# Acquisition des donnees pocheGauche = int(input("Argent dans la poche gauche : ")) pocheDroite = int(input("Argent dans la poche droite : ")) # Traitement des donnees argentTotal = pocheGauche + pocheDroite # Affichage de sortie print("Dans les poches, on trouve " , argentTotal , " euros au total.")

On remarquera que j'ai placé la conversion avec int et le input sur la même ligne pour gagner quelques lignes.Attention, cela ne change rien : souvenez-vous du séquentiel.

  1. L'interpréteur commence par gérer la fonction native input.
  2. Ensuite, on tente de convertir le string obtenu avec la fonction native int.

Voici le déroulement avec le contenu des variables ET leurs types. J'ai décidé de créer de nouvelles variables pour contenir l'argent dans les poches.

CLIQUEZ ICI POUR VOIR LE CONTENU DES VARIABLES :

nom :

age :

pocheGauche :

pocheDroite :

argentGauche :

argentDroite :

argentTotal :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# Acquisition des donnees nom = input("Quel est votre nom ? ") age = input("Veuillez donner votre age : ") pocheGauche = input("Argent poche gauche : ") pocheDroite = input("Argent poche droite : ") # Traitement des données argentGauche = int(pocheGauche) argentDroite = int(pocheDroite) argentTotal = argentDroite + argentGauche # Restitution des donnees print("L’utilisateur est ",nom," et il a ",age," ans, et il a sur lui ",argentTotal) # Preparation de l’arret input("Appuyez sur ENTREE")

✎ 11° Et si la personne a des centimes ? Essayez avec 10.5 et 0.60. Pourquoi est-ce que ça ne fonctionne pas ?

12° Solution : utilisez plutôt la fonction float(ma_variable) pour modifier les types de variables pour stocker et afficher correctement l’argent total que porte la personne, même si elle porte des centimes ...

...CORRECTION...

1 2 3 4 5 6 7 8 9
# Acquisition des donnees pocheGauche = float(input("Argent dans la poche gauche : ")) pocheDroite = float(input("Argent dans la poche droite : ")) # Traitement des donnees argentTotal = pocheGauche + pocheDroite # Affichage de sortie print("Dans les poches, on trouve " , argentTotal , " euros au total.")

Il est possible que le calcul ne donne pas de chiffres ronds. Nous verrons bientôt dans une activité de la partie Données pourquoi le programme affiche ceci :

Quel est votre nom ? h Veuillez donner votre age : 42 Argent poche gauche : 10.2 Argent poche droite : 2.6 L’utilisateur est h et il a 42 ans, et il a sur lui 12.799999999999999 Appuyez sur ENTREE

4 - fString : expliciter une variable dans un string

Nous avions déjà rencontré une meilleur façon d'afficher une variable dans un string : le fString.

Et si nous étions passé par là directement, nous n'aurions eu aucun problème d'affichage :o)

Le début de l'activité (concaténation puis utilisation de la virgule) était en réalité une excuse pour vous montrer comment utiliser le mode DEBUG de Thonny.

f-Strings

Vous remarquerez la présence d'un f devant les strings précédents.

Cela les transforme en f-Strings.

Avec un tel string, on peut noter des noms de variables entre des accolades {...} et lors de la création du string, l'interpéteur Python remplacer les accolades par le contenu de la variable.

1 2 3
def exemple_f() : a = 5 print(f"La variable a contient {a}")

Le résultat dans le Shell :

>>> exemple_f() La variable a contient 5

Depuis Python 3.6, les f-strings permettent d’insérer des expressions dans des chaines de caractères en utilisant une syntaxe encore plus facile. Nous les avions déjà rencontré.

13° Tester la solution la plus explicite et facile (nécessite Python 3.6 ou plus). Vous ne devriez pas avoir trop de problèmes de compréhension avec celle-ci : on crée un f-string en plaçant un f avant le premier caractère délimitateur du string : ".

1 2 3 4 5 6 7 8 9
# Acquisition des donnees pocheGauche = '50.2' pocheDroite = '5.1' # Traitement des donnees argentTotal = float(pocheGauche) + float(pocheDroite) # Affichage de sortie print( f"Dans les poches, nous avons {pocheGauche} et {pocheDroite}, soit {argentTotal} euros au total" )

Quell est la différence entre un string et un f-string ?

Tester ce code.

Questions :

  • par quoi l'interpréteur Python a-t-il remplacé {pocheGauche} lors de l'exécution ?
  • par quoi l'interpréteur Python a-t-il remplacé {pocheDroite} lors de l'exécution ?
  • par quoi l'interpréteur Python a-t-il remplacé {argentTotal} lors de l'exécution ?

5 - Fonctions d'interface

Nous avons un beau programme. Oui.

Mais si nous désirons plus tard changer d'interface et partir, par exemple, sur une interface graphique, nous allons devoir tout refaire. C'est dommage.

Pour ne pas avoir à trop modifier de choses, il faut parvenir à séparer les tâches réalisées par ce programme en deux.

  • D'un côté les tâches liées à l'affichage sur l'interface ou la récupération des réponses utilisateurs sur l'interface
  • De l'autre, les tâches qui ne sont liées qu'à la gestion de l'information.

Il ne reste ensuite qu'à faire des fonctions pour chaque tâche basique !

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# Déclaration des fonctions d'interface : à changer si vous changer d'interface ! def demander_nombre(question) : '''Fonction d'interface qui permet de récupérer la réponse numérique de l'utilisateur''' reponse = input(question) return float(reponse) def afficher(message) : '''Fonction d'interface qui permet d'afficher le message dans l'interface''' print(message) # Déclaration des fonctions def definir_message(total) : '''Fonction qui renvoie un message''' return f"Au total, vous avez {total} euros" # Programme principal pocheG = demander_nombre("Combien dans la poche gauche ? ") pocheD = demander_nombre("Combien dans la poche droite ? ") message = definir_message(pocheG + pocheD) afficher(message)

✎ 14° En vous inspirant de la propostion ci-dessous, réaliser un programme qui demande

  • le nom du produit qu'on désire acheter (via une fonction d'interface)
  • le prix du produit (via une fonction d'interface)
  • le nombre de produits qu'on va acheter (via une fonction d'interface)

Votre programme devra alors calculer le prix total de l'achat.

Il devra finalement afficher ce prix en utilisant une fonction d'interface.

6 - FAQ

Quand l'utilisateur tape une lettre cela provoque une erreur ! On peut faire quelque chose ?

C'est bien le problème des informations qui proviennent d'un humain. Il a tendance à répondre n'importe quoi.

Je ne peux pas vous fournir de solution utilisant uniquement des notions déjà abordées.

Ce sera tout sur le sujet pour aujourd'hui.

Sachez qu'on peut en plus formater les affichages pour limiter les nombres de chiffres, tout mettre en majuscules... Nous verrons cela plus tard. Maintenant, vous savez au moins afficher les strings sans trop vous compliquer la vie.

Et que peut-on faire maintenant qu'on sait afficher des choses, récupérer les entrées clavier, créer des variables et des programmes ? Un petit jeu ? Avant cela, il faudrait que nous sachions faire des tests : agir différemment en fonction d'une condition d'entrée. C'est justement le thème de l'activité suivante...

Activité publiée le 28 08 2019
Dernière modification : 26 10 2020
Auteur : ows. h.