在 CS50P 问题 5 中调用“重新请求梳妆台”(https://cs50.harvard.edu/python/2022/psets/5/test_plates/) 这个程序有效,但我对此感到困惑 为什么我分别写了两次“返回有效”和“返回无效” 有什么不同?
def main():
plate = input("Plate: ")
print(is_valid(plate))
def is_valid(s):
if 2 <= len(s) <= 6 and s[0:2].isalpha() and s[0] != 0 and s.isalnum():
for char in s:
if char.isdigit():
index = s.index(char)
if s[index:].isdigit() and char != 0:
return "Valid"
else:
return "Invalid"
return "Valid"
return "Invalid"
if __name__ == "__main__":
main()
我除了写一次“返回“有效””和“返回“无效””
没有理由不应该在函数的不同点返回值。通常可能会出现 True/False 的单次返回,但这总是会涉及大量 if/and/or 结构,从而使代码难以维护和理解。
最好将逻辑分解为离散组件。
例如,
def is_valid(plate):
if not 2 <= len(plate) <= 6:
return False
if not plate[:2].isalpha():
return False
if not plate.isalnum():
return False
for i, c in enumerate(plate[2:], 2):
if c.isdecimal():
if c == "0":
return False
if not plate[i:].isdecimal():
return False
break
return True
注意使用 isdecimal 而不是 isdigit。前者严格测试 0-9 范围内的值,而后者也会针对上标数字返回 True,这(显然)在车牌上无效