ValueError: недопустимый литерал для int () с основанием 10 для не-цифр - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь создать простую программу, которая читает строку из 4 цифр, проверяет, что это действительно 4 цифры, следит за тем, чтобы не было цифр, затем отделяет первые две цифры от двух последних и складывает их вместе,Я могу заставить все это работать, но я все еще получаю эту ошибку:

ValueError: invalid literal for int() with base 10:

Это происходит только тогда, когда я пытаюсь использовать такую ​​строку, как '456f'.

Что можетЯ изменяю, чтобы это исправить?

Код:

    s = input('please type a 4-digit integer \n')
valid = True
for c in s:
    if len(s)!= 4:
        valid = False
    if not c.isdigit():
        print (c, 'is not a valid input')
number = int(s)
firstOne = number // 100
secondOne = number % 100
sum = firstOne + secondOne
x = '/'
if valid == True:
    print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))
else:
    print(len(s), 'is an invalid amount of digits')

Ответы [ 4 ]

4 голосов
/ 16 февраля 2012

Вы проверяете, являются ли все символы цифрами, но эта проверка не имеет последствий - вы просто продолжаете, даже когда вы нашли недопустимые символы. Это приводит к сбою кода с сообщением об ошибке в кавычках.

Я бы предложил использовать специальную функцию для чтения целого числа, которое повторяет запрос до тех пор, пока он не получит правильный ввод:

def input_int_digits(prompt, digits=4):
    while True:
        s = input(prompt).strip()
        if len(s) == digits and s.isdigit():
            return int(s)
        print("Invalid input -- {}-digit integer expected.".format(digits))

Обратите внимание, что я использовал str.strip() для удаления начального или конечного пробела и что str.isdigit() проверяет, являются ли все символы строки цифрами - вам не нужно перебирать строку.

3 голосов
/ 16 февраля 2012

Давайте сосредоточимся на этом коде:

for c in s:
    if len(s)!= 4:
        valid = False
    if not c.isdigit():
        print (c, 'is not a valid input')
number = int(s)

Первое, что нужно сказать, это то, что проверку len() следует переместить за пределы цикла символов.

if len(s)!= 4:
    valid = False
for c in s:
    ...

Следующий комментарийчтобы сделать это, пока вы обнаруживаете не-цифры, вы продолжаете выполнять код, как будто ничего не случилось.Предположительно вы намереваетесь установить valid в False.

if not c.isdigit():
    print (c, 'is not a valid input')
    valid = False

Теперь основная часть проблемы.Вам нужно пропустить преобразование в int при обнаружении неверного ввода.

if valid:
    number = int(s)
    ...

Если вы хотите продолжить такой подход, ваш код будет выглядеть так:

valid = True
s = input('please type a 4-digit integer \n')
if len(s)!= 4:
    valid = False
    print(len(s), 'is an invalid amount of digits')

if valid:
    for c in s:
        if not c.isdigit():
            valid = False
            print (c, 'is not a valid input')

if valid:
    number = int(s)
    firstOne = number // 100
    secondOne = number % 100
    sum = firstOne + secondOne
    x = '/'
    print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))

Сказав все это, я, вероятно, реорганизовал бы код, чтобы справиться с ошибками, как только они будут обнаружены.Код гораздо проще понять, если вы можете организовать свою обработку ошибок таким образом.

s = input('please type a 4-digit integer \n')
if len(s)!= 4:
    sys.exit(str(len(s)) + ' is an invalid amount of digits')
for c in s:
    if not c.isdigit():
        sys.exit(c + ' is not a valid input')
number = int(s)
firstOne = number // 100
secondOne = number % 100
sum = firstOne + secondOne
x = '/'
print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))

Теперь это начало в правильном направлении, но вы можете продолжать в том же духе, улучшая и улучшая код. Ответ Свена дает вам отличную иллюстрацию того, к чему в конечном итоге приведет такой процесс.

2 голосов
/ 16 февраля 2012

А как насчет

...
valid = len(s) == 4 and all(c.isdigit() for c in s)
if not valid:
    print (c, 'is not a valid input')
...

или даже лучше (спасибо, Свен!)

...
valid = len(s) == 4 and s.isdigit()
...
0 голосов
/ 16 февраля 2012

В проверке for для isdigit вы выводите сообщение об ошибке, если строка содержит не цифры, но все еще вызывает int () для всех s
Вам необходимо выйти из программы после сообщения «Неправильный ввод»

Вы можете изменить печать на

sys.exit("is not a valid input")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...