有人向我提出了以下问题:
定义一个函数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
注意事项:
在
if
子句中不需要显式的== True
。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