#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' >>>
Временная линия:
- 2011-02-20 Выпущен 3.2.0
- 2011-02-21 сообщение о проблеме
- 2011-02-23 исправлена проблема
Комментарии:
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'])