2012-05-31 4 views
0

Просто быстрый вопрос, потому что я действительно не могу найти простое решение моей проблемы. Есть ли способ, чтобы получить пользовательский ввод, который предназначен, чтобы быть целое число, но когда строка вводится программа не сломается, а вместо этого отображается «Error»Строки ввода и целые числа

Я пытался работать вокруг него преобразование строк в целые числа и наоборот, но я постоянно получаю «недопустимый литерал для int() с ошибкой base 10», или когда он отображает «Ошибка», он делает это в бесконечном цикле.

Вот мой код просто, чтобы помочь очистить вопрос

choice = input("Enter your choice: ") 

while choice != 3: 
    if choice == 1: 
     get_songs() 
     print 
     main() 
    elif choice == 2: 
     read_songs() 
     print 
     main() 
    else: 
     print "Invalid choice" 

Поэтому в основном я хочу операцию еще работать для строк, а также целое число, которое больше, чем 3 или меньше 1.

+2

Использование raw_input(), а не вход() и конвертировать вручную, перехватывая исключение, если оно терпит неудачу. –

+0

Python 2.x или 3.x? –

ответ

9

, но я постоянно получать «недействителен буквальным для междунаров() с основанием 10» ошибка

Вы получаете исключение, в частности ValueError. Вы можете поймать исключение, используя блок except. Для получения дополнительной информации см. Любой учебник по языку, который вы использовали до сих пор, или попробуйте Google для except block Python.

, когда отображается «Ошибка», он делает это в бесконечном цикле.

Когда вы обнаруживаете, что ввод неправильный, вам нужно получить новый вход, прежде чем повторять цикл. Поместите материал, входящий в состав вашего цикла. Не используйте использование рекурсии (вызов main() изнутри main) в дополнение к циклу; вы только собираетесь запутать себя таким образом. Поскольку вы не получаете значение для choice, пока вы не находитесь внутри цикла, ядро ​​явно break выходит из цикла, когда вы находите соответствующее значение choice, вместо того, чтобы пытаться контролировать цикл с ним (т. Е. Тестирование для него в while состояние).

Мы также можем использовать continue для упрощения структуры цикла: вместо выполнения всей работы в блоке try мы ограничиваем это частью, в которой мы извлекаем номер. Мы используем continue в блоке except, чтобы пропустить остальную часть цикла, когда у нас нет фактического числа, и выполняем остальную часть цикла, когда делаем. (В конце концов, может быть код, который мы называем для choice == 1 или choice == 2 мог raise ValueError для некоторых совершенно иной причине, и мы хотим сделать что-то другое об этом.)

while True: 
    try: 
     choice = int(raw_input("Give me a number")) 
    except ValueError: 
     print "Could you at least give me an actual number?" 
     continue 

    if choice == 1: 
     do_something() 
    elif choice == 2: 
     do_something_else() 
    elif choice == 3: 
     break 
    else: 
     print "Try a different number" 
+0

Ах, я не был слишком знаком с попыткой и исключением блоков в моем учебнике, но это кажется довольно простым и прямым. Я очень благодарен за ваш ответ, это уже давно подслушивало меня! Спасибо :) На самом деле, одна часть вашего ответа путаница, если пользователь не вводит число, остальная часть цикла пропускается, значит, это означает, что по существу в то время как True: и попробуйте: создать бесконечный цикл до тех пор, пока не будет определен окончательный ввод? – Jertise

+1

Чтобы подчеркнуть вышесказанное: рекомендуется использовать raw_input, а не входную информацию, особенно если это программа, предназначенная для развертывания для более широкой аудитории. Вычисляются утверждения, поступающие на input(), и принятие произвольных инструкций создает отверстие для безопасности. http://docs.python.org/library/functions.html#input – abought

0

Так как этот выбор всегда! = 3, вы получите бесконечный цикл. Вы должны получить ввод снова, если он переходит в состояние «else».

0

Что-то: мне не нравится, когда пользователь вводит "" вокруг строк.

ch = raw_input("Enter choice: ") 
#ch *is* a string at this point 
if ch.isdigit(): 
    choice = int(ch) 
else: 
    print "Invalid choice" 

Редактировать (с комментариями):

isdigit не может обрабатывать локали кодирование правильно. В Python 3 вместо этого вы можете использовать isdecimal.   — J.F. Sebastian

+1

'isdigit()' может быть некорректным ('int' отклоняет ввод) в некоторых локалях. Python 2 использует C 'isdigit()': [Can isdigit законно зависит от языка в C] (http://stackoverflow.com/q/2898228/4279). Убедитесь, что вход ascii ('ord (ch) <128') или лучше использовать try/except. В Python 3 вместо этого используйте 'isdecimal()'. – jfs

0

В коде, цикл while должен инкапсулировать input() линию. Ниже более четкая альтернатива, однако:

Создать функцию, которая получает ввод данных пользователя:

def getInteger(prompt): 
    while True: 
     userIn = input(prompt) 
     try: 
      return int(userIn) 
     except ValueError: 
      print "Error" 
Смежные вопросы