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.
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.