【问题标题】:Writing a password validity check function编写密码有效性检查函数
【发布时间】:2020-04-28 17:20:11
【问题描述】:

我最近开始学习 Python,并在遇到这个场景时开始处理场景:

问题: 网站要求用户输入用户名和密码进行注册。编写程序来检查有效性 用户输入的密码。 以下是检查密码的标准: 1. [a-z] 之间至少有 1 个字母 2. [0-9]之间至少有1个数字 1. [A-Z] 之间至少有 1 个字母 3. [$#@] 中至少 1 个字符 4、交易密码最小长度:6 5.交易密码最大长度:12 您的程序应该接受一系列逗号分隔的密码,并根据上述检查它们 标准。将打印符合条件的密码,每个密码用逗号分隔。 例子 如果将以下密码作为程序的输入给出: ABd1234@1,a F1#,2w3E,2We3345 那么,程序的输出应该是: ABd1234@1*

我解决问题的方法是以下代码:

'''

def validity_check(pword):
return \
    (any(i.islower() for i in pword)) and \
    (any(i.isnumeric() for i in pword)) and \
    (any(i.isupper() for i in pword)) and \
    (any((i == "$" or i == "#" or i == "@") for i in pword)) and \
    (6 <= len(pword) < 13)

raw_input = input("Please enter a series of passwords to check, separated by a comma: ")
raw_list = raw_input.split(",")
valid_pwords = []
for i in raw_list:
    if validity_check(i) == True:
        valid_pwords.append(i)
print(",".join(valid_pwords))

'''

我的解决方案似乎有效,但我的问题是关于可读性。自从开始这些 Python 问题以来,我已经有点痴迷于尽可能少的代码行。程序可以更短吗?我选择使用带有三元运算符的单个函数,这会影响可读性吗?

由于我是 Python 新手,因此非常欢迎对该程序的任何帮助和批评!

【问题讨论】:

  • “可读性”是旁观者眼中的东西 - 我看到超复杂的代码被打成一行,因为支持所述代码的团队完全理解它。否则我会认为“不可读”和“不可维护”对他们来说是最佳解决方案。

标签: python


【解决方案1】:

你可以使用正则表达式来解决这个问题,我认为它会对你有所帮助,

import re

pattern = r'^([^a-z]*|[^A-Z]*|[^0-9]*|[^#$@]*)$'

wordlist = list(map(str,input("Please enter a series of passwords to check, separated by a comma: ").split(',')))
for i in wordlist:
    if not(re.match(pattern,i)) and (5<len(i) and len(i)<13):
       print(i)

注意:此正则表达式模式匹配不属于此类别的密码,并且在 if 语句中它对有效密码返回 true。

谢谢!

【讨论】:

    【解决方案2】:

    PEP 8 对格式化validity_check 函数有一些具体建议:

    • 优先使用括号内的隐式续行而不是使用反斜杠的显式续行
    • 将二元运算符放在续行的开头。

    此外,由于您有一堆布尔值anded 在一起,所以首先执行最便宜的。尤其是在这里,您想拒绝一个长度错误的密码,然后再麻烦地多次迭代以验证其他条件。

    最后,比起多个相等性检查,更喜欢包含检查,并删除多余的括号。

    def validity_check(pword):
    
        return (6 <= len(pword) < 13
                and any(i.islower() for i in pword)
                and any(i.isnumeric() for i in pword)
                and any(i.isupper() for i in pword)
                and any(i in "$#@" for i in pword))
    

    任何较短的内容都可能比描述你正在做的事情更多地模糊

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多