初学者Python程序评估密码

时间:2015-10-05 01:42:15

标签: python

我应该用以下标准编写脚本: 编写一个名为validatePassword的函数,该函数将密码字符串作为参数并返回true或false。该函数应仅在以下情况下返回true:

  • 密码至少为8个字符
  • 密码至少包含一个数字
  • 密码至少包含一个大写字母。提示:使用isupper()字符串函数。
  • 密码包含符号之一的符号!@#$%^& *()+ =

到目前为止,我有这个:

def validatePassword(pswd):

    if len(pswd)> 8:
            return True
    else:
            return False
    for char in pswd:
        if char in '01234567890':
            return True
    else:
            return False

    for char in pswd:
        if char in '!@#$%^&*()_+=':
            return True
    else:
            return False
    for char in pswd:
        if char.isupper and char .islower:
            return True
    else:
            return False
    return True

while False:
    print("There was an error with your password")
    print (validatePassword(Herseuclds))

我知道print (validatePassword(Herseuclds))有语法错误,因为我错过了变量,但我不知道怎么做。

5 个答案:

答案 0 :(得分:3)

def validatePassword(pswd):

    if len(pswd) < 8:
        return False

    number_in_password = False
    for char in pswd:
        if char in '012356789':
            number_in_password = True
    if not number_in_password:
        return False

    symbol_in_password = False
    for char in pswd:
        if char in '!@#$%^&*()_+=':
            symbol_in_password = True
    if not symbol_in_password:
        return False

    uppercase_in_password = False
    for char in pswd:
        if char.isupper():
            uppercase_in_password = True
    if not uppercase_in_password:
        return False

    #this only happens if nothing above has disqualified the password
    return True

print (validatePassword("herseuc"))
print (validatePassword("herseuclds"))
print (validatePassword("herseuclds!"))
print (validatePassword("herseuclds!123"))
print (validatePassword("herseuclds!123A"))

答案 1 :(得分:1)

您的代码的主要问题是在最后一行。

print (validatePassword(Herseuclds))

现在,解释器认为Herseuclds是变量,而不是字符串。如果Herseuclds是密码,而不是描述密码的变量,那么您需要在它周围引用它以使其成为字符串文字。

print (validatePassword("Herseuclds"))

你显然没有在你的程序中的任何地方定义一个名为Herseuclds的变量,但程序认为Herseuclds是一个变量而不是一个字符串,所以它会抛出错误。

祝你好运,编码愉快!

答案 2 :(得分:0)

第一个问题是您将未声明的变量传递给您的函数。有关详细信息,请参阅silentphoenix的答案。

其次,您的程序只检查是否满足至少一个条件,而不是全部。

如果密码长度为8个字符,即使密码不符合其他要求,也会返回true

我不打算为你编写代码,但我可以伪问题:

def validatePassword(pswd):

    if len(pswd) < 8:
        return False

    # if there isn't a number:
        return False

    # if there isn't a symbol:
        return False

    # if there isn't an upper and lowercase:
        return False

    return True

while True:
    print("There was an error with your password")
    print (validatePassword("Herseuclds"))

旁注:注意你的缩进:)

答案 3 :(得分:0)

由于您可以使用is.upper(),因此您还可以使用is.digit()来检查数字,而不必记下实际数字。

另一件要加快速度的事情,因为它们必须同时完成,你可以检查密码是否在any()

的一行中验证了这些要求
def validatePassword(pswd):

    l = []

    if len(pswd)> 8:
        for char in pswd:
            l.append(char)

    if any(l for x in l if x.isdigit()) and any(l for x in l if x.isupper()) and any(l for x in l if x in '!@#$%^&*()_+='):
        print('Success')

    else:
        print('Try again')

while True:
    a = input('What is your password?')
    validatePassword(a)

在开始时,最小化检查以确定lengeth是否大于8.如果是,则该单词被分解为列表。这允许使用any()并根据剩余要求进行检查。

答案 4 :(得分:0)

def valid_password(password):
    return (
        # The password is at least 8 characters
        len(password) >= 8 and 
        # The password contains at least one number
        any(c in "0123456789" for c in password) and 
        # The password contains at least one upper case letter
        any(c.isupper() for c in password) and 
        # The password contains a symbol one of the symbols !@#$%^&*()+=
        any(c in "!@#$%^&*()+=" for c in password))

示例:

from getpass import getpass

while not valid_password(getpass('Enter password: ')):
    print('invalid password. Try again')