我提出了以下问题:
定义一个函数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'
非常感谢帮助。
答案 0 :(得分:2)
问题是如果不满足条件S[c2].isdigit() == True
,则不会分配变量y
,因此您无法在以后检查它是否为True。避免它的最简单方法是提前为其分配值False
:
y = False
for c2 in range(1, 5, 2):
if S[c2].isdigit():
y = True
几点说明:
== True
条款中不需要明确的if
。 if cond
检查bool(cond)
是否为True
,并且cond
已经等于True
。
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