Boucle

Une boucle permet de répéter un bloc d’instructions un certain nombre de fois.

loop

La boucle for

La boucle for est une répétition pour chaque élément d’un ensemble.

for x in sequence:
    bloc

Formellement nous avons

  • le mot-clé for

  • une variable x

  • le mot-clé in

  • une séquence (liste, chaîne, plage)

  • le deux-points :

  • un bloc d’instructions indenté.

Par exemple

liste = ['Ada', 'Grace', 'Anita']

for x in liste:
    print(x)
Ada
Grace
Anita

On appelle les répétions du bloc aussi des itérations. On dit itérer sur la séquence.

On appelle la variable x un itérateur. Cette variable peut avoir n’importe quel nom. Cette variable prend successivement toutes les valeurs de la séquence, une après l’autre.

Le bloc répété

Le bloc répété consiste en une ou plusieurs (1+) instructions. Toutes les instructions qui font partie du bloc sont indentées. La première instruction qui n’est plus indentée ne fait plus partie du bloc.

Ici instruction 1 fait partie du bloc d’itération.
Donc, cette instruction est exécutée 3 fois.

for i in range(3):
    print('i =', i)
    print('instruction 1')
    
print('instruction 2')
i = 0
instruction 1
i = 1
instruction 1
i = 2
instruction 1
instruction 2

Maintenant, instruction 1 ne fait plus partie du bloc d’itération.
Cette instruction est exécutée seulement une fois.

for i in range(3):
    print('i =', i)

print('instruction 1')
print('instruction 2')
i = 0
i = 1
i = 2
instruction 1
instruction 2

Itérer sur une liste

Voici une itération sur une liste de textes.

fruits = ['pomme', 'poire', 'orange']

for fruit in fruits:
    print('***', fruit)
*** pomme
*** poire
*** orange

Voici une itération sur une liste de nombres.

premiers = [2, 3, 5, 7]

for i in premiers:
    print('i =', i, '  i**2 =', i**2)
i = 2   i**2 = 4
i = 3   i**2 = 9
i = 5   i**2 = 25
i = 7   i**2 = 49
adjectives = ['belle', 'riche', 'intelligente']

for x in adjectives:
    print('elle est', x)
elle est belle
elle est riche
elle est intelligente

Nous pouvons aussi concaténer les textes et la variable avec l’opérateur +.
Attention aux espaces!

for x in adjectives:
    print('elle est ' + x + ', bien plus ' + x + ' que lui.')
elle est belle, bien plus belle que lui.
elle est riche, bien plus riche que lui.
elle est intelligente, bien plus intelligente que lui.

Itérer sur une chaine

La boucle for peut itérer sur une chaine.
L’itérateur prend alors chaque valeur de la séquence.

for c in 'Python':
    print('lettre -', c)
lettre - P
lettre - y
lettre - t
lettre - h
lettre - o
lettre - n

Itérer sur une plage

Nous pouvons itérer sur une plage d’entiers

for i in range(1, 7):
    print(i, '* 2 =', i*2)
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12

Nous pouvons utiliser l’itérateur multiple fois dans le bloc d’itération.

for i in range(10, 15):
    print(i, '*', i, '=', i*i)
10 * 10 = 100
11 * 11 = 121
12 * 12 = 144
13 * 13 = 169
14 * 14 = 196

Boucles imbriquées

Une boucle peut être placée dans le corps d’une autre boucle.
Nous appelons

  • la boucle en i boucle extérieure, et

  • la boucle en j boucle intérieure.

for i in range(3):
    for j in range(2):
        print('i =', i, ' j =', j)
i = 0  j = 0
i = 0  j = 1
i = 1  j = 0
i = 1  j = 1
i = 2  j = 0
i = 2  j = 1

Normalement chaque instruction print se termine avec un retour à la ligne. L’argument optionnel end permet de le changer en 3 espaces '   '.

for i in range(3):
    for j in range(5):
        print('(', i, j, ')', end='   ')
    print()
( 0 0 )   ( 0 1 )   ( 0 2 )   ( 0 3 )   ( 0 4 )   
( 1 0 )   ( 1 1 )   ( 1 2 )   ( 1 3 )   ( 1 4 )   
( 2 0 )   ( 2 1 )   ( 2 2 )   ( 2 3 )   ( 2 4 )   

Les boucles imbriquées nous permettent par exemple de programmer une table de multiplication. Cette fois nous utilisons le caractère spécial tabulateur \t qui aligne les caractères sur des multiples de 8.

for i in range(1, 5):
    for j in range(1, 10):
        print(i * j, end='\t')
    print()
1	2	3	4	5	6	7	8	9	
2	4	6	8	10	12	14	16	18	
3	6	9	12	15	18	21	24	27	
4	8	12	16	20	24	28	32	36	

REPL

La boucle d’execution d’une console Python s’appelle aussi REPL:

  • Read

  • Evaluate

  • Print

  • Loop

Depuis JupyterLab choisir File > New > Terminal.
Ensuite démarrer une session interactive de Python avec la commande python3.

bash-3.2$ python3
Python 3.7.9 (v3.7.9:13c94747c7, Aug 15 2020, 01:31:08) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Nous pouvons simuler ceci

Boucle d’évaluation

Nous pouvons simuler la boucle d’évaluation simplifié avec

  • une boucle while

  • la fonction input pour saisir une expression

  • la fonction eval pour évaluer l’expression

  • la fonction print pour afficher le résultat

La fonction eval permet d’évaluer une chaine qui represente une expression Python valide.

eval('12 ** 2')
144
eval('1')
1
exp = input('>>>')

while exp:
    res = eval(exp)
    print(res)
    exp = input('>>>')
>>> 1 + 2
3
>>> 12 * 23
276
>>> 23 **4
279841
>>> 123 // 23
5
>>> 
exec('a = 123')
a
123

Evaluer une expression

L’évaluation d’une affectation donne une erreur.

eval('a = 123')
File "<string>", line 1
a = 123
  ^
SyntaxError: invalid syntax

Nous devons utiliser la fonction exec

exec('a = 1.23')
a
1.23
a
123

Si l’expression contient le symbol =

  • nous exécutions l’expression, sinon

  • nous évaluons l’expression et affichons le résultat.

exp = input('>>>')

while exp:
    if '=' in exp:
        exec(exp)
    else:
        print(eval(exp))
    exp = input('>>>')
>>> 123 ** 23
1169008215014432917465348578887506800769541157267
>>> a = 12
>>> a ** 2
144
>>> a += 1
>>> a
13
>>> 

Terminer avec quit()

La vrai console Python quitte avec la commande quit().

La fonction print retourne la valeur None. Dans ce cas nous ne voulons pas afficher le résultat.

exp = input('>>>')

while exp != 'quit()':
    if '=' in exp:
        exec(exp)
    else:
        res = eval(exp)
        if res:
            print(res)

    exp = input('>>>')
>>> print('hello')
hello
>>> a = 12
>>> print(a ** 2)
144
>>> quit
<IPython.core.autocall.ZMQExitAutocall object at 0x102d6e090>
>>> quit()

Quiz

Dans le quiz suivant il faut compter, ou plutôt avoir l’oeil pour la quantitié d’émojis. Quand vous deveinez correctement, votre score incrémente.

import random

score = 0
while True:
    n = random.randint(1, 9) 
    x = input(str(score) + '\t' + '❤️' * n)
    if x == '':
        break
    elif int(x) == n:
        score += 1     
        
print('total score:', score)
0	❤️❤️❤️❤️❤️❤️❤️ 6
0	❤️❤️❤️❤️❤️❤️❤️ 7
1	❤️❤️❤️❤️❤️ 5
2	❤️❤️❤️❤️❤️ 5
3	❤️❤️❤️ 3
4	❤️❤️❤️❤️ 4
5	❤️❤️❤️❤️❤️❤️❤️❤️ 8
6	❤️❤️❤️ 3
7	❤️❤️❤️❤️❤️❤️ 7
7	❤️❤️❤️ 3
8	❤️❤️❤️❤️❤️❤️ 
total score: 8