2012-04-01 8 views
-1

Ich kann nicht in der Lage sein, dies zu tun. Ich habe ein großes Programm, das etwas modifiziert werden muss.Überprüfen von Benutzeroptionen - Python

Alles, was ich tun muss, ist sicherzustellen, dass der Benutzer nicht fortfahren kann, bis eine gültige Option eingegeben wurde. Alles andere als "1", "2", "3" und "4" ist ungültig.

def GetResponse(): 
    global Response 
    Response = (input("Enter Option number: ")) 

Wenn dies der Code ist, fährt das Menü angezeigt wird, wenn irgendetwas eingegeben wird. Es passiert nichts, außer dass das Menü immer wieder auftaucht. (String oder beliebige Zahlen), aber wenn ich etwas ändern und die Antwort integer machen nur:

def GetResponse(): 
    global Response 
    Response = (int(input("Enter Option number: "))) 

hier dann, wenn eine gültige Option eingegeben gelangen Sie zu dieser Option, während, wenn ich ein Stück Text eingeben Es gibt einen Fehler (ich weiß es)

Was ich verwirrt bin, ist, warum, wenn ich zu int ändere, nur dann wird es auf die eingegebenen Optionen reagieren, während, wenn ich die Int wegnehmen, bekomme ich keine Fehler, aber gleichzeitig reagiert das Programm nicht auf gültige Eingaben.

Es tut uns leid, wenn das Informationen unklar ist. Es ist der beste Weg, um es zu erklären. Eine tatsächliche Antwort

+4

Ihre Einrückung ist falsch. Außerdem benutzen wir normalerweise 'lower_case' für Variablen und Funktionen und reservieren' CamelCase' für Klassen. Außerdem wäre es besser, eine Antwort zurückzugeben, anstatt eine globale Variable zu ändern. – katrielalex

+0

Um den Vorschlag von @ katrielalex zu erläutern: Globals sind schlecht - sie ermutigen einen Codierungsstil, der jedem Teil des Programms erlaubt, Werte zu ändern, die von anderen Teilen des Programms verwendet werden. Dies führt zu Problemen, wenn ein Teil Ihres Codes einen Wert ändert, wenn Sie es nicht erwartet haben und das gesamte Programm in Ihrem Gesicht explodiert. –

+0

Ich habe die Einrückung korrigiert, so dass der Code Syntaxüberprüfungen bestehen wird. –

Antwort

0

Ganzzahlen und Zeichen/Zeichenfolgen sind unterschiedliche Typen in Python. Zum Beispiel ist '1' nicht dasselbe wie 1.

Wenn Ihr sah Menüoption so etwas wie:

if 1 <= input <= 4: 
    # Valid input, find the menu 

... dann sind Sie für ganze Zahlen zu überprüfen.

Hoffnung, die Sinn ergab.

+0

Oder schwimmt oder einer der anderen von Python unterstützten numerischen Typen. Ein lustiger Bug wäre ein Code, der gut funktionierte, wenn der Benutzer "1" oder "5" eingab und Eingaben wie "Bacon Sandwich" korrekt ablehnte - die aber bei Benutzereingaben wie "1.5" fehlten. –

2

In Python 2.x wertet input den eingegebenen Text aus. int löst einen ValueError aus, wenn Sie etwas übergeben, das nicht in eine Ganzzahl konvertiert werden kann.

Der Grund, warum es mit Zahlen arbeitet, ist, dass Zahlen zu Zahlen ausgewertet werden - genau wie in der Python-Befehlszeile. Ich wette, wenn Sie in Ihrem Beispiel print "hello world" setzen, erhalten Sie nicht den gleichen Fehler als wenn Sie zzzz eingegeben würden. Das erste ist gültig für Python, das zweite nicht.

Es wäre wahrscheinlich sinnvoller, raw_input zu verwenden, da es unwahrscheinlich ist, dass der Python-Interpreter den eingegebenen Text interpretieren soll - was passiert, wenn der Benutzer import sys; sys.exit() eingibt?

Ich denke, das Richtige hier zu tun wäre, die Eingabe zu nehmen, versuchen, es in ein int zu konvertieren, und erneut aufgefordert, wenn es einen Fehler auslöst.

choice = None 
while not choice: 
    val = raw_input("Enter Option Number: ") 
    try: 
     choice = int(val) 
    except ValueError: 
     print("Must be an integer 1 to 4") 
+1

Ich benutze Python 3. Das verwendet raw_input nicht? –

+0

ja. Sie können 'input' durch' raw_input' ersetzen. Die meisten Leute benutzen Python 2.X. Wenn Sie Hilfe zu Python 3.X benötigen, geben Sie bitte das entsprechende Tag an. – Simon

+0

@JoeTaylor: Ah - Py3k. Erklärt viel. Nur wenn Sie sagen, dass Sie Python 3 verwenden, nehmen wir im Allgemeinen an, dass Sie Python 2 verwenden (was ziemlich anders ist) und geben Sie einen Hinweis, der für Python 2 gilt. Für solche Fragen ist der Unterschied sehr wichtig * Immer * sagen Sie uns, wenn Sie Python 3 verwenden. –

0

Plagiat von einer anderen answer of mine:

In Python 2.7, input() ist nicht das, was Sie wollen für die Benutzereingabe zu bekommen. Sie wollen eigentlich raw_input(). (Dies ist in der Tat verwirrend, und wurde in Python 3 behoben.)

Der Unterschied ist, dass input() Benutzereingaben nimmt und dann versucht, es auszuwerten, als ob Sie es als einen Befehl in eine interaktive Python-Sitzung eingegeben haben. Funktionsaufrufe und Ausdrücke werden ausgewertet, was zu einigen "Was ?!" führt Wenn Sie Momente versuchen, es zu benutzen für allgemeine Zwecke Benutzereingabe:

In [18]: my_number = input("Please enter a number >> ") 
Please enter a number >> locals() # unexpected user input 

In [19]: print (my_number) 
{'disp': <function disp at 0x029FBEB0>, 'all': <function all at 0x0290BA70>, 
'dist': <function dist at 0x030D1430>, 'issubsctype': <function issubsctype 
at 0x028FADF0>, 'sca': <function sca at 0x062AF370>, 'savez': <function 
savez at 0x02A8E830>, 'entropy': <function entropy at 0x030C8F70>, 
'restoredot': <built-in function restoredot>, 'ptp': <function ptp at 
0x0290BB30>, 'Subplot': <class 'matplotlib.axes.AxesSubplot'>, 'frange': 
<function frange at 0x030D1930>, 'PackageLoader': <class 
numpy._import_tools.PackageLoader at 0x0248C8B8>, 'rec2csv': 
<function rec2csv at 0x030FE4B0>, 'ylabel': <function ylabel at 0x062AF6F0>, .... 
# what?! 

Stattdessen raw_input() verwenden, die den Benutzer zu einer Eingabe fragt, dann kehrt, was sie als Zeichenfolge eingegeben haben.

Das Lesen der Dokumentation für input() und raw_input() kann helfen, dies zu klären.


Ah, Sie verwenden Python 3. In diesem Fall versuchen, die approach I suggested in the other question - definiert eine Funktion, die für immer Schleife, bis es gültige Benutzereingabe bekommt, dann kehrt

(also die Schleife zu brechen.) Python 2.x Code um Floats zu bekommen: Python 3 anpassen und ints holen. (Dies ist für Sie eine triviale Übung.)

def get_float_from_user (prompt): 
    while True: 
     try: 
      user_input = float(raw_input(prompt)) 
      return user_input 
     except ValueError: 
      print ("Not a floating point number. Please try again.") 

x = get_float_from_user("Enter x.") 
y = get_float_from_user("Enter y.") 

print (x+y) 
Verwandte Themen