2013-03-31 10 views
3

Я поставил следующую задачу:Data Validation - Почтовый индекс

Определим функцию postalValidate (S), который первым проверяет S представляет собой почтовый индекс, который действителен: первых, удалите все пробелы; остаток должен иметь вид L # L # L #, где L - буквы (в нижнем или верхнем регистре), а # - цифры. Если S недействительный почтовый индекс, верните логическое значение False. Если S действителен, верните версию того же почтового кода в симпатичном формате L # L # L #, где каждый L является капиталом.

Вот мой код:

def postalValidate(S): 
S = S.replace(" ", "") 
    for c in range(0, 4, 2): 
     if S[c].isalpha() == True: 
     x = True 
    for c2 in range(1, 5, 2): 
     if S[c2].isdigit() == True: 
     y = True 
    if x == True and y == True: 
      return S.upper() 
    else: 
     return False 

Проблема, я получаю эту ошибку:

UnboundLocalError: local variable 'y' referenced before assignment

Помощь с этим было бы весьма признателен.

+0

Ваш код имеет проблемы с отступом. Не могли бы вы [изменить] вопрос, чтобы он имел тот же отступ, что и код, который вы используете? –

ответ

2

Проблема заключается в том, что если условие S[c2].isdigit() == True не выполнено, переменная y не назначена, и поэтому вы не можете проверить, будет ли она позже. Самый простой способ избежать этого, чтобы присвоить ему значение False заранее:

y = False 
for c2 in range(1, 5, 2): 
    if S[c2].isdigit(): 
     y = True 

Несколько примечаний:

  1. Вам не нужно явно == True в if положения. if cond проверяет, bool(cond) - True, а в вашем случае cond равно True уже.

  2. Результат функции range не включает в свой второй аргумент:

    In [1]: list(range(0, 4, 2)) 
    Out[1]: [0, 2] 
    

    Вы, вероятно, хотите добавить к нему 1:

    In [2]: list(range(0, 5, 2)) 
    Out[2]: [0, 2, 4] 
    

Также вы можете использовать ноте среза, чтобы избежать петель в целом.

Так несколько оптимизаций может уменьшить длину кода:

def postValidate(s): 
    s = s.replace(' ', '') 
    if len(s) == 6 and s[0:5:2].isalpha() and s[1:6:2].isdigit(): 
     return s.upper() 
    return False 
+0

Спасибо, и извиняюсь за то, что я был Python noob. – Dan

+0

Все, я опоздал на ничью. Этот ответ лучше моего. Я удаляю свою. –

+0

@ Dan Ничего извиниться. Вопрос четко изложен и показывает некоторые усилия на вашей стороне. –

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