Lesen von Zeichen von der Tastatur in eine while-Schleife
Den folgenden code-block:
ans = 'x'
while ans not in ['Y','y','N','n']:
ans = input("Do Something? [y|n]:")
print(ans in ['Y','y','N','n'])
erzeugt die folgende Ausgabe:
Do Something? [y|n]:Y
False
Do Something? [y|n]:y
False
Do Something? [y|n]:N
False
Do Something? [y|n]:n
False
Do Something? [y|n]:asdf
False
Do Something? [y|n]:Traceback (most recent call last):
File "./NumberPatterns.py", line 27, in <module>
ans = input("Do Something? [y|n]:")
KeyboardInterrupt
Will ich Lesen die Eingabe des Benutzers wiederholt, bis es ist 'Y','y','N','n'.
Aber die Schleife nie beendet. Es muss etwas sein, dass ich vermisst werde.
Bitte helfen Sie mir.
EDIT:
Dies ist das gleiche Ergebnis mit dem gleichen code, der bei Ausführung im Interaktiven Modus:
Version 3.2.0 auf einem Windows 7-Maschine.
C:\Users\jwalker>python
Python 3.2 (r32:88445, Feb 20 2011, 21:30:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ans = 'x'
>>> while ans not in ['Y','y','N','n']:
... ans = input("Do Something? :")
... print(ans in ['Y','y','N','n'])
... print(ans, type(ans), len(ans), ord(ans[0]), repr(ans))
... print('Y', type('Y'), len('Y'), ord('Y'), repr('Y'))
...
Do Something? :asdf
False
<class 'str'> 5 97 'asdf\r'
Y <class 'str'> 1 89 'Y'
Do Something? :Y
False
<class 'str'> 2 89 'Y\r'
Y <class 'str'> 1 89 'Y'
Do Something? :n
False
<class 'str'> 2 110 'n\r'
Y <class 'str'> 1 89 'Y'
Do Something? :Traceback (most recent call last):
File "<stdin>", line 2, in <module>
>>>
>>> ^Z
- Das ist seltsam. Wenn ich
input
zuraw_input
Portierung auf Python 2.6, es funktioniert gut für mich. Die einzige Vermutung die ich habe ist, dassinput
gibt einen anderen Typ. Was Drucke, wenn Sie diese in deine Schleife:print(type(ans), type('Y'))
? - Ich bin damit einverstanden, aber ich Frage mich, was der Typ sein könnte. Kann nicht an nichts denken.
- Könntest du bitte drucken Sie den Inhalt
ans
? - ich dachte, Python ist3 nicht Strippen
\n
, aber der doc sagt, es ist ausgezogen... - sehr komisch, wenn ich deinen code auf meine Python ist3 version, es funktioniert wie ein Charme ... Sie nicht, geben Sie "Y", wenn gefragt wird, was ?
- -1 wegen fehlender follow-up von kafedakias.
- könnten Sie
print ans
,print type(ans)
,print len(ans)
etc? ich glaube nicht, jemand hat Ahnung noch. Im inneren Schleife, rechts, nachdem Sie bekam Eingabe von Benutzer. - Ich ausgeführt wird, den gleichen code im Interaktiven Modus mit dem gleichen Ergebnis. Und ich habe auch enthalten Informationen wie
print(ans)
,print(type(ans))
. - Meine geänderte -1 bis +1.
- Könnten Sie
print(repr(ans))
? - Hi Sebastian, ich aktualisierte den block von meinem loop, um weitere Informationen.
- Ich bemerkte, dass ein CR-escape-Zeichen enthalten ist, in die variable
ans
hinzufügen 1 um die Länge. Und auchprint(ans,
nicht drucken wird der Inhalt der Variablen. Aber wenn ichprint(ans)
es tut. Über dieord
und dierepr
ich gar nicht wissen, was Sie sind, für.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aktualisieren Sie Ihre Python auf eine neuere version.
Müssen Sie in Konflikt geraten einen bug eingeführt wurde 3.2.0 und fast sofort behoben werden. Aus dem bug-report:
Zeit Online:
platform.python_version()
zeigt "3.2.0" könnte das ein bug in meiner version?print(ans, type(ans), len(ans), ord(ans[0]), repr(ans)),
print('Y', type('Y'), len('Y'), ord('Y'), repr('Y'))
Code funktioniert sehr gut in Python 3.2:
Dies lässt mich vermuten, dass Ihre Frage ist ein Hauch komplizierter, als deine einfachen Beispiel. Wo sind Sie den code ausgeführt wird? Ist es in einer Funktion, die innerhalb einer Schleife?
BEARBEITEN, ist Diese Antwort für Python-2, so ist dies nicht die Antwort auf eine Frage getaggt mit Python-3.x. Bitte nicht in Betracht ziehen.
Laut Python-Dokumentation, sollten Sie
raw_input()
:Weil
input()
ist nicht, was Sie erwarten:Dies ist nicht wirklich das, was Sie hier benötigen, wie hervorgehoben, durch Ihren Kommentar.
raw_input
ist nicht verfügbar.NameError
nach der ersten Eingabe.print()
arbeitet in Python 2.6.versuchen Sie, trimmen Sie den text mit strip():