数据验证-邮政编码



有人向我提出了以下问题:

定义一个函数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'

帮助这将是非常感激的。

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

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

注意事项:

  1. if子句中不需要显式的== Trueif 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

最新更新