【问题标题】:Password check- Python 3密码检查 - Python 3
【发布时间】:2016-07-22 16:16:38
【问题描述】:

编写一个检查字符串是否为有效密码的函数。

规则: 必须至少有 8 个字符 密码只能由字母和数字组成 密码必须至少包含 2 位数字

这是我到目前为止所拥有的,我做错了什么?谢谢你

def getPassword():
   password = input("Enter password: ")
   return password

def validPassword(password):
   if len(password) >= 8:
      valid = True
   if password.alnum():
      valid = True
   if password.isdigit < 2:
      valid = True
   else:
      return False


def main():
   password = validPassword()
   if validPassword(password):
      print(password, "is valid")
   else:
      print(password, "is invalid")
main()

【问题讨论】:

  • 请告诉我们做错了什么(包括堆栈跟踪,如果有的话),以便我们提供帮助。现在发生了什么出乎你意料的事情?

标签: python function python-3.x passwords


【解决方案1】:

根据here的以下参考isdigit()方法:

如果字符串中的所有字符都是数字,则此方法返回 true 并且至少有一个字符,否则为假。

这不适用于您的情况

密码必须至少包含 2 位数字

该方法只会让您知道给定字符串是否为数字,而不是字符串中有多少位。要实现这一点,您需要尝试一下。

你可以使用下面的

if sum(character.isdigit() for character in password) >= 2:

此外,您的代码有一个小错误,因为您永远不会返回 True。这是一个可能的解决方法:

def CountDigitsFor(password):
   return sum(character.isdigit() for character in password)

def validPassword(password):
   if len(password) >= 8 and password.isalnum() and CountDigitsFor(password) >= 2:
      return True
   return False

此外,在您从用户那里获取密码时,您的主要输入有一个小错字

password = validPassword()

应该是

password = getPassword()

所以这里有完整的代码

def getPassword():
   return input("Enter password: ")

def CountDigitsFor(password):
   return sum(character.isdigit() for character in password)

def validPassword(password):
   if len(password) >= 8 and password.isalnum() and CountDigitsFor(password) >= 2:
      return True
   return False

def main():
   password = getPassword()
   if validPassword(password):
      print(password + " is valid")
   else:
      print(password + " is invalid")

main()

【讨论】:

  • 我在这里做错了什么?def CountDigitsFor(password): res = [] for i in password: if i.isdigit(): res.append(i) return int
  • @HassanAli 你为什么要这么做?
【解决方案2】:

这似乎是一项家庭作业,所以我会尽量避免直接回答,但更多的是尝试将您推向正确的方向。

您将运行的第一段代码将是

...
def main():
    password = validPassword() # the password we are trying to check
...

哦,哦,validPassword(password) 接受了参数但没有得到密码,也许你的意思是getPassword()

让我们逐行看一下validPassword(password)的逻辑

...
def validPassword(password):
   if len(password) >= 8: 
      valid = True 
...

让我们检查字符串的长度是否超过8个字符,如果是,我们初始化变量valid并将其设置为True

...
   if password.alnum(): 
      valid = True 
...

那么不管发生了什么,我们调用alnum,(我认为这不是python中的函数,可能是isalnum。)来检查密码中的所有字符是否都是数字。 如果是,我们初始化变量 valid 并将其设置为 True。 你可能会说,但我已经初始化了它,好吧,不是真的,在python中有scope

...
   if password.isdigit < 2:
      valid = True
...

然后我们检查密码方法isdigt是否小于2,也许你的意思是password.isdigit()我真的很细致,因为不清楚你对编程或python的熟练程度。但是,如果您的意思是password.isdigit() &lt; 2,那么您是在询问密码是否是数字,如果是,它是否小于 2。 如果是,我们初始化变量valid并将其设置为True。

...
   else:
      return False
...

那么当且仅当password.isdigit() &lt; 2 为假时,我们返回假。

这里有一些提示:

  • 了解control flow in python
  • 当您在这里提出问题时,而不是说“这里有问题,这里 是我当前的代码,请帮忙,”说,“这是问题,这是我的 当前代码,这是我对 x,y,z 行的期望,而 a,b,c 是 发生了,请帮忙”如果我们不知道你在哪里挣扎, 我们如何为您提供最好的帮助
  • 尝试运行您的代码并向我们展示堆栈跟踪(如果存在),这里肯定会出现错误,python 恰好有比大多数语言更好的错误(在我看来)

希望我的逐行解释能帮助您找到一些错误并更好地了解如何继续,如果没有,请随时修改您的问题,以便我们更好地了解如何提供帮助。

编码愉快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多