CS50P问题集5

问题描述 投票:0回答:1

在 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()

我除了写一次“返回“有效””和“返回“无效””

python cs50
1个回答
0
投票

没有理由不应该在函数的不同点返回值。通常可能会出现 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,这(显然)在车牌上无效

© www.soinside.com 2019 - 2024. All rights reserved.