Programmer en Python en 2nde

Répétitions avec une boucle for

Le langage Scratch a permis aux élèves de rencontrer leur première structure de boucle itérative sous la forme d'une répétition d'instructions. Cette répétition est généralement traduite par un algorithme de la forme :


Pour i allant de 1 à 10:
    instruction1
    instruction2
    instruction3
	

Un équivalent en Python de cette instruction Scratch :


for _ in range(10) : 
    instruction1
    instruction2
    instruction3
bloc_scratch_for

Parcours de séquences

boucle for et type string

En Python, la boucle for permet de parcourir un à un les éléments d'une chaîne de caractères (séquence de symboles délimitée par des guillemets " ou des apostrophes '). Testez l'exemple ci-dessous :


		
		

for et liste

En Python, la boucle for permet de parcourir un à un les éléments d'une liste (séquence de valeurs de divers types séparées par des virgules et délimitées par des crochets) :


		
		

Des informations complémentaires sur les listes seront données dans la page [Les listes] → [Définition].

for et tuple

En Python, la boucle for permet de parcourir un à un les éléments d'un tuple (séquence de valeurs de divers types séparées par des virgules et délimitées par des parenthèses) :


		
		

La différence entre liste et tuple est aussi abordée dans la page [Les listes] → [Définition].

Usage usuel du for

Pour retrouver l'usage habituel d'une boucle for, on parcourt de même les entiers générés à l'aide de la fonction range().

Lorsqu'on affiche l'aide sur range() :


help(range)
	

voici ce qu'on obtient :

 
class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return an object that produces a sequence of integers from start (inclusive)
 |  to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
 |  start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
 |  These are exactly the valid indices for a list of 4 elements.
 |  When step is given, it specifies the increment (or decrement).

Pour bien comprendre ce que cela signifie et les entiers générés par la fonction range(), exécutez le programme ci-dessous :


		
		
  • range(a, b, pas) génère les entiers a, a+pas, a+2*pas, ... en s'arrêtant sur la plus grande valeur de la forme a+k*pas qui soit strictement inférieure à b.
  • range(a, b) est équivalent à range(a, b, 1) et génère les entiers a, a+1, a+2, ..., b-1.
  • range(b) est équivalent à range(0, b, 1) et génère les entiers 0, 1, 2, ..., b-1.

Conséquence

On peut alors facilement élaborer un exemple de boucle usuelle :


		
		
  • Pour aller plus loin Plus tard !

On montre ici une petite différence entre deux langages sur un script "pathologique" mais inspiré d'une réponse d'élève à un contrôle. Cet élève avait a priori "confondu" une boucle while et une boucle for dans un exercice demandant de calculer une somme : cela l'avait amené à incrémenter la variable de sa boucle for dans le corps de la boucle.

Cette différence montre, s'il en est besoin, qu'il faut être rigoureux dans la définition d'un pseudo-langage de présentation des algorithmes (et surtout, ici, qu'il faut éviter les codes "pathologiques", nécessairement ambigus).

  1. Devinez quel sera le résultat de l'exécution du code ci-dessous :
    
    				
    				
  2. Et maintenant, un code qui pourrait sembler a priori équivalent en Javascript :

On voit donc qu'une simple boucle for est traitée différemment suivant les langages.

  1. En Python, l'indice k de la boucle parcourt la « liste » 1, 2, 3, ..., 29. Pour chaque valeur, k est incrémenté dans la première instruction du corps de la boucle :
    • k prend la première valeur de la liste 1, 2, 3, ..., 29, c'est à dire 1
      puis k prend la valeur 4 avec l'instruction k += 3 du corps de la boucle et est enfin affiché.
    • A l'itération suivante : k prend la valeur suivante dans la liste 1, 2, 3, ..., 29, c'est à dire la valeur 2
      puis k devient 5 avec l'instruction k += 3 du corps de la boucle et est affiché.
    • etc...
    
    		
    		

    On peut mieux saisir le principe avec l'exemple suivant :

    
    		
    		

    On voit avec cet exemple que l'indice k de la boucle n'est pas a priori incrémenté à chaque tour de boucle : il prend successivement les différentes valeurs de la liste.

  2. Par contre la boucle for(let k = 1; k < 30; k++) instruction; du langage Javascript (il en serait de même en langage C par exemple) est équivalente à :
    Si bien que notre boucle
    se comporte comme :
    En Javascript, cela donne :
  3. Un code Javascript plus proche du code Python :

    ou plus proche encore :