Programmer en Python en 2nde

Instructions conditionnelles : if

Crédits

Toute la structure html/css/js et une grande partie du contenu ont été réalisés par Nicolas Buyle-Bodin professeur au lycée Lacassagne, avec l'aide de Jean-Manuel Mény, professeur au lycée de la plaine de l'Ain. Ils ont travaillé pendant plusieurs centaines d'heures pour créer un site de formation à destination des enseignants du secondaire de l'académie de Lyon d'une grande qualité visible sur le portail Mathématiques du site académique. Ils ont eu la gentillesse de placer leur code source sous licence Creative Commons BY-NC-SA Respect de la Paternité - Pas d'utilisation commerciale - Partage des conditions initiales à l'identique..

Nous les en remercions chaleureusement.

Un exemple

Un pâtissier breton vend des petits kouign-amann au tarif de $1,5$ euros l’unité pour l’achat de 1 à 10 pièces et $1,35$ euros l’unité pour l’achat de plus de 10 pièces. L’algorithme ci-dessous permet de calculer le prix de l’achat de $n$ kouign-amann.

algorigramme if

Voici une traduction possible en Python :

    
    
n = int(input("Nombre de kouigns ? "))
if n < 11:
    p = 1.5 * n
else:
    p = 1.35 * n
print("Prix en euros :", p)


    

Si... alors... sinon...

Un instruction conditionnelle est composée d’un test puis d'un bloc d'instructions.

En Python, le test commence par le mot clef if suivi d’une condition à valeur booléenne (True ou False) et se termine par le symbole :.

Le bloc d’instructions qui suit s'exécute si et seulement si le test a pour valeur True. Il correspond à un embranchement dans le flux d'instructions.

En Python, un bloc d'instructions commence à la première ligne suivant le symbole : et son imbrication dans le reste du programme est caractérisée par son niveau d'indentation. Toutes les instructions d'un même bloc doivent avoir le même niveau d'indentation. Le flux principal d'instructions est collé contre la marge puis chaque niveau d'indentation est décalé de quatre espaces ou une tabulation vers la droite.


# flux parent
if conditionA:
    #bloc d'instructions exécuté si la valeur de conditionA est True
    if conditionB:
        #bloc d'instructions imbriqué, exécuté si conditionA  est à True
        # et si conditionB est à True
# retour au flux parent
	

Si la condition du test n'est pas vérifiée, on peut prévoir l'exécution d'un bloc d'instructions alternatif après un else :.


# flux parent
if condition:
    #bloc d'instructions exécuté si la valeur de condition est True
else:
    #bloc d'instructions exécuté si la valeur de condition est False
#retour au  flux parent
	

On peut aussi tester d'autres conditions mutuellement exclusives pour modéliser un choix entre plus de deux alternatives. Chaque condition testée dans un elif condition : commande un bloc d'instructions et un bloc d'instructions par défaut peut se trouver après un else :.


# flux parent
if condition1:
    #bloc d'instructions exécuté si la valeur de condition1 est à True
elif condition2:
    #bloc d'instructions  si  condition2 est True (et condition1 est à False) 
elif condition3:
    #bloc d'instructions si  condition3 est True (et condition1 et condition2 sont à False)
else : 
    #bloc d'instruction si toutes les conditions précédentes sont à False
#retour au flux parent
	

Ai-je bien compris le cours ?

  1. Recopier et compléter le script Python ci-dessous pour qu’il affiche le plus grand des deux entiers saisis par Alice et Bob.
  2. 
    					
    					
  3. Pour le diplôme du baccalauréat, si on note m la moyenne du candidat au premier groupe d'épreuves, on distingue six possibilités : "Refusé" si \( m \lt 8 \), "Admis au second groupe" si \( 8 \leqslant m \lt 10 \), "Admis" si \(10 \leqslant m \lt 12 \), "Admis mention assez bien" si \(12 \leqslant m \lt 14\), "Admis mention bien" si \(14 \leqslant m \lt 16\) et "Admis mention très bien" sinon. Compléter le script Python ci-dessous pour qu'il affiche la situation d'un candidat en fonction de sa moyenne au premier groupe d'épreuves.
  4. 
    					
    					
  • Solution Question 1
  • Solution Question 2

nbAlice = int(input('Nombre choisi par Alice'))
nbBob = int(input('Nombre choisi par Bob'))
if nbAlice >= nbBob:
	print(nbAlice)    
else:
    print(nbBob)			

m = float(input('Moyenne du candidat ? '))
if  m < 8:
    print("Refusé")
elif 8 <= m < 10:
    print("Admis au second groupe")
elif 10 <= m < 12:
    print("Admis")
elif 12 <= m < 14:
    print("Admis mention assez bien")
elif 14 <= m < 16:
    print("Admis mention  bien")
else:
    print("Admis mention très bien")
        

ou en simplifiant puisque si la moyenne m n'est pas inférieure à 8, elle est nécessairement supérieure ou égal à 8 etc ...


m = float(input('Moyenne du candidat ? '))
if  m < 8:
    print("Refusé")
elif  m < 10:
    print("Admis au second groupe")
elif m < 12:
    print("Admis")
elif  m < 14:
    print("Admis mention assez bien")
elif  m < 16:
    print("Admis mention  bien")
else:
    print("Admis mention très bien")			
        

Politique tarifaire

  1. Le tarif individuel d’une sortie en bateau est de 40 euros par personnes si un groupe compte moins de 5 personnes et de 30 euros sinon. Écrire une fonction Python, tarif_bateau(n) qui retourne le tarif global pour le groupe en fonction de son effectif n.
  2. 
    					
    					
  3. Le tarif de visite d’un château est le suivant :
    • gratuit pour les enfants entre 0 et 3 ans ;
    • 4 euros pour les enfants entre 4 et 11 ans ;
    • 9 euros pour les plus de 11 ans.
    Écrire une fonction Python, tarif_chateau(age) qui retourne le tarif appliqué en fonction de l'âge n.
  4. 
    					
    					
  • Solution Question 1
  • Solution Question 2

def tarif_bateau(n):
    if n < 5:
        return 40 * n
    else:
        return 30 * n				

def tarif_chateau(age):
    if age <= 3:
        tarif = 0
    elif 3 < age <= 11:
        tarif = 4
    else:
        tarif = 9
    return tarif
        

ou en simplifiant puisque si age n'est pas inférieur ou égal à 3, il est nécessairement supérieur à 3 :


def tarif_chateau(age):
    if age <= 3:
        tarif = 0
    elif age <= 11:
        tarif = 4
    else:
        tarif = 9
    return tarif				
        

Bâtiments Basse Consommation

Pour respecter la norme RT2012 des maisons BBC (Bâtiments Basse Consommation), il faut que la résistance thermique des murs notée R soit supérieure ou égale à 4. Pour calculer cette résistance thermique, on utilise la relation : \(R=\frac{e}{c}\) où $e$ désigne l’épaisseur de l’isolant en mètre et $c$ désigne le coefficient de conductivité thermique de l’isolant. Ce coefficient permet de connaître la performance de l’isolant.

  1. Noa a choisi comme isolant la laine de verre dont le coefficient de conductivité thermique est : $c = 0,035$. Il souhaite mettre 15 cm de laine de verre sur ses murs. Sa maison respecte-t-elle la normé RT2012 des maisons BBC ?
  2. Écrire une fonction Python, normeRT2012(e, c) qui retourne True si la norme est respectée et False sinon.
  3. 
    					
    					
    • Solution Questions 1 et 2
    
    def normeRT2012(e, c):
        r = e/c
        if r >= 4:
            return True
        else:
            return False
       
    print(normeRT2012(0.15, 0.035))					
            
    True
            

Opérateurs de test

Une test doit avoir une valeur booléenne, ce peut être le résultat :

  • d'une comparaison arithmétique entre deux valeurs numériques a et b :
    • l'égalité dont la syntaxe en Python est a == b
    • la différence dont la syntaxe en Python est a != b
    • l'inégalité dont la syntaxe en Python est a < b ou a > b ou a <= b ou a >= b
  • d'une opération logique entre deux valeurs booléennes x ou y :
    • la négation logique dont dont la syntaxe en Python est not x
    • le ou inclusif dont la syntaxe en Python est x or y
    • le et dont la syntaxe en Python est x and y

Il existe des règles de priorité : opérateurs arithmétiques prioritaires sur les opérateurs logiques, not prioritaire sur and qui est prioritaire sur or. Des parenthèses permettent de changer les priorités.

intervalle

  1. On considère le programme suivant :
    
    x = float(input("Entrez un nombre réel : "))
    if x > 2 and x < 7:
        print("Appartient")
    	
    Décrire avec la notation des intervalles l'ensemble des réels x pour lesquels l'affichage obtenu sera "Appartient".
  2. Écrire un code qui afficherait "Appartient" pour les réels de de l'intervalle \( ] -2 ; 21 ] \) et "N'appartient pas" pour les autres réels.
  3. Écrire une fonction Python qui respecte la spécification suivante :
    Paramètres trois réels \(x\), \(a\), \(b\) (où \( a \leqslant b \) )
    Valeur renvoyée True si \( x\in [a;b[\), False sinon.
  • Question 1
  • Question 2
  • Question 3

L'intervalle est bien entendu l'intervalle \( ] 2 ; 7 [ \).

Notez que Python autorise de ne pas utiliser and :


x = float(input("Entrez un nombre réel : "))
if 2 < x < 7:
    print("Appartient")
	

x = float(input("Entrez un nombre réel : "))
if   -2 < x and x <= 21:
    print("Appartient")
else:
    print("N'appartient pas")
	

ou encore :


x = float(input("Entrez un nombre réel : "))
if   -2 < x <= 21:
    print("Appartient")
else:
    print("N'appartient pas")
	

def est_dans_foV1(x, a, b) :
    #Une version mal écrite
    if  x >= a and x < b:
        return True
    else:
        return False

def est_dans_fo(x, a, b) :
    #Version plus élégante
    return x >= a and x < b
	

nombre = float(input("Entrez un nombre x : "))
borne_inf = float(input("Entrez la borne inférieure de l'intervalle : "))
borne_sup = float(input("Entrez la borne supérieure de l'intervalle : "))


print("{} est-il dans [{};{}[ ? ".format(nombre, borne_inf, borne_sup))
print(est_dans_fo(nombre, borne_inf, borne_sup))
	

On a utilisé "fo" dans le nom de la fonction pour : fermé (à gauche), ouvert (à droite).

réunion d'intervalles

  1. On considère le programme suivant :
    
    x = float(input("Entrez un nombre réel : "))
    if  x > 17 or x < 7:
        print("Appartient")
    			
    Décrire avec la notation des intervalles l'ensemble des réels x pour lesquels l'affichage obtenu sera "Appartient".
  2. Écrire un code qui afficherait "Appartient" pour les réels de l'ensemble \( [ -10; 5 ] \cup ] 7; +\infty [ \) et "N'appartient pas" pour les autres réels.
  3. Écrire une fonction Python qui respecte la spécification suivante :
    Paramètres trois réels x, a, b
    Valeur renvoyée True si \( x\in ]-\infty; a] \cup [b; +\infty[ \), False sinon.
  • Question 1
  • Question 2
  • Question 3
\( ] -\infty; 7 [ \cup ] 17; +\infty [ \)

x = float(input("Entrez un nombre réel : "))
if  (-10 <= x and x <= 5) or  x >= 7 :
    print("Appartient")
else:
    print("N'appartient pas")

ou encore :


x = float(input("Entrez un nombre réel : "))
print(  (-10 <= x  <= 5) or  x >= 7 )

def est_dans_unionV0(x, a, b) :
    #une version mal écrite
    if x <= a or x >= b:
        return True
    else:
        return False
    
def est_dans_union(x, a, b) :
    return x <= a or x >= b
	

nombre = float(input("Entrez un nombre x : "))
borne1 = float(input("Entrez la borne supérieure de l'intervalle ]-inf; a] : "))
borne2 = float(input("Entrez la borne inférieure de l'intervalle [b; +inf[ : "))


print("{} est-il dans  ]-inf; {}] union [{};+inf[ ? ".format(nombre, borne1, borne2))
print(est_dans_union(nombre, borne1, borne2))