3

我遇到了以下问题:

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

对此的帮助将不胜感激。

4

1 回答 1

3

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

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

几点注意事项:

  1. 您不需要明确== True的 inif子句。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
于 2013-03-31T12:27:51.100 回答