【问题标题】:Python Password Checker - If statement not correctPython密码检查器 - 如果语句不正确
【发布时间】:2019-11-08 14:49:21
【问题描述】:

我正在尝试在 python 中生成一个密码检查器,它使用以下规则来确定用户密码的强度。

如果用户的密码少于 6 个字符,则为 WEAK。 如果用户的密码包含至少 13 个字符、至少 1 个小写字母、至少 1 个大写字母和至少 1 个数字,则该用户的密码为 STRONG。 如果用户既不是强密码也不是弱密码,则该用户具有中密码。

我生成了以下代码:

def strengthOfPassword ( pass ):
    strongness = 0
    up = 0
    low = 0
    num = 0
    for i in pass:
        if i.islower():
            low += 1
        if i.isupper():
            up += 1
        if i.isdigit():
            num +=1 
    print (len(pass))
    if len(pass) >= 13:
        if up > 0 and low > 0 and num > 0:
            strongness = "STRONG PASSWORD"
    if len(pass) < 6: 
        strongness = "WEAK PASSWORD"
    else:
        strongness = "MEDIUM PASSWORD"

    return strongness

strengthOfPassword("2Benji3all4Kiwi")

代码适用于大多数测试用例,但是对于字符串“2Benji3all4Kiwi”,代码错误地指出这是中等密码,而不是强密码,尽管它满足强密码的所有标准。这是为什么呢?

【问题讨论】:

  • 相当有信心这段代码甚至不会运行
  • 你为什么这么认为?
  • 它失败了,因为 len(pass) &lt; 6 是 False,所以它移动到 else 子句。更改为elif len(pass) &lt; 6。 (它也不适合我,因为pass 是关键字)
  • pass 是保留字;您不能将其用作参数名称。

标签: python if-statement


【解决方案1】:

要找出代码行为异常的原因,调试器可能会有所帮助。您可以在执行代码时逐行单步执行代码并查看变量的值。在这里您可以观察到在将strongness 设置为STRONG PASSWORD 之后,该方法还没有返回。相反,它继续。两行之后,len(pass) &lt; 6 的计算结果为 false,因此它进入else 并用MEDIUM PASSWORD 覆盖strongness

你应该做的是,一旦确定了强度,就立即返回。

这让我想到了第二个可改进的点:早期回报。它通过减少嵌套(缩进深度)和类似这样的错误使您的代码更易于阅读,因为您不必记住上面代码中的决定。

另一个重要的一点是pass 是 Python 中的保留关键字。它用于例如空的方法或条件。所以重命名你的变量,不要使用保留关键字。

def strength_of_password(password):
    up = 0
    low = 0
    num = 0

    for i in password:
        if i.islower():
            low += 1
        elif i.isupper():
            up += 1
        elif i.isdigit():
            num +=1 

    if len(password) >= 13 and up > 0 and low > 0 and num > 0:
        return "STRONG PASSWORD"

    if len(password) < 6: 
        return "WEAK PASSWORD"

    return "MEDIUM PASSWORD"

print(strength_of_password("2Benji3all4Kiwi"))

最后,style guide for Python, called PEP-8 建议使用 snake_case 作为方法名称(等等)以提高可读性,从而使其他开发人员更容易理解现有代码。

【讨论】:

  • 很好的答案..:p
  • 下次我会打字快点xD
【解决方案2】:

您的代码显示错误,因为 if else 结构覆盖了您的“强密码”。您可以通过在函数中尽早返回来解决此问题。

也不要使用 'pass' 作为变量或参数,因为它是一个 Reserverd 关键字。

def strengthOfPassword(password):
    strongness = 0
    up = 0
    low = 0
    num = 0
    for i in password:
        if i.islower():
            low += 1
        if i.isupper():
            up += 1
        if i.isdigit():
            num +=1 
    if len(password) >= 13:
        if up > 0 and low > 0 and num > 0:
            # As this returns, it will not execute any other code
            return "STRONG PASSWORD"
    if len(passwo) < 6:
        return "WEAK PASSWORD"
    else:
        return "MEDIUM PASSWORD"

strengthOfPassword("2Benji3all4Kiwi")

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多