Infoforall

Python 02 : LIRE L'ENTREE CLAVIER

Le premier volet (Python 1) visait à vous montrer comment on doit ordonner les instructions pour que l’ordinateur puisse afficher quelque chose à l’écran. Le second volet (Python 2) explique comment interagir avec lui via le clavier et surtout comment le préparer à gérer vos données : on va voir qu’on doit la plupart du temps avertir l’ordinateur du type de grandeurs qu’il va devoir stocker. On commence 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 :

# -*-coding:Utf-8 -*

import os


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


# Preparation de l’arret

os.system("pause")

Quelques explications :

# -*-coding:Utf-8 -*

Permet de gérer le codage des caractères spéciaux.

import os

Considerez pour l'instant que cela permet d'utiliser des fonctions liées au système d'exploitation

nom = input("Quel est votre nom ? ")

age = input("Veuillez donner votre age : ")

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

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

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

os.system("pause")

Attente avant de fermer la console.

Facile. Non ? Non …

Pour ceux qui sont sous Linux : vous pouvez remplacer les deux lignes de code suivantes par la troisième (à placer à la place où vous devriez mettre os.system("pause").

import os

...

os.system("pause")

A remplacer par :

input("Tapez sur ENTREE")

...NOUVEAU CODE TOTAL...

# -*-coding:Utf-8 -*


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

Cela fonctionne aussi pour ceux sous Windows.

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

01° Rajouter quelques lignes de code pour pouvoir lire le prénom et l’afficher correctement dans la console après le nom de l’utilisateur.

02° Rajouter le code permettant de stocker l’argent contenu (en euro, sans les centimes) dans la poche gauche, puis l’argent contenu dans la poche droite.

03° Rajouter le code pour afficher l’argent total que porte la personne.

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

...CORRECTION...

# -*-coding:Utf-8 -*

import os


# 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

os.system("pause")

CLIQUEZ ICI POUR VOIR LE CONTENU DES VARIABLES :

nom :

prenom :

age :

pocheGauche :

pocheDroite :

argentTotal :

# -*-coding:Utf-8 -*

import os


# 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

os.system("pause")

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 mais bien 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 » et pas le calcul 45+5=50.

Retenons donc que pour le langage informatique additionner les chaînes de caractères "45" et "5" n'est pas la même chose qu'additionner les nombres entiers 45 et 5.

On doit donc stocker un nombre dans les variables de type Integer ou Int.

Avant d'aller plus loin, nous allons faire quelques manipulations sur les variables.

04° Taper ceci dans la Console Python :

>>> a = 5

>>> a

5

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

Ainsi, à chaque fois qu'on tapera a dans le script, Python remplacera cette variable par ce qui est stocké à l'adresse correspondante.

Vous pouvez voir les variables comme un raccourci pour atteindre une zone mémoire sans avoir à fournir son adresse réelle.

Ici, votre variable contient un entier, un Integer en langage informatique.

05° Expliquer (sans la taper) ce que va alors donner l'instruction ci-dessous ? Taper l'instruction pour vérifier.

>>> a*2

10

Et si nous placions un string dans la variable a ?

>>> a = "5"

>>> a*2

'55'

06° Pourquoi obtient-on "55" et pas 10 ?

...CORRECTION...

On crée une variable a qui désigne l'adresse d'une zone mémoire qui contient un STRING "5".

Lorsqu'on demande de multiplier le string par 2, Python va alors simplement comprendre qu'on veut 2 "5" , soit "55" .

Comme vous le voyez, connaitre le type des données est important. Comment savoir à l'avance ce que désigne une variable ? Il faut utiliser une fonction native de Python : type.

07° Lancer les instructions suivantes pour comprendre ce que fait cette fonction :

>>> premiere = 5

>>> type(premiere)

>>> deuxieme = "5"

>>> type(deuxieme)

>>> troisieme = 5.0

>>> type(troisieme)

...CORRECTION...

La fonction type permet donc d'obtenir le type de données stocké à l'adresse mémoire pointée par la variable.

Si on stocke 5, on obtient une variable de type int pour integer (nombre entier)

Si on stocke "5", on obtient une variable de type str pour string (chaîne de caractères)

Si on stocke 5.0, on obtient une variable de type float pour float (nombre réel ou nombre à virgule flottante)

Remarque : vous remarquerez que tous les types de variables commencent par une minuscule, pas une majuscule.

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
Nombre réelfloatUn nombre à virgule (attention aux limites maximales) comme 12.0 ou 12.5
Nombre complexecomplexUn nombre complexe comme z = 145 + 2i
Chaîne de caractèrestringUne chaîne de caractères, c'est-à-dire un mot ou une phrase. On la définit entre deux guillemets ou apostrophes."chaîne de caractère" 'autre chaîne de caractère'

Le problème est que la fonction input stocke toujours son résultat dans un string.

On peut bien entendu tenter de transformer un type de variable en une autre. Pour cela, on utilise les fonctions natives suivantes :

08° Lancer les instructions suivantes pour comprendre ce que font ces fonctions :

>>> a = 5

>>> type(a)

>>> a*2

>>> b = str(a)

>>> type(b)

>>> b*2

...CORRECTION...

1e cas : a est un integer. On obtient un string b.

b désigne "5".

2*b désigne "55"

>>> c = 5

>>> type(c)

>>> c*2

>>> d = float(c)

>>> type(d)

>>> d*2

...CORRECTION...

2e cas : c est un integer. On obtient un float d.

d désigne 5.0

2*d désigne 10.

>>> e = "5"

>>> type(e)

>>> e*2

>>> f = int(e)

>>> type(f)

>>> f*2

...CORRECTION...

1e cas : e est un string. On obtient un integer b.

b désigne 5.

2*b désigne 10.

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

# -*-coding:Utf-8 -*


# 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("Appuyez sur ENTREE")

09° Modifier les types de variables avant leur addition, calculer l’argent total que porte la personne dans une variable argent_total. Tenter enfin d’afficher le total sous la forme « Argent total : argent_total ». Ca marche ou non ?

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

# -*-coding:Utf-8 -*


# Acquisition des donnees

nom = input("Quel est votre nom ? ")

age = input("Veuillez donner votre age : ")

pocheDroite = input("Argent poche droite : ")

pocheGauche = input("Argent poche gauche : ")

argentDroite = int(pocheDroite)

argentGauche = int(pocheGauche)

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

Le problème vient du dernier print sur l’argent total : Python ne sait pas additionner des strings et des integers.

Vous pouvez parvenir à afficher le bon résultat à l’aide d’une commande plus précise du print : on utilise une virgule pour signaler qu’on veut juste afficher le contenu de la variable, pas faire une opération avec. Lorsqu'on utilise le +, l'interpréteur tentait d'additionner une chaîne de caractères et un nombre, une tâche qu'il ne sait pas faire.

print("Il a sur lui ", argentTotal, ".")

10° Modifier le print. Ca fonctionne ?

Voici le déroulement avec le contenu des variables ET leurs types :

CLIQUEZ ICI POUR VOIR LE CONTENU DES VARIABLES :

nom :

age :

pocheGauche :

pocheDroite :

argentGauche :

argentDroite :

argentTotal :

# -*-coding:Utf-8 -*


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

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

Une autre méthode serait de convertir argentTotal en str avant de l’afficher :

print("L’utilisateur est "+nom+" et il a "+age+" ans, et il a sur lui "+str(argentTotal))

11° Essayez avec 10.5 et 0.60. Pourquoi est-ce ça ne fonctionne pas ?

12° Solution : utiliser 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 ...

3 - La permutation

Il existe quelques outils pratiques comme la permutation.

Si vous voulez mettre l’argent poche gauche dans la droite et inversement, il faut normalement :

  1. Créer une variable vide_poche.
  2. Mettre le contenu de la variable poche_droite dans vide_poche.
  3. Mettre le contenu de la variable poche_gauche dans la variable poche_droite maintenant vide.
  4. Mettre le contenu de la variable vide_poche (qui contient l’initiale poche_droite) dans poche_gauche.

Bref, c’est long et plutôt compliqué.

Python intègre un outil de permutation automatique. Il suffit de noter :

a,b = b,a

13° Tentez de permuter les poches droite et gauche à l’aide de la commande ci-dessus.

4 - Un autre outil pratique : l’affectation multiple.

Imaginons qu’on désire créer 6 variables a,b,c,d,e et f contenant 3,78. Il faudrait créer 6 lignes de code. On peut faire plus simple avec la ligne suivante :

a = b = c = d = e = f = 3.78

Remarque : Il existe des « règles » liées à la nomination des variables que la plupart des programmateurs respectes car elle permet de faire facilement la différence entre variable et fonction :

Java, Javascript et Python et C++ sont sensibles à la casse : ils distinguent majuscules et minuscules.

Remarque 2 : Modifier le contenu d’une variable se nomme une affectation. Si l’ancien contenu d’une variable n’a plus d’importance après traitement de l’information, on peut éventuellement l’utiliser pour garder en mémoire le calcul qu’on a fait à partir d’elle. Par exemple, on a 2,8% de rémunération sur un compte et qu’on désire connaître la somme en fin de mois, on peut utiliser :

# -*-coding:Utf-8 -*


# Acquisition des donnees

sousSous = input("Combien d’euros sur le compte ? ")

rendement = input("Quel est le rendement du compte (en pourcentage, entre 1 et 100) ? ")


# Calcul du total en fin de mois

sousSous = float(sousSous)

rendement = float(rendement)

sousSous = sousSous*(1+rendement/100)


# Restitution des donnees

print("Il restera sur le compte ",sousSous, " euros en fin de mois" )


# Preparation de l’arret

input("Appuyez sur ENTREE")

14° Lancer le code avec par exemple 440 euros et un rendement à 10% (ça doit être un placement très très risqué). Comme vous le voyez, le type float ne permet pas le calcul exact mais l’écart par rapport à la réalité est assez faible. Mais bon, vous imaginez dans une banque ? Cela ne ferait pas très sérieux.

15° Réaliser un programme qui permet de rentrer une somme en euros et cents jusqu’au centime mais qui fait un calcul exact. Il n'affiche par contre que les euros. Cela demandera de multiples transformations.

Une solution parmi tant d’autres :

# -*-coding:Utf-8 -*


# Acquisition des donnees

sousSous = input("Combien d’euros sur le compte ? ")

rendement = input("Quel est le rendement du compte (en pourcentage) ? ")


# Calcul du total en fin de mois

# On calcule d'abord en centimes

sousSous = int(100*float(sousSous))

rendement = float(rendement)

sousSous = int((sousSous*(1+rendement/100))/100)


# Restitution des donnees

print("Il restera sur le compte ",sousSous, " euros en fin de mois" )


# Preparation de l’arret

input("Appuyez sur ENTREE")

CLIQUEZ ICI POUR VOIR LE CONTENU DES VARIABLES :

sousSous :

rendement :

Au final, on retiendra que Python ne demande pas explicitement quel est le type d’une variable. Il s’arrange pour utiliser celle qui lui semble la plus adaptée.

Déclarez : a = 5 et a sera un integer.

Déclarez : a = 5.1 ou a = 5.0 et a sera un float.

Déclarez : a = 'bonjour' ou a = "bonjour" et a sera un string.

Les fonctions int(a) et float(a) permettent de convertir a une variable d'un certain type en integer ou float.

5 - Test logique SI

La prochaine étape dans la conception d’un programme : les choix logiques. Nous n'allons faire qu'une introduction à ce principe ici. L'une des activités en traite en profondeur.

Nous venons d'apprendre à poser des questions à l'utilisateur et à les stocker.

Nous allons maintenant voir comment faire agir l'ordinateur de façon différente en fonction des réponses données.

Pour comprendre les tests logiques, il faut savoir que les ordinateurs n'ont que deux choix possibles lorsqu'on leur donne une proposition à tester (du style "est-on en 2025 ?"). Il s'agit d'un booléen, d'après George Boole, fondateur de l'algèbre de Boole dans le milieu du 19ème siècle.

Un booléen ne peut valoir que True (pour VRAI) ou False (pour FAUX). Dans les faits, Python considère que 0 correspond à False et le reste à True.

Si nous étions en 2025, le résultat de "Sommes-nous en 2025 ?" donnerait True. Sinon, le résultat donnerait False.

16° Tester le programme suivant avec différentes réponses :

#!/usr/bin/env python

# -*-coding:Utf-8 -*


# Initialisation des données

annee_creation_python = 1991

reponse = input("En quelle année est sortie la première version de Python ? ")


# Traitement des données

reponse = int(reponse)

if reponse > annee_creation_python :

    print("Votre réponse est fausse.")

    print("Python a été créé avant ",reponse)

elif reponse < annee_creation_python :

    print("Votre réponse est fausse.")

    print("Python a été créé après ",reponse)

else :

    print("Oui, Python est sorti pour la première fois en ",reponse)


# Preparation de l’arret

input("pause")

CLIQUEZ SUR UN BOUTON-REPONSE :

reponse :

annee_crea... :

C'est l'indentation vers la droite qui permet à Python de comprendre les actions que vous voulez qu'il réalise si une condition est vérifiée. Comme avec la boucle FOR, c’est la tabulation ou 4 espaces de suite qui permet de savoir qu’une instruction est rattachée au bloc. Il est donc vital de bien tabuler votre code. Dans Notepad++, on peut faire s'afficher les tabulations à l'aide du menu AFFICHAGE - SYMBOLES SPECIAUX - AFFICHER ESPACES ET TABULATIONS. Choississez l'une des méthodes, puis gardez la même tout le long du code.

Ici, il effectue le premier bloc si la condition reponse > annee_creation_python renvoie True. Dans ce cas, il ne va même pas voir la suite du code comportant :

On remarquera qu’on met un double point [ : ] après la condition de if, else if (elif en Python) ou else.

Si on regarde le code en le divisant en bloc, on obtient ceci :

if reponse > annee_creation_python :

    print("Votre réponse est fausse.")

    print("Python a été créé avant ",reponse)

elif reponse < annee_creation_python :

    print("Votre réponse est fausse.")

    print("Python a été créé après ",reponse)

else :

    print("Oui, Python est sorti pour la première fois en ",reponse)


Le truc a bien comprendre est qu'on ne peut aller que dans un bloc et un seul.

17° Créer un programme qui demande l'age de l'utilisateur et qui affiche qu'il est adulte et peut voter s'il a 18 ans ou plus (codé à l'aide de >=. Sinon (il n'y aura donc pas de elif), il dit que l'utilisateur est mineur et qu'il ne peut pas encore voter.

...CORRECTION...

#!/usr/bin/env python

# -*-coding:Utf-8 -*


reponse = input("Quel est votre age ? ")


age = int(reponse)

if age >= 18 :

    print("Vous êtes adulte.")

    print("Vous avez le droit de vote.")

else :

    print("Vous n'êtes pas encore adulte. Vous n'avez pas encore le droit de vote.")


# Preparation de l’arret

input("pause")

Voyons maintenant rapidement le test d'égalité.

Pour tester une égalité en Python, on n'utilise pas a = b qui donne un ordre d'affectation : l'ordinateur comprend qu'il faut stocker b dans la variable a.

Pour tester l'égalité, on utilise un double signe égal a == b. Cette instruction teste réellement si les deux variables sont égales.

Le code ci-dessous permet d'affecter à la variable nombre_a_trouver un nombre aléatoire compris entre 1 et 3.

18° Compléter le code pour qu'il affiche bien le message lorsqu'on trouve le bon nombre.

#!/usr/bin/env python

# -*-coding:Utf-8 -*

import random


nombre_a_trouver = random.randint(1,3)

reponse = input("Tapez un nombre entier, entre 1 et 3 : ")


# A COMPLETER

if A COMPLETER :

    print("Vous avez trouvé le nombre.")

else :

    print("Vous n'avez pas trouvé le nombre ")


# Preparation de l’arret

input("pause")

...CORRECTION...

#!/usr/bin/env python

# -*-coding:Utf-8 -*

import random


nombre_a_trouver = random.randint(1,3)

reponse = input("Tapez un nombre entier, entre 1 et 3 : ")


# A COMPLETER

if reponse == nombre_a_trouver :

    print("Vous avez trouvé le nombre.")

else :

    print("Vous n'avez pas trouvé le nombre ")


# Preparation de l’arret

input("pause")

Comme pour la boucle FOR, vous irez beaucoup plus loin dans l'activité sur les tests logiques.

6 - Test tant que

Nous allons finir avec un dernier type de test qui sera bien pratique avec cette activité qui consiste à récupérer des données. En effet, comment parvenir par exemple à demander l'arrêt d'un programme avec l'aide d'une réponse de type O ou N ?

On pourrait utiliser un test SI mais cela ne fonctionnerait qu'une fois ...

Heureusement, il existe le test TANT QUE. Il s'agit d'instructions qui seront executés en boucle TANT QUE le condition utilisée est VRAI.

Voici à titre d'exemple la façon d'utiliser un while (TANT QUE).

19° Tester le code en tapant plusieurs fois N avant de taper O.

#!/usr/bin/env python

# -*-coding:Utf-8 -*


reponse = "N"


while reponse == 'N' :

    reponse = input("Voulez-vous sortir du programme ? (O/N): ")


# Preparation de l’arret

input("pause")

CLIQUEZ SUR LE PREMIER BOUTON :

Réponse Tapée >>>

reponse :

Comme pour les autres tests, nous les étudierons plus en détail plus tard.

Il est temps de réaliser votre premier jeu :

20° Réaliser un jeu où on cherche à trouver un nombre (comme celui de la question 18). La différence ? Il faudra demander au joueur s'il veut continuer s'il ne trouve pas le bon nombre. Pour sortir de la boucle, il faudra penser, par exemple, à modifier la valeur de reponse si le joueur trouve le bon nombre. Rajouter une indication sur le nombre à trouver au cas où le joueur ne trouverait pas le bon nombre : on doit dire si le nombre cherché est plus grand ou plus petit.

Et voici une correction possible (à n'utiliser que si vous bloquez !) :

#!/usr/bin/env python

# -*-coding:Utf-8 -*

import random


nombre_a_trouver = random.randint(1,3)

reponse = "N"


while reponse == 'N' :

    nombre = input("Quel nombre voulez-vous faire tester ? ")

    nombre = int(nombre)

    if nombre > nombre_a_trouver :

        print("Votre réponse est fausse.")

        print("Le nombre à trouver est plus petit.")

        reponse = input("Voulez-vous sortir du programme ? (O/N): ")

    elif nombre < nombre_a_trouver :

        print("Votre réponse est fausse.")

        print("Le nombre à trouver est plus grand.")

        reponse = input("Voulez-vous sortir du programme ? (O/N): ")

    else :

        print("Bien joué !")

        reponse = "O"


# Preparation de l’arret

input("pause")

Et encore, on pourrait faire plus simple en testant simplement si la réponse est égale au nombre dans le while directement.

7 - FAQ

Question : comment sortir d'une boucle for avant la fin ?

On utilise l'instruction break. Exemple : on lance une boucle avec un compteur évoluant de 0 à 20 mais on sort définitivement de la boucle lorsque le compteur vaut 5 :

for compteur in range(21) :

    print(compteur)

    if (compteur == 5) :

        break

input("pause")

CLIQUEZ SUR UN BOUTON-REPONSE :

compteur :

Sur la console, on voit bien qu'on ne revient pas dans la boucle pour le cas 6 et plus :

0

1

2

3

4

5

Remarque : même s'il reste des instructions sous le break, on ne les exécute pas : on quitte immédiatement la boucle.

Question : Je voudrais compter de 0 à 6 mais sans passer par 5, c'est possible ?

On utilise l'instruction continue. On lance une boucle avec un compteur évoluant de 0 à 6 mais sans agir pour 5 en forçant un retour au début de la boucle :

for compteur in range(7) :

    if (compteur == 5) :

        continue

    print(compteur)

input("pause")

CLIQUEZ SUR UN BOUTON-REPONSE :

compteur :

Comme vous le voyez, je n'ai même pas besoin de mettre un else après le if. L'exécution du programme va répartir au début de la boucle dès qu'elle rencontrera continue.

Sur la console, on voit bien qu'on a sauté l'exécution du print pour le 5 :

0

1

2

3

4

6

Remarque : même s'il reste des instructions sous le continue, on ne les exécute pas : on remonte immédiatement la boucle pour faire l'itération suivante.