Un booléen est une variable qui peut avoir deux états possibles, généralement vrai ou faux,
en langage Python True
ou False
.
Les booléens sont très utiles pour des tests.
Les tests en Python :
Voilà quelques opérateurs :
a==b
renvoie True
si a
et b
sont égaux,
False
sinon.a!=b
renvoie True
si a
est différent de
b
et False
sinon.a < b
renvoie True
si a
< b
et False
sinon.
Pour tester la comparaison et l'égalité ensemble de deux éléments : a <= b
renvoie True
si a
≤ b
et False
sinon.
Exécuter le code suivant soit directement sur le Trinket ci-dessous :
soit en recopiant le code ci-dessous dans un Jupyter :
a = 3
print("Est-il vrai que a=3 ?")
print(a == 3)
type( a == 3)
Quel rôle différent ont les lignes 1 et 3 du code précédent ?
Comment s'écrit en langage Python le type booléen ?
Attention à ne pas confondre :
a=3
qui stocke la valeur 3 dans la variable $a$.
a==3
qui teste si $a$ est égal à l'entier 3 ou pas.
Deux opérateurs logiques sont aussi très utiles : et et ou, soit en langage Python and
et or
;
ces opérateurs lient deux affirmations booléennes.
Une affirmation condition1 and condition2
est vraie uniquement lorsque les
deux conditions sont vraies.
Une affirmation condition1 or condition2
est fausse uniquement lorsque les
deux conditions sont fausses.
Proposer une fonction est_chiffre
qui prend en paramètre un nombre entier et qui renvoie un booléen :
True
si ce nombre entier est compris entre 0 et 9, False
dans les autres cas.
Rajouter une précondition pour tester que la saisie est bien un nombre entier.
Deviner avant de lancer les codes suivants quel sera le booléen résultat. Ensuite, vérifiez en exécutant chaque code.
b = 56
print(b != 5 and b !=6)
b = 56
print(b <= 5 or b >= 6)
Dans un and
, si la première condition est FAUSSE, la deuxième n'est même pas évaluée : le tout est FAUX.
Dans un or
, si la première condition est VRAIE, la deuxième n'est même pas évaluée : le tout est VRAI.
Exécuter la fonction suivante avec $n=4$ puis $n=5$ :
def de_l_or(n):
return (n < 5) or (erreur > zut)
Expliquer ce qu'il se passse.
Que se passe-t-il si l'ordre des deux conditions n < 5
et (erreur > zut)
est inversée ?
Il est possible de tester l'appartenance d'un élément dans un 'ensemble' grâce au mot-clé in
.
Il est possible de tester la non appartenance d'un élément dans un 'ensemble' grâce à not in
.
Deviner avant d'exécuter le code ce que va afficher le script suivant ?
mot = "AbcDE"
print('a' in mot and 'f' not in mot)
Vérifier en exécutant le code.
Deviner avant d'exécuter le code ce que va afficher le script suivant ?
mot = "AbcDE"
print('a' in mot or 'E' not in mot)
Vérifier en exécutant le code.
À retenir :
Un booléen n'a que deux valeurs possibles True
et False
,
on teste une égalité avec ==
,
on teste une différence avec !=
,
on teste une comparaison avec <=
, >=
, <
ou >
,
on teste l'appartenance avec in
,
on teste la non-appartenance avec not in
,
on peut lier deux affirmations booléennes avec les opérateurs and
et or
.
En pseudo-code (avec de nombreuses variantes pour identifier les blocs d'instructions), la structure conditionnelle s'écrit :
1 if condition then 2 bloc 1 3 else 4 bloc 2
En langage Python, la structure conditionnelle s'écrit :
if condition :
instruction(s) à effectuer dans la cas où la condition est remplie
else :
instruction(s) à effectuer dans la cas contraire
Le bloc else
n'est pas obligatoire
Vous remarquerez le symbole :
très important en Python qui marque le début d'un bloc.
C'est l'indentation (=décalage) qui délimite le bloc d'instructions.
a=float(input("Entrer un nombre réel : "))
if a>=0 :
print("Vous avez entré un nombre positif ou nul",a)
else :
print("Vous avez entré un nombre négatif",a)
Qu'affiche le programme de l'exemple dans chacun des cas suivants :
Avec a=8
?
Avec a=-6
?
Avec a=0
?
Avec a="positif"
?
Vous pouvez tester directement le programme précédent ci-dessous. En appuyant sur la touche Next>, vous visualiserez le fait que l'interpréteur du code
ne traite que l'instruction du if
ou celle du else
suivant si la condition est remplie ou non.
Il est possible d'imbriquer plusieurs instructions conditionnelles ensemble.
On peut détailler l'exemple précédent ainsi en trois cas distinctions par imbrication de deux instructions conditionnelles :
a=float(input("Entrer un nombre réel : "))
if a>0:
print("Vous avez entré un nombre strictement positif",a)
else: # ici, on est dans le cas où a<= 0
if a==0:
print("Vous avez entré un nombre nul",a)
else: # ici, on est dans le cas où a<=0 et a!=0 donc où a<0
print("Vous avez entré un nombre négatif",a)
Plutôt que d'imbriquer plusieurs instructions conditionnelles lorsqu'il y a plus de deux cas, il est possible d'utiliser
la structure elif
, qui est la contraction de else if
.
if condition1 :
instruction(s)
elif condition2 :
instruction(s)
elif condition3 :
instruction(s)
else :
instructions
Il est posible de réécrire l'exemple précédent ( lien direct) en remplaçant l'imbrication
en utilisant elif
comme montré ci-dessous :
a=float(input("Entrer un nombre : "))
if a>0 :
print("Vous avez entré un nombre strictement positif.")
elif a==0 :
print("Vous avez entré un nombre nul.")
else :
print("Vous avez entré un nombre strictement négatif.")
Un club sportif formant des jeunes de moins de 14 ans vous a demandé de créer un programme pour informer les familles de la catégorie à laquelle appartiendra leur enfant en fonction de leur âge.
Le club sportif vous a donné ces informations :
Écrire une procédure categorie
qui :
Demande l’âge d’un enfant à l’utilisateur,
informe l'utilisateur de la catégorie de l'enfant,
ne renvoie rien.
Rajouter des préconditions afin que d'assurer le bon fonctionnement de cette fonction.
Voici réécrit à l'aide d'une fonction l'exemple précédent (lien direct). Au lieu d'afficher, elle renvoie une chaîne de caractères explicitant le signe.
def signe_saisie() -> str:
a=float(input("Entrer un nombre : "))
if a>0 :
return "strictement positif"
elif a==0 :
return "nul"
return "strictement négatif"
Sans exécuter le script ci-dessus repérer quel est le principal changement dans la structure conditionnelle avec l'exemple initial, puis deviner s'il convient dans chacun des cas.
Exécuter le script et tester-le avec au moins un des différents cas possibles.
Pourquoi ce script fonctionne-t-il malgré la suppression du else
?
Réaliser une fonction main
.
Cette fonction, sans argument, affiche dans un menu trois actions différentes, nommées Traitement A
,
Traitement B
, Traitement C
et une dernière qui permet de sortir du programme.
Ensuite, le choix de l'utilisateur est enfin affiché à l'écran.
Exemple de trace d'exécution ; cas où l'utilisateur tape 2 :
Menu
Traitement A, tapez 1
Traitement B, tapez 2
Traitement C, tapez 3
Sortir, tapez 4
Votre choix : 2
Votre choix : Traitement B
Tester la fonction main
en n'oubliant aucun cas possible.
Proposer une fonction, nommée mini2
qui prend comme arguments deux nombres entiers a
et b
et qui renvoie
le minimum de ces deux nombres.
Proposer une fonction, nommée mini4
, qui :
prend comme arguments quatre nombres entiers
a
, b
, c
et d
,
fait appel plusieurs fois à la fonction mini2
pour finalement trouver le minimum des quatre nombres
renvoie le minimum trouvé.
Une année n’est bissextile, c'est-à-dire qu'elle dure 366 jours, que dans l’un des deux cas suivants :
si l'année est divisible par 4 et non divisible par 100 ;
si l'année est divisible par 400.
Proposer une fonction est_bissextile
qui prend en argument une année de type nombre entier et qui renvoie un booléen précisant si
l'année est bissextile ou non.
Indication : le code a % b
renvoie le reste de la division euclidienne de $a$ par $b$. Exemple : 15 % 6
renvoie 3 car $15 = 6 \times 2 + 3$.
Utiliser judicieusement and
et or
afin d'obtenir un script utilisant
seulement un if
.
Il est possible d'écrire sous forme condensée sur une ligne certaines instructions conditionnelles.
Pour cela, au lieu d'avoir :
if condition 1:
Traitement des instructions du bloc 1
else:
Traitement des instructions du bloc 2
on réécrit sous la forme suivante l'instruction :
Traitement des instructions du bloc 1 if condition 1 else Traitement des instructions du bloc 2
Voici une fonction qui renvoie le maximum de deux entiers $a$ et $b$ grâce à une instruction conditionnelle :
def maxi(a:int, b:int) -> int:
if a > b :
return a
else:
return b
On peut réécrire en une ligne l'instruction conditionnelle ; ainsi cette fonction devient :
def maxi(a:int, b:int) -> int:
return a if (a > b) else b
Réécrire la fonction mini2
de l'exercice déjà traité (lien direct) en écrivant sur une seule ligne
l'instruction conditionnelle.
À retenir :
la structure d'une instruction conditionnelle pour une alternative est :
if condition 1:
Traitement des instructions du bloc 1
else:
Traitement des instructions du bloc 2
On peut généraliser à plus de deux cas avec le mot-clé elif
,
if condition 1:
Traitement des instructions du bloc 1
elif condition 2:
T raitement des instructions du bloc 2
else:
Traitement des instructions du bloc 2
Partie qui sera surement utile lors des projets mais qui est hors programme.
L'exécution d'un programme peut provoquer une erreur. Lorsque c'est le cas, l'exécution s'arrête immédiatement et l'interpréteur Python affiche une trace d'erreur.
En python, on peut gérer ces erreurs éventuelles d'exécution.
Une erreur lors de l'exécution d'un programme est appelée une exception.
On dit que l'interpréteur lève une exception lorsqu'il rencontre une erreur dans le programme, l'arrête en renvoyant un message d'erreur.
Imaginons un algorithme où une division par un nombre réel saisi $a$ est nécessaire :
Si vous exécutez ce programme avec $a=0$, l'interpréteur rencontre un problème : ici l'erreur $10/0$ (erreur appelée exception).
L'interpréteur arrête le programme et renvoie un message d'erreur : il lève une exception. Le message peut prendre différentes formes :
ZeroDivisionError: integer division or modulo by zero at
,
ZeroDivisionError Traceback (most recent call last)
<ipython-input-1-d1c920c10ea0> in <module>()
1 a = int(input("valeur de a = "))
2 b = 10
----> 3 print("b/a =",b/a)
ZeroDivisionError: division by zero
Traceback (most recent call last):
File "
File "
ZeroDivisionError: division by zero
Dans tous les cas, appraraît le type de l'exception : ZeroDivisionError
.
On retrouve ainsi qu'il est nécessaire de tester si le nombre $a$ saisi est nul ou non afin d'éviter que le programme s'arrête du fait d'une division par 0.
Pour cela, vous connaissez déjà l'instruction assert
.
Exécuter le script suivant dans un Jupyter avec différentes valeurs de $a$, dont 0 :
a = int(input("valeur de a = "))
assert a != 0, "erreur, le nombre saisi est nul"
b = 10
print("b/a =",b/a)
Est-ce que le programme se termine dans tous les cas ?
Si vous exécuter le script précédent en saisissant $a=0$, l'interpréteur teste la condition de l'assert
puis affiche
le message d'erreur saisi par le programmeur afin de faciliter la compréhension de l'erreur puis mais force l'arrêt de l'exécution
du programme.
Or, mettre fin à un programme de manière forcer peut être très gênant lorsque ce programme fait partie d'un programme plus conséquent.
Pour gérer les erreurs tout évitant l'arrêt du programme, il suffit d'utiliser la commande:
try:
notre interpréteur essaie
except:
ce que notre interpréteur fait si le précédent essai ne passe pas.
Exécuter le script suivant dans un Jupyter avec différentes valeurs de $a$, dont 0 :
a = int(input("valeur de a = "))
b = 10
try:
print("b/a =",b/a)
except:
print('il faut entrer un nombre non nul !')
Est-ce que le programme se termine dans tous les cas ?
Explication :
Dans le cas où $a=0$, arrivé à la ligne 4, l'interpréteur commence par essayer d'évaluer le qutoient $b/a$.
Comme il n'est pas possible d'effectuer une telle division, son essai échoue, l'interpréteur arrête le bloc try sans s'occuper du
print("b/a =",b/a)
pour passer directement au bloc lié à except
:
il affiche donc le texte de la ligne 6. Ainsi, l'erreur de diviser par 0 ne conduit pas à un arrêt non désiré du progamme.
Créer une procédure votre_age
qui demande à l'utilisateur son année de naissance, qui affiche son âge
(approximatif car la date précise n'est pas prise en compte) mais qui ne renvoie rien.
Tester votre procédure avec, entre autres, 2005
puis "deux mille cinq"
.
Améliorer la procédure votre_age
en utilisant l'instruction try ... except
afin que le programme ne cesse pas si autre chose qu'un entier est saisi et en faisant en sorte qu'un message d'erreur adéquat apparaisse ;
par exemple "Veuillez saisir un nombre entier."
Il est possible aussi de préciser quel type d'exception (=type d'erreur) doit être levé à chaque fois, pour cela, il suffit de
préciser après le mot-clé except
le nom du type d'erreur : ZeroDivisionError
, ValueError
, ...
Exécuter le script suivant dans un Jupyter avec différentes valeurs de $a$, dont 0 et 1.0 :
try:
a = int(input("valeur de a = "))
b = 10
print("b/a =",b/a)
except ValueError:
print("Erreur : la valeur saisie n'est pas un entier valide")
except ZeroDivisionError:
print('Erreur : il faut entrer un nombre non nul pour ne pas diviser par zéro !')
Est-ce que le programme se termine dans tous les cas ?
Que signifie le type d'erreur ValueError
?
Quel est l'intérêt ici de préciser deux except
?
Proposer une fonction age
qui :
demande l'âge de l'utilisateur,
teste que la saisie est bien convertible en un nombre entier,
renvoie l'âge ou 0 en cas d'erreur de saisie.
Tester la fonction, en particulier en saisissant "seize" et 16.
Il est parfois utile de lever une exception sans que l'interpréteur ne rencontre une erreur.
Voici une procédure qui demande à l'utilisateur son âge puis lève une exception si la personne est mineure sans rien retourner.
def pour_majeur() -> None:
try:
age = int(input("Veuillez saisir votre âge"))
if age < 18:
print("Vous devez être majeur.e !")
raise ValueError()
else:
print("âge valide")
except :
print("âge non valide !")
Tester la procédure pour_majeur
de l'exemple précédent avec différents saisies, en particulier "seize", 16, 18 ou 19.5.
Proposer une fonction contient_e
qui prend une chaine de caractères en argument et qui renvoie si cette chaine contient
la lettre $e$ grâce à un booléen.
Modifier le programme précédent afin qu'il gère l'erreur du type de saisie, erreur appelée TypeError
.
Par exemple si l'utilisateur entre un nombre à la
place d'une chaine de caractères en renvoyant le message suivant :
Erreur : donner comme argument une chaine de caractères.
Il existe plusieurs façons de s'assurer que l'argument est bien une chaine de caractères, essayez la commande :
isinstance(ma_chaine, str)
isinstance(268, str)
renvoie False
tandis que isinstance("Mon texte !", str)
renvoie True
.
À retenir :
Pour gérer les exceptions, on peut utiliser l'instruction suivante :
try:
instructions exécutées sous réserve si aucune erreur ne survient
except: # si une erreur est apparu lors de l'exécution du bloc précédent
instructions à exécuter si une erreur est survenu dans le bloc try
Le mot-clé raise
sert à lever une exception même si aucune erreur de programmation ou de calcul d'a lieu.
Proposer une fonction eau_liquide
qui prend en paramètre un nombre entier tempe
(qui modélise la température de l'eau)
et qui renvoie un booléen : True
si ce nombre entier est compris entre 0 et 100, False
dans les autres cas.
Rajouter une précondition pour tester que la saisie est bien un nombre entier.
Pour accéder au code de la correction : lien
Deviner avant de lancer les codes suivants quel sera le booléen résultat. Ensuite, vérifier en exécutant chaque code.
a = 6
print(a >= 5 and a < 6)
b = -1
print(b <= 0 or b >= 5)
Pour accéder au code de la correction : lien
Deviner avant d'exécuter le code ce que va afficher le script suivant ?
mot = "Nous sommes heureux et heureuses de faire NSI !"
print('a' not in mot and 'i' in mot)
Vérifier en exécutant le code.
Deviner avant d'exécuter le code ce que va afficher le script suivant ?
mot = "Quelle chance que de pouvoir aller au lycée !"
print('N' not in mot or 'é' in mot)
Vérifier en exécutant le code.
Pour accéder au code de la correction : lien
Proposer un algorithme qui :
Demande à l'utilisateur de saisir un nombre,
Affiche si ce nombre est plus grand ou égal à 10 ou s'il est strictement plus petit.
Pour accéder au code de la correction : lien
Un théâtre pratique trois types de tarifs suivant le nombre de pièces regardées.
Pour au plus de 2 pièces vues, la personne doit payer 15€ la séance,
Entre 3 et 5 pièces vues, la personne doit payer 12€ la séance,
À partir de 6 séances, la personne doit payer 10€ la séance.
Écrire un programme qui :
Demande le nombre de pièces que la personne veut voir durant la saison théâtrale,
Affiche le prix à payer.
Pour accéder au code de la correction : lien
Proposer une fonction etat_eau
qui prend en paramètre un nombre entier tempe
(qui modélise la température de l'eau en °C)
et qui renvoie une chaîne de caractère : "solide"
si ce nombre entier est négatif, "liquide"
si la
température est comprise entre 0 et 100 °C et "gazeux"
si la température dépasse 100 °C.
Est-il possible d'écrire cette fonction etat_eau
sans utiliser un else
ni trois if
?
Rajouter deux préconditions pour tester que la saisie est bien un nombre entier et que la température est possible, c'est-à-dire supérieure ou égale à -273°C.
Pour accéder au code de la correction : lien
Vous êtes en charge de la programation d'un distributeur automatique. Vous avez d'abord à gérer l'affichage du choix du consoomateur.
Réaliser une fonction choix
.
Cette fonction, sans argument, affiche dans un menu les quatre sélections possibles différentes, nommées Boissons
,
Gâteaux
, Fruits
, Légumes
et une dernière qui permet de sortir du programme.
Ensuite, la sélection effectuée par l'utilisateur est enfin affiché à l'écran.
Exemple de trace d'exécution ; cas où l'utilisateur tape 3 :
Menu
Boissons, tapez 1
Gâteaux, tapez 2
Fruits, tapez 3
Légumes, tapez 4
Quitter, tapez 5 ou autre chose
Votre choix : 3
Votre choix : Fruits
Tester la fonction choix
en n'oubliant aucun cas possible.
Pour accéder au code de la correction : lien
On suppose que vous disposez déjà des deux fonctions mini2
et mini4
programmées dans un exercice précédent
(cf. lien direct)
mini4
, qui :
prend comme arguments huit nombres entiers, nommés de a
à h
,
fait appel aux fonctions mini2
et mini4
pour finalement trouver le minimum des huit nombres,
renvoie le minimum trouvé.
Pour accéder au code de la correction : lien
Écrire un programme qui :
Demande l'âge d'une personne,
Affiche si la personne est majeure où mineure.
Corrigé de cet exercice dans la vidéo accessible avec ce lien.
Un cinéma pratique trois types de tarifs pour deux personnes.
si les deux personnes sont mineures, elles payent 7€ chacune,
si l'une seulement est mineure, elles payent un tarif de groupe de 15€,
si les deux personnes sont majeures, elles payent 18 € en tout.
Écrire un programme qui :
Demande l'âge de chacune des personnes,
Affiche le prix à payer.
Corrigé de cet exercice dans la vidéo accessible avec ce lien.
Propriétaire des ressources ci-dessous : ministère de l'Éducation nationale et de la jeunesse, licence CC BY SA NC
Voici une sélection de questions issues de la banque nationale de sujets, répondez à ces questions (attention, cette sélection n'est pas exhaustive).
On considère le code suivant :
if x < 4:
x = x + 3
else:
x = x - 3
Quelle construction élémentaire peut-on identifier ?
Réponses :
A- une boucle non bornée
B- une structure conditionnelle
C- une boucle bornée
D- un appel de fonction
À quelle affectation sont équivalentes les instructions suivantes, où $a$, $b$ sont des variables entières et $c$ une variable booléenne ?
if a==b:
c = True
elif a > b+10:
c = True
else:
c = False
Réponses :
A- c = (a==b) or (a > b+10)
B- c = (a==b) and (a > b+10)
C- c = not(a==b)
D- c = not(a > b+10)
On exécute le script suivant :
a,b = 10,3
if a < 10:
a,b = a+2,b+a
Quelle est la valeur de b
à la fin de son exécution ?
Réponses :
A- 3
B- 12
C- 13
D- 15
Sachant que l'expression not(a or b)
a la valeur True
, quelles peuvent être les valeurs des variables
booléennes a
et b
?
Réponses :
A- True et True
B- False et True
C- True et False
D- False et False
Quelle est la valeur de la variable b à la fin de l'exécution du script suivant ?
a = 2
b = 5
if a > 8:
b = 10
elif a > 6:
b = 3
Réponses :
A- 3
B- 5
C- 6
D- 10
Les QCM suivants sont issus de https://genumsi.inria.fr.
On a saisi le code suivant :
a = float( input("Saisir un nombre : ") )
if a < 1 :
print("TIC")
elif a > 8.5 :
print("TAC")
else :
print("TOE")
Quel message affiche l’ordinateur lorsque l'utilisateur saisit 8.5 ?
Réponses :
A- TIC
B- TAC
C- TOE
D- Le code n'affiche aucun message
Avec la fonction donnée ci-dessous l'instruction mystere(0,1)
retourne :
def mystere(a,b):
reponse=1
if a==0:
if b==0:
reponse=0
return reponse
Quelles sont les valeurs de a et b à la fin du programme ?
Réponses :
A- 0
B- 1
C- True
D- False
Soit la chaîne de caractères : ch = "Pensif au bord de l'océan"
Que renvoie l'instruction :
"nsi" in ch
Réponses :
A- True
B- False
C- "nsi"
D- "Pensif au bord de l'océan"
On définit la fonction mystère suivante :
def mystere (n) :
if n % 3 == 0 or n % 5 == 0 :
if n % 3 == 0 :
resultat = 'A'
else :
resultat = 'B'
else :
if n % 5 == 0 :
resultat = 'C'
else :
resultat = 'D'
return resultat
Quelle est la valeur de mystere(10)
?
Réponses :
A- 'A'
B- 'B'
C- 'C'
D- 'D'
Pour prolonger sur la structure
try except
.