2017-07-09 3 views
1

Ich habe dieses Stück Code (für die Praxis):Python: Wie wiederhole ich eine Iteration einer for-Schleife?

def choose_dice(): 
    while True: 
     try: 
      dice_quantity = int(input("How many dice would you like to use? ")) 
      dice_sides = [] 
      for current_dice in range(1, dice_quantity + 1): 
       sides = int(input("How many sides on {} dice? ".format(str(current_dice) + ordinal(current_dice)))) 
       dice_sides.append([str(current_dice) + ordinal(current_dice) + " dice", sides]) 
#    print(dice_sides) 
      return dice_sides 
     except (TypeError, ValueError) as _: 
      print("Oops, it seems you have entered a non integer ") 

, die den Benutzer für eine Reihe aufgefordert und dann für x in Bereich (1, Nummer) fordert den Benutzer auf eine Nummer zu wählen.

Wenn der Benutzer während der for-Schleife einen ganzzahligen Wert oder gar nichts eingibt, möchte ich zur aktuellen Iteration der for-Schleife zurückkehren, anstatt von vorn zu beginnen.

Wie kann ich das elegant erreichen?

dh das aktuelle Verhalten ist als solche:

„Wie viele Würfel würden Sie verwenden 3

Wie viele Seiten auf 1. Würfel 6

Wie viele Seiten im 2. Würfel?? 0

Wie viele Seiten am 3. Würfel?

Hoppla, es scheint, dass Sie eine nicht ganze Zahl

eingegeben haben

Wie viele Würfel würdest du gerne benutzen? "

Wenn ein Benutzer nichts eingibt, wird er in der Ausnahme gefangen und der gesamte Prozess beginnt von neuem. Ich möchte, dass er die aktuelle" Wie viele Seiten auf n-ten Würfeln? "Wiederholt, anstatt die Schleife zu starten Kratzer von

+0

Wenn ein Benutzer 0 eingibt, welches Verhalten möchten Sie durchführen? Kannst du das bitte klären? – apadana

+0

dh das aktuelle Verhalten ist als solche: „Wie viele Würfel würden Sie verwenden 3 Wie viele Seiten auf 1. Würfel 6 Wie viele Seiten im 2. Würfel 0 Wie viele Seiten am 3. Würfel ??? Ups, es scheint, Sie haben eine nicht ganzzahlige eingegeben Wie viele Würfel möchten Sie verwenden?" (Ich bearbeite meinen Beitrag, da ich das erforderliche Verhalten für Benutzer habe, die 0 eingeben) Wenn ein Benutzer nichts eingibt, wird er in der Ausnahme gefangen und der gesamte Prozess beginnt von neuem. Ich möchte, dass er es erneut versucht aktuelle "Wie viele Seiten auf n-ten Würfeln?" anstatt die Schleife von Grund auf neu zu starten Danke für Ihre Hilfe – Lijok

Antwort

0

try this:

def choose_dice(): 
    while True: 
     try: 
      dice_quantity = int(input("How many dice would you like to use? ")) 
     except (TypeError, ValueError) as _: 
      print("Oops, it seems you have entered a non integer ") 

     dice_sides = [] 
     current_dice = 1 
     while current_dice != dice_quantity + 1: 
      try: 
       sides = int(input("How many sides on {} dice? ".format(str(current_dice) + ordinal(current_dice)))) 
       dice_sides.append([str(current_dice) + ordinal(current_dice) + " dice", sides]) 
       current_dice += 1 
      except (TypeError, ValueError, NameError) as _: 
       print("Oops, it seems you have entered a non integer ") 
     print(dice_sides) 
     return dice_sides 
0

ersetzen Sie diese Zeile:

sides = int(input("How many sides on {} dice? ".format(str(current_dice) + ordinal(current_dice)))) 

mit dieser Funktion:

getSidesOnDice() 

und hier ist die Defintion von getSidesOnDice:

def getSidesOnDice(current_dice): 
    while True: 
     try: 
      sides = int(input("How many sides on {} dice? ".format(str(current_dice) + ordinal(current_dice)))) 
      break 
     except (TypeError, ValueError) as _: 
      print("Oops, it seems you have entered a non integer ") 
    return sides 

def choose_dice(): 
    while True: 
     try: 
      dice_quantity = int(input("How many dice would you like to use? ")) 
      dice_sides = [] 
      for current_dice in range(1, dice_quantity + 1): 
       sides = getSidesOnDice(current_dice) 
       dice_sides.append([str(current_dice) + ordinal(current_dice) + " dice", sides]) 
      print(dice_sides) 
      return dice_sides 
     except (TypeError, ValueError) as _: 
      print("Oops, it seems you have entered a non integer ") 

Sie Inline kann auch die Funktion in Ihrem Code:

def getSidesOnDice(): 
    while True: 
     try: 
      sides = int(input("How many sides on {} dice? ".format(str(current_dice) + ordinal(current_dice)))) 
      break 
     except (TypeError, ValueError) as _: 
      print("Oops, it seems you have entered a non integer ") 
    return sides 

so der Code wie folgt aussehen würde. Die einfache Erklärung ist, dass Sie nicht möchten, dass die Zeile, die die Seiten für das current_dice erhält, weiter geht, wenn sie keinen gültigen Wert erhalten hat. Der einfachste Weg besteht also darin, sie durch eine Funktion zu ersetzen und dann an der Funktion zu arbeiten, damit sie das tut, was Sie erwarten. Wenn Sie dann das Gefühl haben, dass die Funktion im Hauptcode inline sein soll, legen Sie sie dort hin und entfernen Sie die Funktion. Selbst wenn Sie an eine Funktion denken, werden die Aufgaben in kleinere Teile zerlegt, die einfacher zu erreichen sind.