2017-06-29 1 views
2

Bitte beachten Sie, dass ich neu bin. Ihre Hilfe wird geschätzt.Python 3 außer TypeError funktioniert nicht

while True: 
    user = str(input('Enter users sex:')) 
    try: 
     if user == 'female' or user == 'male': break 
    except TypeError: 
     print('Please enter male or female') 
    continue 
print('The user is:',user) 

Ich verstehe nicht, wenn eine ganze Zahl der

eingegeben
except TypeError: 
    print('Please enter male or female') 

nicht print('Please enter male or female') und fragen Sie den Benutzer zur Eingabe.

+0

Weil das 'try' selbst nicht fehlschlägt. Sie können eine ganze Zahl in ihre String-Darstellung konvertieren, aber es ist nicht gleich "weiblich" oder "männlich". – roganjosh

+0

Hinweis: 'str (3)' wirft keinen 'TypeError'. –

+0

Ich denke, die einfache Antwort auf Ihre Frage ist, dass, wenn der Benutzer eine Ganzzahl (sagen wir 5) eingibt, Sie nicht ein "int" von "Eingabe" zurückbekommen, sondern stattdessen "5", was ein 'ist str' selbst. –

Antwort

6

Sie brauchen hier keine Ausnahmeprüfung. Außerdem wird Ihre bedingte Anweisung das TypeError nicht auslösen. Verwenden Sie stattdessen einfach Ihre bedingte Anweisung, um Ihre Schleife fortzusetzen. Dies erfordert auch nicht, dass Sie auch hier eine continue Anweisung verwenden müssen.

Darüber hinaus werden alle input Aufrufe eine Zeichenfolge zurückgeben, so dass Sie nicht als solche zu wirken brauchen. So einfach Ihre Eingabe nehmen, ohne die str Aufruf:

while True: 
    user = input('Enter users sex:') 
    if user == 'female' or user == 'male': 
     break 
    else: 
     print('Please enter male or female') 
print('The user is:', user) 

Wenn Sie diese in eine Funktion setzen wurden, können Sie einfach zurückgeben Ihr Endergebnis einmal zufrieden und dann drucken Sie das „Ergebnis“ von dem, was diese Funktion zurückkehrt. Das folgende Beispiel soll dies verdeutlichen:

def get_user_gender(): 
    while True: 
     user = str(input('Enter users sex:')) 
     if user == 'female' or user == 'male': 
      break 
     else: 
      print('Please enter male or female') 
    return 'The user is: {}'.format(user) 


user_gender = get_user_gender() 
print(user_gender) 

Kleine Anmerkung, werden Sie feststellen, ich eingeführt, um die format String-Methode. Es macht das Manipulieren von Strings ein bisschen leichter, indem man sich an die Gewohnheit gewöhnt, auf diese Weise mit der Manipulation/Formatierung von Strings umzugehen.

+3

Ist das Ergebnis von 'input' nicht eine Zeichenkette in Python 3, also müssen Sie sie technisch nicht als eine interpretieren? – DavidG

+0

@DavidG Ja, das stimmt. Das habe ich nicht ganz verstanden. Vielen Dank. Ich werde meine Antwort aktualisieren, um das zu erklären. – idjaw

+0

Vielen Dank, dass Sie darauf hingewiesen haben. – byenwomolo

2

input() gibt eine Zeichenfolge in Python 3 zurück. Aufruf von str auf es verlässt es wie es ist, so wird es nie eine Ausnahme auslösen.

Sie könnten einen Fehler, wenn Sie so etwas wie zu tun versucht:

number = int(input("enter a number: ")) 

enter a number: abc 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-9-ec0ea39b1c6c> in <module>() 
----> 1 number = int(input("enter a number: ")) 

ValueError: invalid literal for int() with base 10: 'abc' 

, da die Zeichenfolge ‚abc‘ kann nicht in eine ganze Zahl umgewandelt werden (in 10 Basis, zumindest ...)

+0

Ich denke, es ist erwähnenswert, dass dies einen "ValueError" und nicht einen "TypeError" auslöst und nicht im ursprünglichen Code gefangen wird, da die Konvertierung sowieso außerhalb des 'try' /' except' Blocks liegt. – roganjosh

+1

Oh, das stimmt, ich hatte nicht bemerkt, dass der 'try/except' Block nur das' if' enthielt - was niemals eine Ausnahme hätte verursachen können. –

+1

Gute Antwort, aber ich denke, es gehört zu einer anderen Frage. ;) –

Verwandte Themen