数据验证 - 邮政编码

时间:2013-03-31 12:13:41

标签: python validation python-3.x

我提出了以下问题:

定义一个函数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:赋值前引用的局部变量'y'

非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

问题是如果不满足条件S[c2].isdigit() == True,则不会分配变量y,因此您无法在以后检查它是否为True。避免它的最简单方法是提前为其分配值False

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

几点说明:

  1. == True条款中不需要明确的ifif 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]
    
  3. 您也可以使用切片表示法来完全避免循环。

    因此,一些优化可以减少代码的长度:

    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