1
votes

Ignorer un morceau de code si une condition est vraie en Python

J'écris un workflow qui contient de nombreuses étapes, disons 100. Après chaque étape, je veux vérifier si une condition est True, si True, puis sauter toutes les étapes à gauche et passer au "niveau suivant". s'il va jusqu'à l'étape 100, alors passez également au "niveau suivant".

Je peux penser à utiliser une boucle for avec 1 itération

for i in range(1):
    step1()
    if condition:
        break

    step2()
    if condition:
        break
    ...
    step100()

next level()

Cela semble bien, mais y a-t-il un meilleur moyen sans la boucle et de passer directement au next level ? Ce sera utile s'il y a à nouveau ce type de structures dans ces étapes, et je ne veux pas casser de nombreuses couches de boucles pour passer au next level


3 commentaires

Extrayez une fonction contenant le corps de cette boucle. return tôt si les conditions correctes ne sont pas remplies.


Vous pouvez utiliser des functions !


Une idée pour réduire le code standard: mettez toutes les fonctions dans une liste, puis dans une boucle ( while not condition: :), faites sortir une fonction de la liste et appliquez-la. Lorsque la condition est remplie, la condition while échouera et se terminera pour vous.


4 Réponses :


-1
votes

Une fonction peut accomplir cela:

def workflow():
    step1()
    if condition:
        return

    step2()
    if condition:
        return
    ...
    step100()

workflow()
next_level()


1 commentaires

Je ne pense pas que ce soit ce que recherche OP. Cela change simplement le mot-clé de "pause" à "retour".



7
votes

Si vous avez vraiment 100 étapes, cela deviendrait un très long code illisible.

Une autre option consiste à regrouper les étapes / conditions dans des listes:

steps = [step2, ... , step100]

step1()
while not condition and steps:
    steps.pop(0)()

next_level()

Bien sûr, si vous n'avez qu'une seule condition globale comme dans votre exemple, la liste des conditions n'est pas nécessaire et vous pouvez simplement boucler les steps . Le code peut également être encore réduit dans ce cas à:

steps = [step1, step2, ... , step100]
conditions = [condition1, condtition2, ...]

for step, condition in zip(steps, conditions):
    step()
    if condition:
        break
next_level()


0 commentaires

-1
votes

... y a-t-il une meilleure façon ...

Non, pas vraiment. Les alternatives ne peuvent pas être évaluées à moins que vous ne puissiez définir ce qui est subobtimal.

steps = [step1, step2, ..., step100]
for step in steps:
    step()
    if condition:
        break
next_level()

0 commentaires

0
votes

Je suggère une idée basée sur l'opérateur OR (instructions exécutées jusqu'à ce que la première soit True). Voici un exemple:

import random

def step1(val):
    print('step1...')
    return val%3
def step2(val):
    print('step2...')
    return val%3
def step3(val):
    print('step3...')
    return val%3
def step4(val):
    print('step4...')
    return val%3
def step5(val):
    print('step5...')
    return val%3
def step6(val):
    print('step6...')
    return val%3
def step7(val):
    print('step7...')
    return val%3
def step8(val):
    print('step8...')
    return val%3
def step19(val):
    print('step9...')
    return val%3
def step10(val):
    print('step10...')
    return val%3
def next_level():
    print('next_level...')
    return

def ok(func):
    result = func(random.randint(1, 30))
    if result == 0:
        return True
    else:
        return False

if ok(step1) or ok(step2) or ok(step3) or ok(step4) or ok(step5)\
    or ok(step6) or ok(step7) or ok(step8) or ok(step9) or ok(step10)\
    or True:

    next_level()


0 commentaires