python lire

Identification

Infoforall

6 - Lire le clavier


Le premier volet visait à vous montrer comment on doit ordonner les instructions pour que l’ordinateur puisse afficher quelque chose à l’écran. Ce second volet explique comment interagir avec lui via le clavier et surtout comment le préparer à gérer vos données. Nous commencerons par un petit programme qui vous demande votre nom et votre age et qui les affiche ensuite sur la console. Nous allons utiliser une nouvelle fonction, la fonction input qui est un peu l’inverse de la fonction print :

  • print affiche sur l'écran
  • input récupère ce qu'a tapé l'utilisateur sur le clavier

Vous allez encore aujourd'hui travailler avec l'environnement qui permet très simplement d'observer le contenu des variables : Thonny.

Logiciel nécessaire pour l'activité : Python 3

Evaluation ✎ : questions 02-03

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

1 - Quelques exercices d’acquisition de données et de restitution à l’écran

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° Utiliser le code que nous venons d'expliquer dans Thonny. Utiliser la touche ENTREE pour valider votre réponse.

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")

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

Rajouter ensuite quelques lignes de code pour pouvoir

  • lire le prénom (avec un input),
  • le stocker dans une variable prenom et
  • l’afficher (avec un print) dans la console après le nom de l’utilisateur.

...CORRECTION...

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

✎ 02° Créer maintenant un code permettant de demander (et stocker la valeur) de l’argent contenu (en euro, sans les centimes) dans la poche gauche. Faire ensuite la même chose avec la poche droite. Il faudra donc deux variables supplémentaires. Disons pocheGauche et pocheDroite.

✎ 03° Rajouter maintenant en plus le code pour

  • mémoriser dans une variable argentTotal la somme de l'argent stockée dans les variables pocheGauche et pocheDroite.
  • afficher dans le Shell argentTotal à l'aide d'un print.

Faire un test en donnant 45 et 5 euros par exemple.

La somme devrait valoir ... 455 euros !

Pas facile n’est-ce pas ? Vous devriez réussir à afficher 50 en rentrant 45 et 5. Mais, votre programme affiche certainement 455. Pas terrible comme calcul…

Voici une correction possible. J'y ai rajouté une demande finale pour fermer au cas où la personne lancerait le script directement via l'interpréteur Python et pas avec un environnement de développement. Si le input final vous gène, n'hésitez pas à le supprimer.

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 ? : ') 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 input stocke toujours son résultat dans un string. Même si on répond 5, l'interpréteur place le string '5' en mémoire.

Comme vous le voyez, connaitre le type des données est important. D'autant que l'utilisation du print fait disparaitre la présence des guillemets. Heureusement, la fonction native de Python type permet de connaitre le type de données contenues dans une variable.

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
Complexe / ComplexcomplexUn nombre complexe comme z = 145 + 2i
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.

1 2 3 4 5 6 7 8 9 10 11 12
# Acquisition des donnees pocheGauche = input("Argent dans la poche gauche : ") pocheDroite = 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.") # Preparation de l’arret input("Appuyez sur ENTREE")

07° Modifier les types de variables avant leur addition dans argentTotal.

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)

Ca fonctionne ou non ? (normalement, vous devriez voir une erreur apparaître)

Si vous ne trouvez pas comment répondre à la question, vous pouvez trouver une solution possible ci-dessous. Mais cherchez un peu avant !

Vous devriez avoir un code (qui ne marche pas) du type :

...CORRECTION en 2 étapes...

1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 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 # Affichage de sortie print("Dans les poches, on trouve " + argentTotal + " euros au total.") # Preparation de l’arret input("Appuyez sur ENTREE")

...CORRECTION en 1 étape...

1 2 3 4 5 6 7 8 9 10 11 12
# 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.") # Preparation de l’arret input("Appuyez sur ENTREE")

Après avoir répondu au input, on obtient 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 : Python ne sait pas additionner des strings et des integers.

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

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. Ca fonctionne ?

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 10 11 12
# 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.") # Preparation de l’arret input("Appuyez sur ENTREE")

Il est possible que le calcul ne donne pas de chiffres ronds. Nous verrons dans une autre activité pourquoi le programme peut donner un résultat similaire à 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

3 - Expliciter une variable dans un string

Nous venons de voir qu'il n'est pas très facile de comprendre ce que contient un string qu'on crée par concaténation.

Nous allons faire une rapide présentation de deux façons plus claires visuellement de créer de tels strings contenant des variables.

1er méthode : format

Cette façon de faire oblige à agir sur la chaîne de caractères en utilisant ce qu'on nomme une méthode.

On donne la chaîne de caractères en incluant les zones à remplir, symbolisées par des accolades  {  et  } .

Ensuite, on place un point, on note format et on donne entre parenthèses les valeurs qu'on veut voir s'afficher.

13° Tester la première solution. Avec quoi l'interpréteur remplit-il les accolades lorsqu'il utilise la méthode format ? Idem avec la solution 2 qui inclut des numéros.

Méthode 1 : sans numéro d'indexation

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( "Dans les poches, nous avons {} et {}, soit {} euros au total".format(pocheGauche, pocheDroite, argentTotal) )

...CORRECTION 1...

Rien de bien compliqué : on remplit dans l'ordre des variables fournies dans format.

La première accolade va donc être remplacée par le contenu de pocheGauche.

La seconde par le contenu de pocheDroite.

La dernière par le contenu de argentTotal.

Méthode 2 : avec numéros d'indexation

Attention, l'ordre des variables dans format a été changé pour l'exercice.

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( "Dans les poches, nous avons {0} et {2}, soit {1} euros au total".format(pocheGauche, argentTotal, pocheDroite ) )

...CORRECTION 2...

Un peu plus compliqué. Il faut comprendre que lorsqu'on classe par index en informatique, le premier n'a pas le numéro 1 mais le numéro 0. Le deuxième a le numéro 1, le troisième le numéro 2...

La première variable fournie dans format est pocheGauche et elle possède donc l'index 0.

La deuxième variable fournie dans format est argentTotal et elle possède donc l'index 1.

La troisième variable fournie dans format est pocheDroite et elle possède donc l'index 2.

Il ne reste plus qu'à remplir les accolades par la variable correspondant à l'index fourni dans l'accolade :

"Dans les poches, nous avons {0} et {2}, soit {1} euros au total" donne ceci :

"Dans les poches, nous avons {argentGauche} et {argentDroite}, soit {argentTotal} euros au total".

L'intérêt de la méthode des index est qu'on peut changer l'affichage des données sans se soucier de modifier l'ordre dans des variables fournies dans format.

C'est bien, mais cela reste assez lourd à gérer.

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é.

14° Tester la dernière solution (nécessite Python 3.6 ou plus). Vous ne devriez pas avoir trop de problèmes de compréhension avec celle-ci.

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" )

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 conditionnels. C'est justement le thème de l'activité suivante...

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