2016-07-30 2 views
-1

Я довольно новичок в python и действительно застрял в этом.python: индекс индекса вне диапазона в коде

В принципе, я должен сделать чек-код, чтобы проверить последний алфавит NRIC. Мой код работает нормально, пока есть 7 номеров (например, они должны быть). Однако мой учитель просто помог мне узнать, что мой код не работает, когда число начинается с 0. Ниже мой код.

def check_code(): 
    nricno = int(input("Please enter your NRIC(numbers only). If you don't type an nric number, this code will fail.")) 

    NRIC = [ int(x) for x in str(nricno) ] 

    a = NRIC[0]*2 
    b = NRIC[1]*7 
    c = NRIC[2]*6 
    d = NRIC[3]*5 
    e = NRIC[4]*4 
    f = NRIC[5]*3 
    g = NRIC[6]*2 

    SUM = int(a + b + c + d + e + f +g) 

    remainder = int(SUM % 11) 
    leftovers = int(11 - remainder) 

    rightovers = leftovers - 1 

    Alphabet = "ABCDEFGHIZJ" 

    checkcode = chr(ord('a') + rightovers) 

    print(checkcode) 

check_code() 

Так предполагается, что NRIC рассчитывается на изображении ниже.

NRIC calculation help.

+0

Что значит 'номер, который начинается с 0' означает? – Julien

+0

Если связанное изображение является вашим фактическим назначением, вы не делаете его должным образом. Вам нужно написать функцию, которая берет строку NRIC в качестве аргумента. Ваша функция не должна вызывать функцию 'input()', и ей нужно вернуть код проверки. Логика в коде, который вы отправили, _not_ правильно конвертирует номер проверки в код проверки. –

ответ

2

При преобразовании входной строки в int, ведущий ноль отбрасываются (например, "0153444" ->153444). Когда вы снова вернетесь к строке в понимании списка, вы не получите нулевой результат, поэтому вы получите список NRIC [1, 5, 3, 4, 4, 4] вместо [0, 1 , 5, 3, 4, 4, 4]. Если вы удалите вызов int, например, вы не потеряете начальный ноль.

# Change this: 
nricno = int(input("Please enter your NRIC(numbers only)...")) 
# To this: 
nricno = input("Please enter your NRIC(numbers only)...") 
+0

Существует еще одна проблема с указанным кодом: что, если кто-то не вводит цифры? Что делать, если они набирают '' ZZZZZZZ'' или что-то в этом роде? (Это, очевидно, домашнее задание.) – user268396

+0

код не будет –

+2

@YeoZheYong Я думаю, что это было утверждение пользователя268396.Это дополнительный уровень проверки ввода, который вы, возможно, захотите сделать ... :) Проверьте, что они вводят ровно 7 символов и что все они являются цифрами, прежде чем пытаться что-либо использовать, например ... –

0

Редактировать: Этот код проверяет, если ввод состоит из 7 цифр.

def check_code():  
    while True: 

     nricno = input("Please enter your NRIC(numbers only). If you don't type an nric number, this code will restart.") 

     if len(nricno) == 7 and nricno.digits == True: 
      print ("Works") 
      continue 
     else: 
      print("Error, 7 digit number was not inputted and/or letters and other characters were inputted.") 


    a = NRIC[0]*2 
    b = NRIC[1]*7 
    c = NRIC[2]*6 
    d = NRIC[3]*5 
    e = NRIC[4]*4 
    f = NRIC[5]*3 
    g = NRIC[6]*2 

    SUM = int(a + b + c + d + e + f +g) 

    remainder = int(SUM % 11) 

    print(remainder) 

    leftovers = int(11 - remainder) 

    rightovers = leftovers - 1 

    Alphabet = "ABCDEFGHIZJ" 

    checkcode = chr(ord('a') + rightovers) 

    print(checkcode.upper()) 

check_code() 
+1

Umm ... вы хотите 'break' вместо' continue' там, иначе он будет только когда-либо распечатываться и снова зацикливаться даже на действительном вводе ... Кроме того, проверка должна быть 'if len (nricno) == 7 и nricno.isdigit() ' –

+0

На моем python IDLE эта версия работает, хотя –

1

Вот компактный способ расчета контрольного кода NRIC. Если недопустимая строка передается функции, возникает исключение ValueError, что приведет к сбою программы. И если передается не строка, TypeError будет поднят. Вы можете перехватывать исключения, используя синтаксис try:... except.

def check_code(nric): 
    if len(nric) != 7 or not nric.isdigit(): 
     raise ValueError("Bad NRIC: {!r}".format(nric)) 

    weights = (2, 7, 6, 5, 4, 3, 2) 
    n = sum(int(c) * w for c, w in zip(nric, weights)) 
    return "ABCDEFGHIZJ"[10 - n % 11] 

# Test 
nric = "9300007" 
print(check_code(nric)) 

выход

B 
+0

Wow. Хороший код. –

0

Когда вы заставляете свой вклад как INT, ведущий 0 будет интерпретировано как ошибка в Python 3. Например, int(0351) не поддавался ни 0351 или 351 но просто вызовет ошибку, указав invalid token.

Вы не должны принудительно вводить ввод как int, а вместо этого добавляете инструкцию assert, указывающую, что введенное значение должно быть целым числом из 7 цифр (или регулярным утверждением, как вы это делали, если хотите).

Изменить это:

nricno = int(input("Please enter your NRIC(numbers only). If you don't type an nric number, this code will fail."))

Для этого:

nricno = input("Please enter your NRIC(numbers only). If you don't type an nric number, this code will fail.")

Смежные вопросы