чтение символа с клавиатуры в цикле while

#python #loops #input #keyboard #python-3.x

#python #циклы #ввод #клавиатура #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’.
Но цикл никогда не останавливается. Должно быть что-то, чего мне не хватает.
Пожалуйста, помогите мне.

РЕДАКТИРОВАТЬ:
Это тот же результат того же кода при запуске в интерактивном режиме: версия 3.2.0 на компьютере с Windows 7.

 C:Usersjwalker>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 'asdfr'
Y <class 'str'> 1 89 'Y'
Do Something? :Y
False
 <class 'str'> 2 89 'Yr'
Y <class 'str'> 1 89 'Y'
Do Something? :n
False
 <class 'str'> 2 110 'nr'
Y <class 'str'> 1 89 'Y'
Do Something? :Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
>>>
>>> ^Z
  

Комментарии:

1. Это странно. Если я изменю input на raw_input , чтобы перенести его на Python 2.6, у меня все работает нормально. Единственное предположение, которое у меня есть, это то, что input дает другой тип. Что печатается, если вы поместите это в свой цикл: print(type(ans), type('Y')) ?

2. Я согласен, но мне интересно, каким может быть тип. Ничего не могу придумать.

3. Не могли бы вы, пожалуйста, распечатать содержимое ans ?

4. я думал, что python3 не удаляется n , но в документе говорится, что он удален…

5. @kafedakias: Не могли бы вы предоставить print(repr(ans)) ?

Ответ №1:

Обновите свой Python до более поздней версии.

Вы столкнулись с ошибкой, которая была введена в 3.2.0 и почти сразу исправлена. Из отчета об ошибке:

В Python 3.2 встроенная функция input() возвращает строку с завершающим символом ‘r’ в Windows:

 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
'testr'
>>>
  

Временная линия:

Комментарии:

1. Я добавил выполнение в интерактивном режиме. версия 3.2 в Windows 7.

2. Хм. Я также использовал 3.2 с Windows 7.

3. platform.python_version() показывает ‘3.2.0’ может ли это быть ошибкой в моей версии?

4.Сомнительно. Добавьте это в свой цикл и давайте посмотрим, что он говорит: print(ans, type(ans), len(ans), ord(ans[0]), repr(ans)), print('Y', type('Y'), len('Y'), ord('Y'), repr('Y'))

Ответ №2:

Этот код отлично работает в 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
>>>
  

Это заставляет меня подозревать, что ваш вопрос является более сложным, чем ваш базовый пример. Где вы запускаете код? Это в функции, которая находится внутри цикла?

Комментарии:

1. Код не находится внутри функции или любой другой формы контейнера.

Ответ №3:

РЕДАКТИРОВАТЬ Этот ответ предназначен для Python-2, поэтому он не отвечает на вопрос, помеченный Python-3.x. Пожалуйста, не рассматривайте его.


Согласно документации Python, вы должны использовать raw_input() :

Рассмотрите возможность использования функции raw_input() для общего ввода от пользователей.

Это потому, что input() это не то, что вы ожидаете:

ввод ([приглашение])

 Equivalent to eval(raw_input(prompt)).
  

Это не совсем то, что вам здесь нужно, как указано в вашем комментарии.

Комментарии:

1. в теге для Q написано python-3.x, так что этот парень может использовать это. мне это кажется правильным.

2. Вопрос помечен как python-3.x, поэтому raw_input недоступен.

3. ммм, хорошая мысль. Я редактирую свой ответ, чтобы пометить его как неактуальный, поскольку в документе Py3k говорится, что так и должно быть.

4. -1. Он использует Python 3, о чем свидетельствует тег python-3.x и функция печати. Кроме того, если вы запустите его без изменений на python-2.x, он не будет работать так, как он показывает, но выдаст NameError после первого ввода.

5. @StevenRumbalski: Я знаю, почему я не знал о версии Python: print() работает на Python 2.6.

Ответ №4:

попробуйте обрезать текст с помощью 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'])