N.B. Niveau : Première Générale, enseignement de spécialité NSI (Numérique et Sciences Informatiques)
Une boucle permet d'exécuter une portion de code plusieurs fois de suite.
while
Syntaxe :
while (expression): # ne pas oublier le signe de ponctuation ':'
bloc d'instructions # attention à l'indentation
# suite du programme
Si l'expression est vraie (True
) le
bloc d'instructions est exécuté, puis l'expression est à nouveau
évaluée.
Le cycle continue jusqu'à ce que l'expression soit fausse (False
)
: on passe alors à la suite du programme.
Exemple : un script qui compte de 1 à 4
# script Boucle1.py
# initialisation de la variable de comptage
compteur = 1
while compteur<5:
# ce bloc est exécuté tant que la condition (compteur<5) est vraie
print (compteur, compteur<5)
compteur += 1 # incrémentation du compteur, compteur = compteur + 1
print ("Fin de la boucle")
>>>
1 True
2 True
3 True
4 True
Fin de la boucle
Table de multiplication par 8 :
# script Boucle2.py
compteur = 1 # initialisation de la variable de comptage
while compteur<=10:
# ce bloc est exécuté tant que la condition (compteur<=10) est vraie
print (compteur, '* 8 =', compteur*8)
compteur += 1 # incrémentation du compteur, compteur = compteur + 1
print ("Et voilà !")
>>>
1 * 8 = 8
2 * 8 = 16
3 * 8 = 24
4 * 8 = 32
5 * 8 = 40
6 * 8 = 48
7 * 8 = 56
8 * 8 = 64
9 * 8 = 72
10 * 8 = 80
Et voilà !
Affichage de l'heure courante :
# script Boucle3.py
import time # importation du module time
quitter = 'n' # initialisation
while quitter != 'o':
# ce bloc est exécuté tant que la condition est vraie
# strftime() est une fonction du module time
print ('Heure courante ',time.strftime('%H:%M:%S'))
quitter = input('Voulez-vous quitter le programme (o/n) ? ')
print ('A bientôt')
>>>
Heure courante 09:48:54
Voulez-vous quitter le programme (o/n) ? n
Heure courante 09:48:58
Voulez-vous quitter le programme (o/n) ? o
A bientôt
for
Syntaxe :
for (élément) in (séquence) :
bloc d'instructions
# suite du programme
Les éléments de la séquence sont issus d'une chaîne de caractères ou bien d'une liste.
# script Boucle4.py
chaine = 'Bonsoir'
for lettre in chaine: # lettre est la variable d'itération
print (lettre)
print ('Fin de la boucle')
La variable lettre
est initialisée
avec le premier élément de la séquence ('B'
).
Le bloc d'instructions est alors exécuté.
Puis la variable lettre
est mise à jour avec
le second élément de la séquence ('o'
) et le
bloc d'instructions à nouveau exécuté...
Le bloc d'instructions est exécuté une dernière fois lorsqu'on arrive
au dernier élément de la séquence ('r'
) :
>>>
B
o
n
s
o
i
r
Fin de la boucle
Un autre exemple avec une liste :
# script Boucle5.py
liste = ['Pierre',67.5,18]
for element in liste:
print (element)
print ('Fin de la boucle')
Là, on affiche dans l'ordre les éléments de la liste :
>>>
Pierre
67.5
18
Fin de la boucle
L'association avec la fonction range()
est très utile pour créer des séquences automatiques de nombres entiers
:
# script Boucle6.py
print (list(range(1,5)))
for i in range(1,5):
print (i)
print ('Fin de la boucle')
>>>
[1, 2, 3, 4]
1
2
3
4
Fin de la boucle
La création d'une table de multiplication paraît plus simple
avec une boucle for
qu'avec une boucle while
:
# script Boucle7.py
for compteur in range(1,11):
print (compteur, '* 9 =', compteur*9)
print ('Et voilà !')
>>>
1 * 9 = 9
2 * 9 = 18
3 * 9 = 27
4 * 9 = 36
5 * 9 = 45
6 * 9 = 54
7 * 9 = 63
8 * 9 = 72
9 * 9 = 81
10 * 9 = 90
Et voilà !
break
L'instruction break
provoque une
sortie immédiate d'une boucle while
ou d'une
boucle for
.
Dans l'exemple suivant, l'expression True
est toujours ... vraie : on a une boucle sans fin.
L'instruction break
est donc le seul moyen de
sortir de la boucle :
# script Boucle8.py
import time # importation du module time
while True:
# strftime() est une fonction du module time
print ('Heure courante ',time.strftime('%H:%M:%S'))
quitter = input('Voulez-vous quitter le programme (o/n) ? ')
if quitter == 'o':
break
print ('A bientôt')
>>>
Heure courante 14:25:12
Voulez-vous quitter le programme (o/n) ? n
Heure courante 14:25:20
Voulez-vous quitter le programme (o/n) ? o
A bientôt
Si vous connaissez le nombre de boucles à effectuer, utiliser
une boucle for
.
Autrement, utiliser une boucle while
(notamment pour faire des boucles sans fin).
Exercice 3.1 ★ Modifier le programme du chapitre 1 qui permettait de convertir un nombre décimal en bainaire
# convertir un nombre décimal en binaire
n=float(input("nombre décimal compris entre 0 et 1"))
b=''
n=n*2
b=b+str(int(n))
n=n-int(n)
Il fallait répéter autant de fois les 3 dernières lignes pour obtenir le résultat sur 8 ou 16 bits.
Ajouter une boucle for permettant d'afficher le résultat sur 16 bits
Faire valider le script par le professeur
Exercice 3.2 ★
Ecrire un programme qui calcule la moyenne d'une série de
notes stockée dans un tableau notes=[13,14.5,11,5].
On pourra utiliser l'instruction len(notes) qui renvoie le nombre de
notes contenues dans le tableau.
Résultat :
>>>
Moyenne : 13.0
>>>
Au début du programme précédent, demander à l'utilisateur de saisir une note au clavier, ajouter cette nouvelle note dans la liste de notes avec l'instruction notes.append(note) et afficher la moyenne de toutes ces notes.
Résultat :
>>>
Entrer votre note : 15
Moyenne : 13.5
>>>
Faire valider le script par le professeur
Exercice 3.3 ★
1) Avec une boucle for
, écrire un script qui
compte le nombre de lettres s dans une chaîne de caractères.
Par exemple :
>>>
Entrer la chaîne : Neymar da Silva Santos
Résultat : 3
Exercice 3.4 ★ Ecrire le programme de rendu de monaie dont l'algorithme est donné ci-dessous :
pieces <- [5,2,1]
M <- montant à rendre en Euros
i <- 0
Tant que M>0
NbrPieces <- division entière de M par pieces[i]
si NbrPieces > 0
Afficher le nombre de pièces et la pièce
M <- M modulo pieces[i]
fin si
i <- i+1
Fin tant que
Exercice 3.5 ★☆
Ecrire un script
qui calcule la moyenne des notes obtenues contenues au bac , la note la
plus élevée et la plus basse contenue dans le fichier csv suivant : notes.csv.
Enregistrez ce fichier au même endroit où vous allez sauvegarder le
programme python. Ouvrir ce fichier avec un tableur pour voir son
contenu. Vérifier avec le tableur qu'il y a bien 323 élèves
import csv
with open("notes.csv",'r') as fichier: # Ouvre le fichier csv en lecture
contenu = csv.reader(fichier,delimiter=';') # lit le fichier csv en séparant les champs
Liste=list(contenu) # Tranforme le contenu en liste
fichier.close() # ferme le fichier
print ("La Liste contient",len(Liste)-1,"élèves") # affiche le nombre d'élèves
print(Liste[1][0],Liste[1][1],Liste[1][2],round(float(Liste[1][3]),1))
Résultat final :
>>>
La Liste contient 323 élèves
moyenne de tous les élèves : 11.29
La note la plus faible : 2.08
La note la plus élevée : 20.0
7 élèves se prénomment Lucas
>>>
Faire valider le script par le professeur
Exercice 3.6 ★☆
1) Ecrire le script du jeu de devinette suivant :
>>>
Le jeu consiste à deviner un nombre entre 1 et 100 :
---> 50
trop petit !
---> 75
trop petit !
---> 87
trop grand !
---> 81
trop petit !
---> 84
trop petit !
---> 85
Gagné en 6 coups !
Remarque : pour créer un nombre entier aléatoire entre 1 et 100 :
import random
nombre = random.randint(1,100) # nombre prendra une valeur entière entre 1 et 100
2) Quelle est la stratégie la plus efficace ?
3) Montrer que l'on peut deviner un nombre en 7 coups maximum.
Bibliographie : La dichotomie
Faire valider le script par le professeurEcrire un programme qui transforme un fichier codé au format UTF-8 en un fichier codé au format ISO-8859-1
Par un clic droit de souris, enregistrez le fichier utf-8.html
dans le dossier de votre programme. Ouvrir le fichier avec un
navigateur pour vérifier si les caractères s'affichent correctement.
Editer ce même fichier avec le bloc-note ou notepad++ et remplacer
la ligne <meta charset="utf-8"> par <meta
charset="ISO-8859-1"> et enregistrer le fichier sous iso-8859.html
Coller les lignes suivantes permettant de lire le fichier iso-8859.html, puis exécuter-le.
import binascii
fichier=open("utf8.html","rb") # ouverture du fichier utf-8
data = binascii.hexlify(fichier.read()) # Lecture du fichier en hexadécimal
fichier.close() # fermeture
print (data)
En parallèle, exécuter le programme suivant : Hxd.exe
et ouvrir le fichier iso-8859.html puis comparer les codes lus par
python et le logiciel. On remarque que les caratères accentués
commencent par C3et sont codés sur 2 octets, le caratère spécial commence par C2.
En appliquant l'algorithme du cours du chapitre2, compléter le code ci-dessous :
# Programme permettant de convertir du code UTF-8 en code ISO-8859-1
import binascii
fichier=open("iso-8859.html","rb") # ouverture du fichier utf-8
data = binascii.hexlify(fichier.read()) # Lecture du fichier en hexadécimal fichier.close() # fermeture du fichier
# créer une liste code, contenant le code ASCII des caractères transformé en décimal
code=[int(data[i:i+2],16) for i in range(0,len(data),2)]
Début de l'algorithme à implanter:
initialiser i<-0
initialiser ISO<-[]
Tant que i est inférieur à la longueur du code faire :
si code[i] > 0x7F faire : # caractères spéciaux et accentués
stocker dans une variable h : code[i]
si h=0xC3 alors :
stocker dans une variable l : code[i+1]
Masquer le quartet de poids faible de h (0xF0)
faire un ou logique avec l (symbole | alr Gr 6)
ajouter le résultat à la liste ISO
incrémenter i
fin si
si h=0xC2 alors:
incrémenter i # permet de pointer l'octet suivant
ajouter code[i] à la liste ISO
fin si
sinon
ajouter code[i] à la liste ISO
fin sinon
incrémenter i
Fin Tant que Fin de l'algorithme
# Ecriture du fichier iso.html
fichier=open("ISO.html","w")
for i in ISO:
fichier.write(chr(i))
fichier.close()
Après exécution, le fichier ISO.html devrait afficher les bons caratères, codés au format ISO-8859-1
Contenu
sous licence CC BY-NC-SA 3.0
Fabrice Sincère ; version 1.3.5.29
Modifié et adapté par Pascal Hassenforder 7/11/2019