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
4 Réponses :
Une fonction peut accomplir cela:
def workflow():
step1()
if condition:
return
step2()
if condition:
return
...
step100()
workflow()
next_level()
Je ne pense pas que ce soit ce que recherche OP. Cela change simplement le mot-clé de "pause" à "retour".
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()
... 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()
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()
Extrayez une fonction contenant le corps de cette boucle.
returntô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.