TD D2 : boucles inconditionnelles FOR¶
L'objectif de ce notebook est de revoir assez rapidement la notion de répétitions avec des boucles conditionnelles du type FOR..., ainsi que d'introduire une initiation à la notion de liste que l'on travaillera plus en détail plus tard.
On a déjà vu dans le TD précédent la structure universelle d'une boucle avec l'instruction WHILE. Dans le cas où l'on connait à l'avance le nombre de répétitions, les langages de programmations comme python ont introduit une syntaxe un peu plus courte : la boucle inconditionnelle. Sa structure en python est la suivante :
!!! note Boucle inconditionnelle
for i in iterable :
bloc d'insctructions
!!!
Précisons un peu la notion d'itérable. Pour faire simple, c'est toute sorte d'objet dont python peut énumérer les composantes. Par exemple, essayer le code suivant:
# exemples d'itérateurs avec la fonction range(...)
it1 = range(10) # range(10) est un "itérable" constitué des entiers de 0 à 9
it2 = range(3,10) # entiers de 3 à 9
it3 = range(3,10,2) # entiers de 3 à 9 de deux en deux
for i in it1:
print(i)
for i in it2:
print(i)
for i in it3:
print(i)
!!! warning Attention
Même si techniquement en python c'est faisable, on s'interdira de modifier la valeur de la variable i
à l'intérieur de la boucle. En effet cela nuit gravement à la lisibilité du code, à son debogage ainsi qu'à sa preuve.
!!!
!!! note Comment parcourir une liste ?
Rappel de deux façons pour parcourir une liste l=['pomme', 'raisin', 'kiwi']
:
La méthode "classique" utilisable dans la plupart des langages :
for index in range(len(l)): # len(l) donne la longueur de la liste print(l[index]) # affiche : # pomme # raisin # kiwi
Noter la syntaxe l[index] qui permet d'accéder à l'élément de numéro index stocké dans la liste (avec une numérotation qui commence à 0)
Si l'on n'a besoin que des valeurs (et pas des index):
for element in l: print(element) # affiche : # pomme # raisin # kiwi
!!!
Exemple¶
Dans le TDC1, on a écrit un programme qui décidait si une année était bissectile.
annee = 2024
if (annee%4 == 0 and annee%100 != 0) or (annee%400 == 0) :
print(f"{annee} est bissectile")
else :
print(f"{annee} n'est pas bissectile")
Modifier ce programme de telle sorte qu'il détermine le nombre d'années bissectiles entre les années 1000 et 2100 inclues.
mini = 1000
maxi = 2100
# à compléter
print(f"Il y a {à compléter} années bissectiles entre les années {mini} et {maxi}")
Exercice 1 : calcul d'une somme de nombres¶
Q1. Compléter le script suivant qui doit calculer la somme des 100 premiers entiers non nuls.
somme = 0
for # ... à compléter ...
Q2. Vous êtes à l'entraînement de fitness, et le coach vous demande de faire une "pyramide de 10 pompes" (c'est à dire 1+2+3+..+9+10+9+8+...+1). Combien de pompes cela représente-t-il au total ? Écrire un petit script qui permet de faire le calcul à votre place (Vous pouvez envisager plusieurs solutions...)
# Nombre de pompes pour une pyramide de 10
Exercice 2 : calcul de la moyenne d'une liste¶
On tire aléatoirement et de façon uniforme 1000 notes comprises entre 0 et 20. Que pensez-vous de la moyenne de cette série ?
L'objectif de cet exercice est de simuler ce tirage et d'estimer la moyenne.
On rappelle comment obtenir des nombres aléatoires avec python :
from random import randint # importe la fonction randint(...) depuis le module random
nb = randint(0,20) # nb contient un nombre entier aléatoire entre 0 et 20
Q3. Compléter le script suivant afin de construire une liste notes
qui contient 1000 notes entières comprises entre 0 et 20.
# script qui doit créer la liste 'notes'
from random import randint
# à compléter
Q4. Compléter la cellule suivante de façon à faire afficher la moyenne de la liste notes
et confirmer ou pas votre intuition.
# un script qui calcule la moyenne de la liste 'notes'
# à compléter...
Q5. Est-il facile de calculer la médiane de cette liste ? Si oui comment ? (ne pas hésiter à chercher des commandes dans le mémo ou demander à une IA !)
# un script qui calcule la médiane de la liste 'notes' précédente
Exercice 3 : itérer sur une chaîne de caratcères¶
On considère pour cet exercice la chaine de caractère alphabet
définie ci-dessous :
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
Q6. Écrire un script qui affiche une lettre sur 2 (c'est à dire A puis C puis E etc...)
# Une lettre sur deux
# à compléter...
Q7. Écrire un script que écrit les lettres dans l'autre sens (Z puis Y puis X etc...)
# lettres en sens inverse
# à compléter...
Q8. Un peu plus dur... Écrire un script qui analyse le contenu de la variable mot
ci-dessous et qui affiche palindromme
si ce mot en est un (c'est à dire qu'il peut se lire à l'endroit ou à l'envers comme kayak)
# palindromme ?
mot = "ressasser"
# à compléter
Exercice 4 : une drôle de façon de calculer des racines carrées ?!¶
Avez-vous déjà remarqué que $\sqrt{64}=8=6+4-2$ ? Ça marche aussi avec $\sqrt{25}=5=2+5-2$ !
Pensez-vous que cette technique fonctionne pour tous les carrés parfaits compris entre 1 et 99 ?
Essayons de répondre informatiquement à cette question moyennant quelques rappels :
- Pour obtenir la racine carrée d'un nombre (square root en anglais):
from math import sqrt
print(sqrt(2)) # affiche racine carrée de 2
- pour déterminer les dizaines et les unités d'un nombre entier entre 0 et 99 :
n = 28 # un exemple
dizaines = n // 10 # division entière de n par 10
unites = n % 10 # reste de la division de n par 10
- pour tester si un nombre positif est entier on peut utiliser :
a == int(a) # vaut True si a est entier, False sinon
Q9. Écrire un script qui qui construit une liste carres
contenant tous les entiers compris entre 1 et 100 qui sont des carrés parfaits.
from math import sqrt
carres = [] # liste vide qui sera complétée grâce à une boucle
# à compléter
Q10. Écrire un script précédent dans la cellule suivante pour qu'il affiche les carrés parfaits qui vérifient la formule proposée
# carrés parfaits vérifiant la formule
# à compléter
Q11. Essayer alors de trouver des nombres entre 100 et 999 pour lesquels une technique analogue fonctionnerait pour calculer $\sqrt[3]{\overline{abc}}$ (Tester par exemple si $\sqrt[3]{\overline{abc}}=a+b+c-3\ ?$
Pour obtenir la racine cubique en python on peut faire puissance 1/3 : n**(1/3)