- Introduction
- Le mode interactif
- Variables et affectations
- Programmation et fonctions
- Structure conditionnelle
- Boucles non bornées
- Les listes
- Boucles bornées
- Lire et écrire dans un fichier
- Application en SNT (en seconde)
Introduction au langage Python
Instruction conditionnelle
On a parfois besoin que certaines instruction ne s'exécutent que dans certains cas. Par exemple, dans le dernier exercice de la partie précédente, où l'on souhaite simuler le déplacement d'un mobile, il est intéressant de modifier la trajectoire en cas de collision (rebond). La proposition de correction contenanit en particuler des lignes telles que :
if y>198:
y = 198
v_y = -v_y
if
conditionne l’exécution d’un bloc de commandes.
- Le mot-clef
if
est suivi d'une condition. - Le symbole
:
doit terminner cette première ligne. - Les instructions conditionnées sont indentées.
if condition :
instructions # indentées
# après : plus indenté
else
peut être utilisée juste après le bloc suivant l'instruction if
. Il permet, de la même façon, d'indiquer les instruction à exécuter quand la condition n'est pas réalisée.
if condition :
instructions
else : # Ne pas oulier les :
instructions
Exemple : Affichage de la parité d'un entier.
x = input("Entrer un entier : ")
x = int(x)
if x%2 == 0 : # == pour comparer à distinguer du = de l'affectation
print(x,'est pair.')
else :
print(x,'est impair.')
age = input('Quel est ton âge ? ')
age = int(age)
...
age = input('Quel est ton âge ? ')
age = int(age)
if age < 18 :
print('Tu es mineur')
else :
print('Tu es majeur')
On cherche souvent à éviter au maximum la redondance d'écriture. On pourra alors proposer :
age = input('Quel est ton âge ? ')
age = int(age)
if age < 18 :
categorie = 'mineur'
else :
categorie = 'majeur'
print('Tu es',categorie)
En général, on évite de ne définir une variable que dans des blocs conditionnels si elle est utilisée en dehors de ces blocs. Il est préférable de faire une initialisation (en proposant la valeur par défaut).
age = input('Quel est ton âge ? ')
age = int(age)
categorie = 'majeur'
if age < 18 :
categorie = 'mineur'
print('Tu es',categorie)
Imbrication
On peut impliquer plusieurs conditionnelles :
x = input("Entrer un chiffre : ")
if len(x)==1 and 48<=ord(x)<=57: # Teste si x est un chiffre
x = int(x)
if x%2 == 0 :
print(x,'est pair.')
else :
print(x,'est impair.')
else :
print(x,'n\'est pas un chiffre.')
écrire la fonction bissextile
pour qu'elle renvoie 'bissextile'
ou 'non bissextile'
selon que son paramètre entier donannt l'année. La tester avec les années 2000 et 2020 (bissextiles) et les années 2200 et 2022 (non bissextiles).
Il y a beaucoup de façons différentes d'écrire un programme répondant à cette question. En voici une :
def bissextile(annee):
""" Renvoie 'bissextile' ou 'non bissextile' selon l'annee."""
reponse = 'non bissextile'
if annee%4==0 :
if annee%100 != 0 :
reponse = 'bissextile'
if annee%400 == 0 :
reponse = 'bissextile'
return reponse #annee%4==0 and annee%100!=0 or annee%400==0
print(2000,bissextile(2000))
print(2020,bissextile(2020))
print(2200,bissextile(2200))
print(2022,bissextile(2022))
Disjonction
Quand on souhaite passer en revue différents cas disjoints, on peut utiliser l’imbrication, ou contracter else : if
en elif
. Ce dernier choix permet une relecture plus simple du code.
if q <= -1:
print('non')
else :
if -1 < q < 1 :
print('0')
else :
if q == 1 :
print('1')
else :
print('inf')
if q <= -1:
print('non')
elif q < 1 :
print('0')
elif q == 1 :
print('1')
else :
print('inf')
plus_longue
, prenant deux chaines de caractères en paramètres, qui renvoie 1, ou 2 selon si c'est la première ou la seconde la plus longue, ou qui renvoie 0 si les deux ont la même longueur.
>>> plus_longue('je suis', 'il était')
2
def plus_longue(x, y):
""" Renvoie 1 ou 2 pour indiquer la chaine la plus longue,
ou 0 si elles ont la même longueur """
reponse == 0
if len(x) != len(y) :
if len(x) > len(y)
reponse = 1
else :
reponse = 2
return reponse
Par disjonction :
def plus_longue(x, y):
""" Renvoie 1 ou 2 pour indiquer la chaine la plus longue,
ou 0 si elles ont la même longueur """
reponse == 0
if len(x) > len(y)
reponse = 1
elif len(x) < len(y) :
reponse = 2
return reponse
Écrire une fonction de deux paramètre,
age
: un entier et etat
: une chaîne de caractères, qui renvoie 'majeur'
ou 'mineur'
selon à quoi correspond l'âge dans cet état.
>>> majeur(18,'Texax')
'majeur'
>>> majeur(18, 'Alabama')
'mineur'
def majeur(age, etat):
""" Renvoie 'majeur' ou 'mineur' selon l'age et l'état """
reponse = True
if etat == 'Nebraska' or etat == 'Alabama' :
if age < 19 :
reponse = False
elif etat == 'Mississippi' :
if age < 21 :
reponse = False
else :
if age < 18 :
reponse = False
return reponse
Avec un pré-traitement :
def majeur(age, etat):
""" Renvoie 'majeur' ou 'mineur' selon l'age et l'état """
majorite = 18
if etat == 'Nebraska' or etat == 'Alabama' :
majorite = 19
elif etat == 'Mississippia' :
majorite = 21
reponse = 'majeur'
if age < majorite :
reponse = 'mineur'
return reponse
En utilisant une structure de donnée pour le pré-traitement :
def majeur(age, etat):
""" Renvoie 'majeur' ou 'mineur' selon l'age et l'état """
majorite = {'Nebraska' : 19, 'Alabama' : 19, 'Mississippia' : 21}
maj = majorite.get(etat, 18) # 18 par défaut
reponse = 'majeur'
if age < majorite :
reponse = 'mineur'
return reponse
Expressions booléennes
Les "conditions" travaillées plus haut sont en fait des expressions booléennes, c'est à dire des formules logiques, qui évaluées, donnent deux valeurs possibles : True
ou False
.
Un booléen peut être fromé à partir d'opérateurs de comparaison :
>>> 1 == 2 # égaux
False
>>> 1 != 2 # différents
True
>>> 1 > 2
False
>>> 1 < 2
True
>>> 1 >= 2
False
>>> 1 <= 2
True
>>> 1 is 2 # même identifiant
False
>>> 1 is not 2
True
>>> 1 in {1, 2, 3} # Appartient à
True
Attention à l'ordre lexicographique !
>>> 'b' < 'ab'
False
>>> '2' < '12'
False
Les opérateurs de comparaison peuvent être enchainés :
>>> x = 3
>>> 0 <= x < 10
True
On peut également utiliser les opérateurs logiques :
>>> not x == 3
False
>>> x == 3 or x == 6
True
>>> x == 3 and x == 6
False
Mémo sur les priorités On peut utiliser le parenthésage pour forcer des priorités. Sinon, elles suivent l'ordre ci-dessous :
{} |
() |
[] |
. |
** |
~ |
(dictionnaire) | (argument) | (partie) | (attribut) | (puissance) | (inversion de bit) |
+ |
- |
* |
/ |
// |
% |
(positif) | (négatif) | (produit) | (division) | (quotient) | (reste) |
+ |
- |
<< |
>> |
& |
^ |
(somme) | (soustraction) | (décalage) | (décalage) | (et binaire) | (ou exclusif) |
| |
< |
> |
<= |
>= |
== |
(ou binaire) | (inférieur strict) | (supérieur strict) | (inférieur) | (supérieur) | (égal) |
!= |
is |
in |
not |
and |
or |
(différent) | (est) | (appartient) | (non) | (et) | (ou) |
lambda | |||||
(expression lambda) |
Pour s'entraîner
On modélise un lancer par une chaîne ce caractères composée de 4 chiffres entre 1 et 6. Écrire la fonction
score
qui prend une telle chaîne comme paramètre et renvoie le score associé.
- Utiliser des parenthèses autour de la condition permet de passer à la ligne pour un code plus lisible ($<80$ caractères par ligne).
- On peut utiliser efficement des
if
etelif
, selon si les cas s'exclus ou non. - Quand le bloc conditionnel se réduit à une instruction courte, on peut la positionner juste après les
:
. - Dans le cas du carré ou du brelan on peut donner directemnt se score. Dans le cas des paires, il faut bien les cumuler.
def score(lancer):
""" lancer est un chaine de 4 caractères composée
de chifrfes entre 1 et 6. La fonction renvoie
le score correpond """
points = 0
if lancer[0]==lancer[1]==lancer[2]==lancer[3] :
points = 10
elif ( lancer[0]==lancer[1]==lancer[2]
or lancer[0]==lancer[1]==lancer[3]
or lancer[0]==lancer[2]==lancer[3]
or lancer[1]==lancer[2]==lancer[3] ) :
points = 5
else :
if lancer[0]==lancer[1] : points = points + 2
elif lancer[0]==lancer[2] : points = points + 2
elif lancer[0]==lancer[3] : points = points + 2
if lancer[1]==lancer[2] : points = points + 2
elif lancer[1]==lancer[3] : points = points + 2
if lancer[2]==lancer[3] : points = points + 2
return points
print("3333 marque",score("3333"),"points") # 10 points
print("3353 marque",score("3353"),"points") # 5 points
print("3355 marque",score("3355"),"points") # 4 points
print("3354 marque",score("3354"),"points") # 2 points
print("3254 marque",score("3254"),"point") # 0 point