可以缩短/改进吗?我正在尝试在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
答案 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个多项式;您将每个多项式存储为系数列表,并具有通用的“评估多项式”逻辑。但这不是其中之一。
无论哪种方式,这已经非常难看了。如果你想要嵌套检查,你将需要一个嵌套结构,你可能想要递归处理。