【问题标题】:Python - Password Validation programPython - 密码验证程序
【发布时间】:2026-01-27 20:15:02
【问题描述】:

我正在尝试制作一个程序,当用户第一次创建帐户并且必须输入新密码时执行密码验证。

密码必须超过8个字母,包含一个大写字母、一个小写字母和一个数字。

我已经完成了以下代码,但目前无法正常工作。我认为这是因为islower() 仅在字符串中的所有字符都较低时才有效,与 isupper 相同,但对于大写字母。我该如何解决这个问题,以获得满足要求的干净整洁的解决方案?谢谢

while loop:
    pass1 = input('type a password: ')
    if len(pass1) > 8 and pass1.islower() and pass1.isupper() and pass1.isdigit():
        print('password successful')
        break
    else:
        print('Password not valid, please retry')

【问题讨论】:

  • .islower() 检查 all 字符是否为大写。当然,.isupper().islower() 不能同时为真。
  • 好的,感谢您的确认,这就是我认为的问题所在,但仍然不知道如何解决这个问题。
  • 创建一个类似for c in pass1: 的循环。这将遍历整个 pw,而 c 是每次迭代中的当前字符。在那里,您可以使用 isupper/islower/isdigit 并将您观察到的内容存储在变量中。

标签: python while-loop passwords


【解决方案1】:

创建另一个 if else 语句,您检查 islower 方法返回 true 或 false 或将其设置为等于另一个布尔值,然后在第二个(这是您的主要 if 语句)语句中使用该值,然后运行它。

【讨论】:

    【解决方案2】:

    您要查找的条件如下:密码必须是字母数字,但必须全部由小写字母组成,必须组成在所有大写字母中,它必须由所有字母组成,并且它必须由所有数字组成:

    pass1.isalnum() and not pass1.isupper()\
                    and not pass1.islower()\
                    and not pass1.isalpha()\
                    and not pass1.isdigit()
    

    【讨论】:

    • 没有说明整个密码必须是字母数字,要求似乎允许aB3_and_something_else。此外,您的表达式将允许密码过短。
    【解决方案3】:

    这应该可行。

    def anyLower(s):
        return s.upper() != s
    
    def anyUpper(s):
        return s.lower() != s
    
    def anyDigit(s):
        return any(char.isdigit() for char in s)
    
    while True:
        userInput = input("Type a password: ")
        if len(userInput) > 8 and anyLower(userInput) and anyUpper(userInput) and anyDigit(userInput):
            print("Password successful")
            break
        else:
            print("Password not valid, please retry")
    

    anyLower() 函数将字符串转换为大写并检查它是否改变,如果改变了,那么字符串必须至少包含一个小写字符。 anyUpper() 的工作方式类似。

    anyDigit() 遍历字符串中的所有字符,如果任何字符是使用 any() 函数的数字,则返回 true。

    【讨论】:

    • 这是一个有趣的解决方案,似乎对我有用。我是一个新的学习者,所以必须多看一下才能理解它,不过感谢这个解决方案。
    • 不要使用str作为变量名:它是一个内置的字符串构造函数。
    • @DYZ 我把名字改成了s
    • 我自己更喜欢一个更具描述性的名称 :-) 无论如何,实际上没有必要对字符串进行多次传递。
    【解决方案4】:

    您可以尝试使用内置的any() 方法和内置的map() 方法来检查字符串中是否有任何字符,映射到您选择的str 方法,返回True

    conditions = str.islower, str.isupper, str.isdigit
    while True:
        pass1 = input('type a password: ')
        if len(pass1) > 8 and all(any(map(c, pass1)) for c in conditions):
            print('password successful')
            break
        else:
            print('Password not valid, please retry')
    

    【讨论】:

      【解决方案5】:

      密码必须超过8个字母,包含一个大写字母、一个小写字母和一个数字。

      根据功能要求编写代码是一种很好的编程习惯,因此拥有特定功能(例如is_password_valid())会很有用。

      而且,由于目的是检查是否满足所有条件,因此您可以在需要检查所有字符(可能多次)之前提前退出,就像这里的其他一些答案一样。换句话说,类似于(使用测试工具):

      import sys
      
      def is_password_valid(password):
          if len(password) <= 8:
              return False
      
          has_upper, has_lower, has_digit = False, False, False
      
          for character in password:
              if character.islower():   has_lower = True
              elif character.isupper(): has_upper = True
              elif character.isdigit(): has_digit = True
      
              if has_lower and has_upper and has_digit:
                  return True
      
          return False
      
      chs = ['1', 'a', 'B', '_']
      for ch1 in chs:
          for ch2 in chs:
              for ch3 in chs:
                  for ch4 in chs:
                      str1 = ch1 + ch2 + ch3 + ch4 + "....."
                      print(f"{str1} : {is_password_valid(str1)}")
      

      【讨论】: