【问题标题】:Password check(strong or weak)密码检查(强或弱)
【发布时间】:2018-07-04 23:18:41
【问题描述】:

编写一个判断密码是否正确的函数。我们 将一个好的密码定义为至少 8 个字符长并且 包含至少一个大写字母、至少一个小写字母和至少一个数字。

import string
num = [i for i in range(0,10)]
letdown = list(string.ascii_lowercase)
letup = list(string.ascii_uppercase)
def good_password(password):
    l1=[]
    l2=[]
    l3=[]
    for char in password:
          if char in num:
              l1.append(char)
          elif char in letdown:
              l2.append(char)
          elif char in letup:
              l3.append(char)
    if len(l1)>=1 and len(l2) >=1 and len(l3) >=1 and len(password) >=8:
        return True
    else:
        return False

这是我想出的代码。但是,它似乎不起作用,我不知道为什么。谁能解释我?我仍然是编程新手。

【问题讨论】:

  • 提示:"5" in num 将评估为 False。为什么会这样?
  • 你的意思是它不工作?当您尝试使用正确的密码或错误的密码时会发生什么?
  • “它似乎不起作用”不是一个充分的问题陈述。
  • 顺便说一句,我的小毛病:if <Boolean expression>: return True else: return False 可以(并且应该)总是替换为return <Boolean Expression>
  • 在您的代码中,num 是整数列表 [0, 1 ... 9] 而它应该是字符串“0123456789”或字符列表 ['0',' 1' ...'9']。

标签: python function passwords


【解决方案1】:

我相信使用“any”方法会更好:

any(_.islower() for _ in passwrod)  # checks that at least 1 character is in lowercase
any(_.isupper() for _ in passwrod)  # checks that at least 1 character is in uppercase
any(_.isdigit() for _ in passwrod)  # checks that at least 1 character is a number

【讨论】:

    【解决方案2】:

    您需要将 'num' 的 int 列表转换为字符串列表。因为你不能比较 int 和 str

    >>> '1' == 1
    False
    >>> '1' in [1,2]
    False
    

    改变

    num = [i for i in range(0,10)]
    

    num = map(str, [i for i in range(0,10)])
    

    【讨论】:

    【解决方案3】:

    我会考虑使用 .isdigit(), .isupper(), and .islower() 的内置函数中的 python,这样可以节省一些行来检查这些条件的密码。

    您还应该将您的elif 替换为if。您的代码现在的方式是,一旦满足一个 if 条件,它就不会检查其余部分。因此,如果您希望满足所有条件,则需要检查每个条件是否为真。

    编辑:正如 Fred 在下面指出的,第二部分在技术上并不正确。尽管关于 ifelif 的陈述是正确的,但由于 Fred 提到的原因,它不需要在您的代码中使用。

    【讨论】:

    • 完全正确,我喜欢你的回答,使用内置也很聪明!如果需要,请查看我的答案
    • 我想说的不仅仅是聪明,它几乎是"one ... obvious way to do it."
    • 我喜欢这个答案的第一部分。但是由于一个字符不能同时是数字、大写字母和小写字母,所以第二部分不正确。
    【解决方案4】:

    经过一些运行和一些测试,我得到了一个简单的解决方案,正如其他用户所说,str不等于num,意思是0!=“0”,所以,你可以将第一个列表转换为执行此操作的包含数字的 str 列表:

    num = [str(i) for i in range(0,10)]
    

    现在你的清单是:

    => ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    

    最后当你尝试你的代码时:

    (我稍微改了个名字,让自己更喜欢)

    导入字符串 num = [str(i) for i in range(0,10)] 失望=列表(string.ascii_lowercase) letup = list(string.ascii_uppercase)

    def good_password(password):
        hasNum=False
        hasUp=False
        hasDown=False
        for char in password:
          if char in num:
              hasNum = True
          if char in letdown:
              hasDown = True
          if char in letup:
              hasUp = True
        return hasNum and hasDown and hasUp and (len(password) >= 8)
    
       good_password("Hoooooola1")
    => True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2014-10-26
      • 2012-06-16
      • 1970-01-01
      • 2013-05-18
      相关资源
      最近更新 更多