Recherche…


Introduction

En tant que l'une des fonctions les plus élémentaires de la programmation, les boucles constituent une partie importante de presque tous les langages de programmation. Les boucles permettent aux développeurs de définir certaines parties de leur code à répéter à travers un certain nombre de boucles appelées itérations. Cette rubrique traite de l'utilisation de plusieurs types de boucles et d'applications de boucles dans Python.

Syntaxe

  • while <expression booléenne>:
  • pour <variable> dans <iterable>:
  • pour <variable> dans la plage (<nombre>):
  • pour <variable> dans la plage (<numéro_premier>, <numéro_final>):
  • pour <variable> dans la plage (<numéro_premier>, <numéro_endmin>, <taille_touche>):
  • pour i, <variable> en enumerate (<iterable>): # avec index i
  • pour <variable1>, <variable2> dans zip (<iterable1>, <iterable2>):

Paramètres

Paramètre Détails
Expression booléenne expression qui peut être évaluée dans un contexte booléen, par exemple x < 10
variable nom de la variable pour l'élément actuel de l' iterable
itérable tout ce qui implémente les itérations

Itération sur les listes

Pour parcourir une liste, vous pouvez utiliser for :

for x in ['one', 'two', 'three', 'four']:
    print(x)

Cela imprimera les éléments de la liste:

one
two
three
four

La fonction range génère des nombres qui sont également souvent utilisés dans une boucle for.

for x in range(1, 6):
    print(x)

Le résultat sera un type de séquence de plage spécial dans python> = 3 et une liste dans python <= 2. Les deux peuvent être bouclés en utilisant la boucle for.

1
2
3
4
5

Si vous voulez effectuer une boucle à la fois sur les éléments d'une liste et avoir un index pour les éléments, vous pouvez utiliser la fonction d' enumerate de Python:

for index, item in enumerate(['one', 'two', 'three', 'four']):
    print(index, '::', item)

enumerate va générer des tuples, décompressés en index (entier) et en item (valeur réelle de la liste). La boucle ci-dessus s'imprimera

(0, '::', 'one')
(1, '::', 'two')
(2, '::', 'three')
(3, '::', 'four')

Itérer sur une liste avec manipulation de valeur en utilisant map et lambda , c'est-à-dire appliquer la fonction lambda sur chaque élément de la liste:

x = map(lambda e :  e.upper(), ['one', 'two', 'three', 'four'])
print(x)

Sortie:

['ONE', 'TWO', 'THREE', 'FOUR'] # Python 2.x

NB: dans Python 3.x, la map retourne un itérateur au lieu d'une liste, donc vous devez, si vous avez besoin d'une liste, lancer l' print(list(x)) du résultat print(list(x)) (voir http://www.riptutorial.com/python/ exemple / 8186 / map-- dans http://www.riptutorial.com/python/topic/809/incompatibilities-moving-from-python-2-to-python-3 ).

Pour les boucles

for boucles, parcourez une collection d'éléments, tels que list ou dict , et exécutez un bloc de code avec chaque élément de la collection.

for i in [0, 1, 2, 3, 4]:
    print(i)

Le ci-dessus for boucle itère sur une liste de nombres.

Chaque itération définit la valeur de i sur l'élément suivant de la liste. Donc, d'abord, il sera 0 , puis 1 , puis 2 , etc. La sortie sera la suivante:

0  
1
2
3
4

range est une fonction qui renvoie une série de nombres sous une forme itérable, ainsi elle peut être utilisée for boucles:

for i in range(5):
    print(i)

donne exactement le même résultat que le premier for boucle. Notez que 5 n'est pas imprimé car la plage représente les cinq premiers chiffres à partir de 0 .

Objets à parcourir et itérateurs

for loop peut itérer sur tout objet itérable qui est un objet qui définit une fonction __getitem__ ou __iter__ . La fonction __iter__ renvoie un itérateur, qui est un objet avec une fonction next utilisée pour accéder à l'élément suivant de l'itérable.

Pause et continuer dans les boucles

déclaration de break

Lorsqu'une instruction break s'exécute dans une boucle, le flux de contrôle "se casse" immédiatement de la boucle:

i = 0
while i < 7:
    print(i)
    if i == 4:
        print("Breaking from loop")
        break
    i += 1

La condition conditionnelle ne sera pas évaluée après l'exécution de l'instruction break . Notez que les instructions break ne sont autorisées qu'à l' intérieur des boucles , syntaxiquement. Une instruction break dans une fonction ne peut pas être utilisée pour mettre fin aux boucles appelées cette fonction.

L'exécution de la commande suivante imprime chaque chiffre jusqu'au numéro 4 lorsque l'instruction de break est remplie et que la boucle s'arrête:

0
1
2
3
4
Breaking from loop

break instructions break peuvent également être utilisées à l'intérieur for boucles, l'autre construction en boucle fournie par Python:

for i in (0, 1, 2, 3, 4):
    print(i)
    if i == 2:
        break

L'exécution de cette boucle imprime maintenant:

0
1
2

Notez que 3 et 4 ne sont pas imprimés depuis la fin de la boucle.

Si une boucle a une clause else , elle ne s'exécute pas lorsque la boucle est terminée par une instruction break .

continue déclaration

Une instruction continue passera à la prochaine itération de la boucle en contournant le reste du bloc en cours mais en continuant la boucle. Comme avec break , continue ne peut apparaître qu'à l'intérieur des boucles:

for i in (0, 1, 2, 3, 4, 5):
    if i == 2 or i == 4:
        continue
    print(i)

0
1
3
5

Notez que 2 et 4 ne sont pas imprimés, c'est parce que continue va à l'itération suivante au lieu de continuer à print(i) quand i == 2 ou i == 4 .

Boucles imbriquées

break and continue ne fonctionne que sur un seul niveau de boucle. L'exemple suivant ne sortir de l'intérieur for la boucle, et non l'extérieur while boucle:

while True:
    for i in range(1,5):
        if i == 2:
            break    # Will only break out of the inner loop!

Python n'a pas la capacité de sortir de plusieurs niveaux de boucle à la fois - si ce comportement est souhaité, le remaniement d'une ou de plusieurs boucles dans une fonction et le remplacement de la break avec le return peuvent être la solution.

Utiliser le return d'une fonction comme une break

L' instruction return quitte une fonction sans exécuter le code qui suit.

Si vous avez une boucle dans une fonction, utiliser return depuis l'intérieur de cette boucle équivaut à avoir une break car le reste du code de la boucle n'est pas exécuté ( notez que tout code après la boucle n'est pas exécuté non plus ):

def break_loop():
    for i in range(1, 5):
        if (i == 2):
            return(i)
        print(i)
    return(5)

Si vous avez des boucles imbriquées, l'instruction return interrompt toutes les boucles:

def break_all():
    for j in range(1, 5):
        for i in range(1,4):
            if i*j == 6:
                return(i)
            print(i*j)

va sortir:

1 # 1*1
2 # 1*2
3 # 1*3
4 # 1*4
2 # 2*1
4 # 2*2
# return because 2*3 = 6, the remaining iterations of both loops are not executed

Boucles avec une clause "else"

Les instructions composites for while ) peuvent avoir une clause else (en pratique, cette utilisation est assez rare).

L' else clause exécute seulement après une for la boucle se termine par itérer jusqu'à la fin, ou après un while boucle se termine par son expression conditionnelle devient fausse.

for i in range(3):
    print(i)
else:
    print('done')

i = 0
while i < 3:
    print(i)
    i += 1
else:
    print('done')

sortie:

 0
 1
 2
 done

La clause else ne s'exécute pas si la boucle se termine d'une autre manière (via une instruction break ou en levant une exception):

for i in range(2):
    print(i)
    if i == 1:
        break
else:
    print('done')

sortie:

0
1

La plupart des autres langages de programmation ne disposent pas de cette clause facultative else de boucles. L'utilisation du mot clé else en particulier est souvent considérée comme source de confusion.

Le concept original d'une telle clause remonte à Donald Knuth et la signification du mot clé else devient claire si nous réécrivons une boucle en termes d'instructions if et goto des jours précédents avant la programmation structurée ou à partir d'un langage d'assemblage de niveau inférieur.

Par exemple:

while loop_condition():
    ...
    if break_condition():
        break
    ...

est équivalent à:

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>

<<end>>:

Celles-ci restent équivalentes si nous attachons une clause else à chacune d’elles.

Par exemple:

while loop_condition():
    ...
    if break_condition():
        break
    ...
else:
    print('done')

est équivalent à:

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>
else:
    print('done')

<<end>>:

Une boucle for avec une clause else peut être comprise de la même façon. D'un point de vue conceptuel, il existe une condition de boucle qui reste vraie tant que l'objet ou la séquence itérable contient encore quelques éléments.

Pourquoi utiliserait cette construction étrange?

Le principal cas d'utilisation de la construction for...else est une implémentation concise de la recherche, par exemple:

a = [1, 2, 3, 4]
for i in a:
    if type(i) is not int:
        print(i)
        break
else:
    print("no exception") 

Pour rendre le else dans cette construction moins déroutant, on peut le considérer comme " sinon casser " ou " si non trouvé ".

Quelques discussions à ce sujet peuvent être trouvées dans [Python-ideas] Résumé de pour ... Threads , Pourquoi python utilise-t-il les boucles after pour et while? et autres clauses sur les instructions de boucle

Itération sur les dictionnaires

Considérant le dictionnaire suivant:

 d = {"a": 1, "b": 2, "c": 3}

Pour parcourir ses clés, vous pouvez utiliser:

for key in d:
    print(key)

Sortie:

"a"
"b"
"c"

Ceci est équivalent à:

for key in d.keys():
    print(key)

ou en Python 2:

for key in d.iterkeys():
    print(key)

Pour parcourir ses valeurs, utilisez:

for value in d.values():
    print(value)

Sortie:

1
2
3

Pour parcourir ses clés et ses valeurs, utilisez:

for key, value in d.items():
    print(key, "::", value)

Sortie:

a :: 1
b :: 2
c :: 3

Notez que dans Python 2, .keys() , .values() et .items() renvoient un objet list . Si vous devez simplement parcourir le résultat, vous pouvez utiliser les équivalents .iterkeys() , .itervalues() et .iteritems() .

La différence entre .keys() et .iterkeys() , .values() et .itervalues() , .items() et .iteritems() est que les méthodes iter* sont des générateurs. Ainsi, les éléments du dictionnaire sont fournis un par un au fur et à mesure de leur évaluation. Lorsqu'un objet list est renvoyé, tous les éléments sont regroupés dans une liste, puis renvoyés pour une évaluation ultérieure.

Notez également que dans Python 3, l'ordre des éléments imprimés de la manière ci-dessus ne suit aucun ordre.

En boucle

A while boucle ramènerai les instructions de boucle à exécuter jusqu'à ce que la condition de la boucle est Falsey . Le code suivant exécutera les instructions de boucle 4 fois au total.

i = 0 
while i < 4:
    #loop statements
    i = i + 1

Alors que la boucle ci-dessus peut facilement être convertie en une boucle for élégante, while boucles sont utiles pour vérifier si certaines conditions ont été remplies. La boucle suivante continuera à s'exécuter jusqu'à myObject que myObject soit prêt.

myObject = anObject()
while myObject.isNotReady():
    myObject.tryToGetReady()

while boucles while peuvent également s'exécuter sans condition en utilisant des nombres (complexes ou réels) ou True :

import cmath

complex_num = cmath.sqrt(-1)
while complex_num:      # You can also replace complex_num with any number, True or a value of any type
    print(complex_num)   # Prints 1j forever

Si la condition est toujours vraie, la boucle while sera exécutée pour toujours (boucle infinie) si elle n'est pas terminée par une instruction break ou return ou une exception.

while True:
    print "Infinite loop"
# Infinite loop
# Infinite loop
# Infinite loop
# ...

La déclaration de passage

pass est une instruction vide pour lorsqu'une instruction est requise par la syntaxe python (comme dans le corps d'un for ou while la boucle), mais aucune action est nécessaire ou souhaitée par le programmeur. Cela peut être utile comme espace réservé pour le code qui doit encore être écrit.

for x in range(10):
    pass #we don't want to do anything, or are not ready to do anything here, so we'll pass

Dans cet exemple, rien ne se passera. La boucle for se terminera sans erreur, mais aucune commande ou code ne sera activé. pass nous permet d'exécuter notre code avec succès sans que toutes les commandes et actions soient complètement implémentées.

De même, pass peut être utilisé dans les boucles while , ainsi que dans les sélections et les définitions de fonctions, etc.

while x == y:
    pass

Itérer différentes parties d'une liste avec différentes tailles de pas

Supposons que vous ayez une longue liste d'éléments et que vous ne soyez intéressé que par tous les autres éléments de la liste. Vous souhaitez peut-être examiner uniquement le premier ou le dernier élément, ou une plage spécifique d'entrées dans votre liste. Python possède de puissantes fonctionnalités intégrées d'indexation. Voici quelques exemples de réalisation de ces scénarios.

Voici une liste simple qui sera utilisée dans tous les exemples:

lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']

Itération sur toute la liste

Pour parcourir chaque élément de la liste, une boucle for comme ci-dessous peut être utilisée:

for s in lst:
    print s[:1] # print the first letter

La boucle for assigne des s à chaque élément de lst . Cela va imprimer:

a
b
c
d
e

Vous avez souvent besoin à la fois de l'élément et de l'index de cet élément. Le mot clé enumerate exécute cette tâche.

for idx, s in enumerate(lst):
    print("%s has an index of %d" % (s, idx))

L'index idx commencera par zéro et par incrément pour chaque itération, tandis que le s contiendra l'élément en cours de traitement. L'extrait de code précédent affichera:

alpha has an index of 0
bravo has an index of 1
charlie has an index of 2
delta has an index of 3
echo has an index of 4

Itérer sur la sous-liste

Si vous souhaitez effectuer une itération sur une plage (en vous rappelant que Python utilise l'indexation basée sur zéro), utilisez le mot clé range .

for i in range(2,4):
    print("lst at %d contains %s" % (i, lst[i]))

Cela produirait:

lst at 2 contains charlie
lst at 3 contains delta

La liste peut également être tranchée. La notation de tranche suivante va d'un élément à l'index 1 à la fin avec un pas de 2. Les deux for boucles donnent le même résultat.

for s in lst[1::2]:
    print(s)

for i in range(1, len(lst), 2):
    print(lst[i])

Les extraits de code ci-dessus:

bravo
delta

L'indexation et le découpage sont un sujet à part.

Le "demi-boucle" à faire

Contrairement à d'autres langages, Python n'a pas de construction à faire ou à faire (cela permettra l'exécution du code une fois avant le test de la condition). Cependant, vous pouvez combiner un while True avec un break pour atteindre le même objectif.

a = 10
while True:
    a = a-1
    print(a)
    if a<7:
        break
print('Done.')

Cela va imprimer:

9
8
7
6
Done.

En boucle et déballage

Si vous souhaitez parcourir une liste de tuples par exemple:

collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]

au lieu de faire quelque chose comme ça:

for item in collection:
    i1 = item[0]
    i2 = item[1]
    i3 = item[2]
    # logic

ou quelque chose comme ça:

for item in collection:
    i1, i2, i3 = item
    # logic

Vous pouvez simplement faire ceci:

for i1, i2, i3 in collection:
    # logic

Cela fonctionnera également pour la plupart des types d'itérables, pas seulement les tuples.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow