Exemple d'utilisation de l'instruction «continue» en Python?

177

La définition de la continuedéclaration est:

L' continueinstruction continue avec l'itération suivante de la boucle.

Je ne trouve pas de bons exemples de code.

Quelqu'un pourrait-il suggérer des cas simples où cela continueest nécessaire?

JohnG
la source

Réponses:

218

Voici un exemple simple:

for letter in 'Django':    
    if letter == 'D':
        continue
    print("Current Letter: " + letter)

La sortie sera:

Current Letter: j
Current Letter: a
Current Letter: n
Current Letter: g
Current Letter: o

Il continue à l'itération suivante de la boucle.

Snehal Parmar
la source
1
Cela fait trois ou quatre jours que je réfléchis, pourquoi aurais-je besoin d'une déclaration «continue», puis je suis tombé sur ce post qui à son tour m'aide avec un certain contrôle qualité - merci beaucoup!
Freddy
3
même ici, lorsque nous écrivons un script python (pour le travail cron) et que nous itérons sur de grandes valeurs et qu'une exception se produit, le travail cron sera arrêté et vous ne pourrez savoir que le lendemain, cela aide vraiment beaucoup dans ce cas, Oui nous pouvons écrire la fonction d'envoi de courrier sur exception mais l'exécution sera quand même arrêtée.
Snehal Parmar
2
Cela illustre ce qui continuefait mais ce n'est pas trop utile, quand vous pourriez le faireif letter != 'D': print 'Current Letter:', letter
Chris_Rands
J'aurais choisi Pray / remove r, ou Fast / remove s.
Benjamin Crouzier
102

J'aime utiliser continuer dans des boucles où il y a beaucoup de choses à remplir avant de passer aux choses sérieuses. Donc, au lieu d'un code comme celui-ci:

for x, y in zip(a, b):
    if x > y:
        z = calculate_z(x, y)
        if y - z < x:
            y = min(y, z)
            if x ** 2 - y ** 2 > 0:
                lots()
                of()
                code()
                here()

Je reçois un code comme celui-ci:

for x, y in zip(a, b):
    if x <= y:
        continue
    z = calculate_z(x, y)
    if y - z >= x:
        continue
    y = min(y, z)
    if x ** 2 - y ** 2 <= 0:
        continue
    lots()
    of()
    code()
    here()

En faisant cela, j'évite le code très profondément imbriqué. En outre, il est facile d'optimiser la boucle en éliminant d'abord les cas les plus fréquents, de sorte que je n'ai à traiter que les cas rares mais importants (par exemple, le diviseur est 0) lorsqu'il n'y a pas d'autre showstopper.

Lauritz V. Thaulow
la source
2
Ainsi, "continuer" est principalement utilisé pour la lisibilité en réduisant l'indentation. Je me demande si "continuer" ajoute un pouvoir expressif.
JohnG
14
L'utilisation continuede cette manière est similaire à l'utilisation GOTO. Cependant, c'est la bonne façon d'utiliser GOTO.
dotancohen
1
@JohnG Je ne crois pas qu'il y ait une utilisation de continue (ou break, d'ailleurs) qui ne puisse pas être reproduite sans elle, bien que ne pas l'avoir peut coûter cher en temps d'exécution.
Sparr
18

Habituellement, la situation où continuer est nécessaire / utile est lorsque vous souhaitez ignorer le code restant dans la boucle et continuer l'itération.

Je ne pense pas vraiment que ce soit nécessaire, car vous pouvez toujours utiliser des instructions if pour fournir la même logique, mais cela peut être utile pour augmenter la lisibilité du code.

pcalcao
la source
23
notez que l'utilisation if <condition>: continueplutôt que d' if not <condition>: ...éviter un niveau d'indentation qui serait autrement nécessaire s'il était écrit sans lui.
Dan D.
1
J'étais sur le point de poster un qn similaire à JohnG mais j'ai découvert qu'il avait déjà demandé ce que je voulais savoir. La lecture de toutes les réponses ici a aidé, mais je dois toujours être sûr d'une chose - de même que chaque fois que nous utilisons une continueinstruction, nous sautons essentiellement d'une section de test conditionnel et permettons à l'itération de la boucle de continuer à la prochaine itération? Je ne vois pas comment cela serait mieux que d'utiliser else. S'agit-il simplement d'une amélioration de la lisibilité et des performances d'exécution?
AKKO
"Je ne crois pas que ce soit nécessaire" ... eh bien, les créateurs de python pensaient autrement.
Jean-François Fabre
12
import random  

for i in range(20):  
    x = random.randint(-5,5)  
    if x == 0: continue  
    print 1/x  

continue est une déclaration de contrôle extrêmement importante. Le code ci-dessus indique une application typique, où le résultat d'une division par zéro peut être évité. Je l'utilise souvent lorsque j'ai besoin de stocker la sortie de programmes, mais je ne veux pas stocker la sortie si le programme est tombé en panne. Notez que pour tester l'exemple ci-dessus, remplacez la dernière instruction par print 1 / float (x), ou vous obtiendrez des zéros chaque fois qu'il y a une fraction, car randint renvoie un entier. Je l'ai omis pour plus de clarté.

utilisateur1871712
la source
10

Certaines personnes ont fait des commentaires sur la lisibilité, en disant: "Oh, cela n'aide pas beaucoup la lisibilité, qui s'en soucie?"

Supposons que vous ayez besoin d'une vérification avant le code principal:

if precondition_fails(message): continue

''' main code here '''

Notez que vous pouvez le faire après que le code principal a été écrit sans changer ce code de toute façon. Si vous différez le code, seule la ligne ajoutée avec «continuer» sera mise en surbrillance car il n'y a pas de modifications d'espacement dans le code principal.

Imaginez que vous deviez faire un breakix de code de production, qui se révèle être simplement en ajoutant une ligne avec continue. Il est facile de voir que c'est le seul changement lorsque vous examinez le code. Si vous commencez à envelopper le code principal dans if / else, diff mettra en évidence le code nouvellement mis en retrait, à moins que vous n'ignoriez les changements d'espacement, ce qui est particulièrement dangereux en Python. Je pense qu'à moins que vous n'ayez été dans une situation où vous devez déployer du code à court préavis, vous ne l'apprécierez peut-être pas pleinement.

CS
la source
5
def filter_out_colors(elements):
  colors = ['red', 'green']
  result = []
  for element in elements:
    if element in colors:
       continue # skip the element
    # You can do whatever here
    result.append(element)
  return result

  >>> filter_out_colors(['lemon', 'orange', 'red', 'pear'])
  ['lemon', 'orange', 'pear']
ILYA Khlopotov
la source
4
Mais qu'est-ce que la continuedéclaration ajoute ici? Il pourrait être éliminé en utilisant element not in colors, et le code serait tout aussi lisible.
ekhumoro
4

Disons que nous voulons imprimer tous les nombres qui ne sont pas des multiples de 3 et 5

for x in range(0, 101):
    if x % 3 ==0 or x % 5 == 0:
        continue
        #no more code is executed, we go to the next number 
    print x
ytpillai
la source
Vous pouvez aussi utiliser if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Wildcard
La bonne façon est d'utiliser l'opérateur continue ou non. Pourquoi utiliser inutilement le pass?
ytpillai
J'aime mieux votre chemin (d'où le vote positif). Je suis venu sur cette page en essayant de trier s'il y avait un besoin d'utiliser continue. Ma conclusion est qu'il n'y a jamais besoin , mais dans certains cas (comme celui-ci), le code est plus lisible en utilisant continue. C'est un très bon exemple.
Wildcard
3

Ce n'est pas absolument nécessaire car cela peut être fait avec des IF mais c'est plus lisible et aussi moins coûteux en temps d'exécution.

Je l'utilise afin de sauter une itération dans une boucle si les données ne répondent pas à certaines exigences:

# List of times at which git commits were done.
# Formatted in hour, minutes in tuples.
# Note the last one has some fantasy.
commit_times = [(8,20), (9,30), (11, 45), (15, 50), (17, 45), (27, 132)]

for time in commit_times:
    hour = time[0]
    minutes = time[1]

    # If the hour is not between 0 and 24
    # and the minutes not between 0 and 59 then we know something is wrong.
    # Then we don't want to use this value,
    # we skip directly to the next iteration in the loop.
    if not (0 <= hour <= 24 and 0 <= minutes <= 59):
        continue

    # From here you know the time format in the tuples is reliable.
    # Apply some logic based on time.
    print("Someone commited at {h}:{m}".format(h=hour, m=minutes))

Production:

Someone commited at 8:20
Someone commited at 9:30
Someone commited at 11:45
Someone commited at 15:50
Someone commited at 17:45

Comme vous pouvez le voir, la mauvaise valeur ne l'a pas fait après l' continueinstruction.

Bastian
la source
ifne peut faire ce continueque si tout le code est contenu dans un bloc. continueignore le code qui est même en dehors du ifbloc.
bryc
Pourquoi l' heure 24 est-elle incluse mais la minute est-elle exclusive 60?
Patrick Artner
aucune raison particulière, juste un exemple, n'hésitez pas à modifier
Bastian
1

Par exemple, si vous souhaitez faire différentes choses en fonction de la valeur d'une variable:

my_var = 1
for items in range(0,100):
    if my_var < 10:
        continue
    elif my_var == 10:
        print("hit")
    elif my_var > 10:
        print("passed")
    my_var = my_var + 1

Dans l'exemple ci-dessus, si j'utilise breakl'interpréteur sautera la boucle. Mais avec continueelle ignore uniquement les instructions if-elif et passe directement à l'élément suivant de la boucle.

jonathan.hepp
la source
3
votre exemple n'imprimera jamais rien, car la première condition est toujours vraie. en supposant une valeur initiale pour my_varde 0.
Dan D.
J'ai simplement adapté un exemple de mon ancien code. La valeur d'origine de la var n'est pas 0 et la partie croissante a été ajoutée pour plus de commodité car sa place d'origine n'était pas là. Puisqu'il s'agit d'un exemple et que sa valeur n'a pas vraiment d'importance, je suppose que ça va.
jonathan.hepp
9
Ce n'est pas ok. Ce n'est pas une bonne publicité à utiliser continue.
John Machin
3
Et le premier elifdevrait être un fichier if. Le code ne donne simplement pas l'impression que vous savez ce que vous faites.
John Machin
c'est un mauvais exemple
patrick
0

continue saute simplement le reste du code dans la boucle jusqu'à la prochaine itération

Yanfeng Liu
la source