这段代码可以缩短或改进吗?

时间:2013-10-25 21:28:29

标签: python passwords

可以缩短/改进吗?我正在尝试在python中创建密码检查器。

可以将if放入for循环中吗?如果是这样,怎么样?

pw = input("Enter password to test: ")

caps = sum(1 for c in pw if c.isupper())
lower = sum(1 for c in pw if c.islower())
nums = sum(1 for c in pw if c.isnumeric())

scr = ['weak', 'medium', 'strong']
r = [caps, lower, nums]


if len(pw) < 6:
    print("too short") 
elif len(pw) > 12:
    print("too long")

if caps >= 1:
    if lower >= 1:
        if nums >= 1:
            print(scr[2])
        elif nums < 1:
            print("your password is " + scr[1])
    elif lower < 1:
        print("your password strength is " + scr[0])
elif caps < 1:
    print("your password strength is " + scr[1])

感谢您的任何建议:D

3 个答案:

答案 0 :(得分:2)

caps = sum(1 for c in pw if c.isupper())

可以是:

caps = sum(c.isupper() for c in pw)

if caps >= 1:

可以是:

if caps:

最重要的重要改进:可以通过

完全删除底部if / elif
i_strength = sum(map(bool,[caps,lower,nums])) - 1 #or sum(map(bool,r)) - 1
print('your password is {}'.format(scr[i_strength]))

说明:map(bool,[caps,lower,nums])累计caps,lower,nums每个非零的次数。使用sum添加它们会为您提供“强度”,您可以方便地将其放入列表中,该列表可以通过索引访问。

所有这些改进都利用了python中的“falsiness”概念,在boolean上下文中也称为对象的值。一般是空的和零的东西是False,而总和布尔值相当于添加1和0,所以你去。


当然,除了检查它们是否为非零之外,你似乎并没有任何上/下/ nums的计数。所以清理只是

caps = any(c.isupper() for c in pw)
...

然后

i_strength = sum([caps,lower,nums]) -1

答案 1 :(得分:1)

我会修复嵌套的if语句。

scr = ['weak', 'medium', 'strong'] # if you want to keep this fine
# but I suggest you do something like this:
_WEAK = scr[0] 
_MEDIUM = scr[1]
_STRONG = scr[2]
if caps >= 1 and lower >= 1 and nums >= 1:
   print(_STRONG)
elif caps < 1:
    print("your password strength is " + _MEDIUM)
elif lower < 1:
   print("your password strength is " + _WEAK)
elif nums < 1:
   print("your password is " + _MEDIUM)

答案 2 :(得分:0)

我会忽略一般性问题,“这段代码可以缩短或改进”,因为这是Code Review的问题。但是你也有一个具体的问题:

  

可以将if放入for循环中吗?如果是这样,怎么样?

他们可以,但是你必须将它们变成可以放在迭代器中的东西,比如函数,在这种情况下我真的不认为你想要它。

让我们从一个更简单的例子开始,只需一系列线性检查:

checks = [
    ((lambda caps, lower, num: caps >= 1 and lower >= 1 and nums >= 1), 2),
    ((lambda caps, lower, num: caps < 1), 1),
    ((lambda caps, lower, num: lower < 1), 0),
    ((lambda caps, lower, num: num < 1), 1)
]
for check, value in checks:
    if check(caps, lower, num):
        print('your password strength is ' + scr[value])
        break

您可以将检查条件放在某些编码数据表单中,并将if check(…)替换为条件下的数据驱动检查。例如:

checks = [
    ((1, 1, 1), 2),
    ((-1, 0, 0), 1),
    ((0, -1, 0), 0),
    ((0, 0, -1), 1)
]
for check, value in checks:
    for value, condition in zip((caps, lower, num), check):
        if condition == -1 and value >= 1 or condition == 1 and value < 1:
            break
    else:
        print('your password strength is ' + scr[value])
        break

但我认为这样的可读性更低。有很多用例,这种事情是有道理的 - 例如,想象你想为x的每个值评估40个多项式;您将每个多项式存储为系数列表,并具有通用的“评估多项式”逻辑。但这不是其中之一。

无论哪种方式,这已经非常难看了。如果你想要嵌套检查,你将需要一个嵌套结构,你可能想要递归处理。