在一个while循环中从键盘读取字符

时间:2011-11-03 14:59:09

标签: python loops input keyboard python-3.x

以下代码块:

ans = 'x'
while ans not in ['Y','y','N','n']:
    ans = input("Do Something? [y|n]:")
    print(ans in ['Y','y','N','n'])

产生以下输出:

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

我想重复读取用户的输入,直到它是'Y','y','N','n'。 但循环永远不会停止。必须有一些我缺少的东西。 请帮我。

编辑:
在交互模式下运行时,这与相同代码的结果相同: Windows 7计算机上的版本为3.2.0。

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

4 个答案:

答案 0 :(得分:4)

将您的Python更新为更新版本。

你违反了3.2.0中引入的一个错误,几乎立即修复了。来自错误报告:

  

在Python 3.2中,内置函数input()返回一个带有的字符串   在Windows上尾随'\ n':

C:\Python32>python
Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print(repr(input()))
test
'test\r'
>>>

时间表:

答案 1 :(得分:1)

该代码在Python 3.2中非常有效:

>>> ans = 'x'
>>> while ans not in ['Y','y','N','n']:
...    ans = input("Do Something? [y|n]:")
...    print(ans in ['Y','y','N','n'])
Do Something? [y|n]:y
True
>>>

这让我怀疑你的问题比你的基本例子更复杂。你在哪里运行代码?它是在一个循环内部的函数中吗?

答案 2 :(得分:0)

编辑这个答案是针对Python-2的,所以这并没有回答用Python-3.x标记的问题。请不要考虑它。


根据Python documentation,您应该使用raw_input()

  

考虑将raw_input()函数用于用户的一般输入。

那是因为input()不符合您的期望:

  

输入([提示])

Equivalent to eval(raw_input(prompt)).

正如您的评论所强调的那样,这不是您真正需要的。

答案 3 :(得分:0)

尝试使用strip()修剪文本:

ans = 'x'
while ans.strip() not in ['Y','y','N','n']:
    ans = raw_input("Do Something? [y|n]:")
    print(ans.strip() in ['Y','y','N','n'])