-1

这可以缩短/改进吗?我正在尝试在 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

4

3 回答 3

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块可以通过doing完全去除

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 中的“虚假”概念,也就是布尔上下文中的对象值。通常空和零的东西是False,并且对布尔值求和相当于添加一个和零,所以你去。


当然,除了检查它们是否非零之外,您似乎没有对上/下/数字的计数做任何事情。所以清理只是

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

接着

i_strength = sum([caps,lower,nums]) -1
于 2013-10-25T21:40:35.660 回答
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)
于 2013-10-25T21:34:49.193 回答
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 个多项式;您将每个多项式存储为系数列表,并具有像这样的通用“评估多项式”逻辑。但这不是其中一种情况。

无论哪种方式,这已经很丑陋了。如果你想要嵌套检查,你将需要一个嵌套结构,你可能想要递归地处理它。

于 2013-10-25T21:42:35.843 回答