2016-07-14 6 views
0

Als Teil eines größeren menügesteuertes Programm erfüllt, würde Ich mag eine Benutzereingabe testen, ob dieser Eingang zu sehen: eine ganze Zahl ist UND wenn es eine ist Ganzzahl, wenn sie im Bereich von 1 bis 12 liegt, einschließlich.Benutzereingabe zu überprüfen, ob es zwei Bedingungen

number = 0  
while True: 
    try: 
      number = int(input("Enter a whole number between 1 and 12 >>> ")) 
    except ValueError: 
      print("Invlaid input, please try again >>> ") 
      continue 
    else: 
      if not (1<= number <=12): 
        print("Need a whole number in range 1-12 >>> ") 
        continue 
      else: 
        print("You selected:",number) 
        break 

Ich verwende Python 3.4.3, und wollte wissen, ob es eine knappere (weniger Linien, eine bessere Leistung, mehr „Pythonic“, zum Beispiel) Weg, dies zu erreichen? Danke im Voraus.

+0

Beachten Sie, dass 'int' gerne einen Dezimalwert abschneidet. Wenn Sie '3.6' eingeben, akzeptiert dieser Code sie (als' 3'). – smarx

+0

Wie ich glaube, 3.6 würde als "ungültige Eingabe ..." betrachtet werden. – marshki

+0

@smarx, 'int (" 3.6 ")' wäre ein ValueError, Sie müssten in float und dann in int umwandeln. –

Antwort

1

Sie brauchen nichts ein Bar wenn im try:

while True: 
    try: 
     number = int(input("Enter a whole number between 1 and 12 >>> ")) 
     if 1 <= number <= 12: 
      print("You selected:", number) 
      break 
     print("Need a whole number in range 1-12 >>> ") 
    except ValueError: 
      print("Invlaid input, please try again >>> ") 

Bad Eingang führt Sie direkt auf die mittlere gehen außer, wenn Die Eingabe ist gut und ist in Ihrem akzeptierten Bereich, der print("You selected:", number) und wird ausgeführt, dann brechen wir oder sonst print("Need a whole number in range 1-12 >>> ") wird ausgeführt, wenn außerhalb des Bereichs ist.

+0

Dieser Code ist in Ordnung, aber ich denke, es ist generell besser, einen Versuch zu versuchen/außer so viel wie möglich. Ich mag den Originalcode aus diesem Grund besser. – smarx

+0

@smarx, es ist eine Frage, wenn Geschmack, finde ich verschachtelten Code mit vielen anderen Blöcken ziemlich hässlich und schwerer zu lesen. –

+0

Ich habe nicht genug Privileg, dies noch zu verbessern, aber danke für die Antwort. – marshki

-1

Ich glaube nicht, dass Sie einen ganzen try/except Block benötigen. Alles kann passen in einen einzigen Zustand sein:

number = raw_input("Enter a whole number between 1 and 12 >>> ") 
while not (number.isdigit() and type(eval(number)) == int and 1<= eval(number) <=12): 
    number = raw_input("Enter a whole number between 1 and 12 >>> ") 
print("You selected:",number) 
0

Ihr Code sieht sehr gut zu mir. Minor fix-ups (Rechtschreibung, Einzüge, unnötige continue e):

while True: 
    try: 
     number = int(input("Enter a whole number between 1 and 12 >>> ")) 
    except ValueError: 
     print("Invalid input, please try again >>> ") 
    else: 
     if 1 <= number <= 12: 
      print("You selected: {}".format(number)) 
      break 
     else: 
      print("Need a whole number in range 1-12 >>> ") 
0

Verwendung isdigit() für nicht-stellige Zeichen zu überprüfen. Dann sollten Sie die Ausnahme nicht abfangen müssen. Es gibt nur einen if und es wird ein Operator-Kurzschluss verwendet, um zu vermeiden, dass int (blah) ausgeführt wird, wenn Blah keine Ziffern enthält.

while True: 
    num_str = raw_input("Enter a whole number between 1 and 12 >>> ") 
    if num_str.isdigit() and int(num_str) in range(1,13): 
     print("You selected:",int(num_str)) 
     break 
    else: 
     print("Need a whole number in range 1-12 >>> ")