在Python中检查每个条件的if else,即使其中一个为真
在Python中,有没有办法让if else语句在一个条件为真时继续检查其他条件?这是我的代码:
status = True
if pass_len(S) == False:
print ('Password must be at least 6 characters long')
status = False
elif pass_upper(S) == False:
print('Password must include upper case letters')
status = False
elif pass_lower(S) == False:
print('Password must include lower case letters')
status = False
elif pass_nums(S) == False:
print('Password must include digits.')
status = False
else:
status = True
return status
举个例子,如果密码没有大写字母或者没有数字,我希望能同时打印这两个提示,而不是只显示“密码必须包含大写字母”,然后就结束了。我试着把每个语句里的return去掉,但这样也没用。希望能得到一些帮助,谢谢。
3 个回答
1
我借鉴了@JasonS的精彩回答,这里是我在评论中提到的位操作方法。
# :: all functions look just like this one! ::
import functools, operator
def pass_len(password, length=6):
try:
if len(password) < length:
return 0b0001
else:
return 0
except Exception as e:
return 0b0001
# pass_upper returns 0b0010 or 0
# pass_lower returns 0b0100 or 0
# pass_nums returns 0b1000 or 0
def password_validate(password):
conditions = [pass_len, pass_upper, pass_lower, pass_nums]
result = functools.reduce(operator.or_, map(lambda x: x(password), conditions))
errors = [message for (bitflag, message) in (
(0b0001, 'Password must be at least 6 characters long'),
(0b0010, 'Password must include upper case letters'),
(0b0100, 'Password must include lower case letters'),
(0b1000, 'Password must include digits.')
) if result & bitflag]
for error in errors:
print(error)
输出结果:
>>> password_validate("hunter12")
Password must include upper case letters
>>> password_validate("HUNTER")
Password must include lower case letters
Password must include digits.
>>> password_validate('')
Password must be at least 6 characters long
Password must include upper case letters
Password must include lower case letters
Password must include digits.
你可以进一步简化这个过程,方法是:
def password_validator(bitflag):
def wrap(f):
def wrapped_f(*args):
return bitflag if f(*args) else 0
return wrapped_f
return wrap
@password_validator(0b0001)
def pass_len(password, length=6):
return len(password) < length
@password_validator(0b0010)
def pass_upper(password):
return password.lower() == password
@password_validator(0b0100)
def pass_lower(password):
return password.upper() == password
@password_validator(0b1000)
def pass_num(password):
return any(num in password for num in '0123456789')
def password_validate(password):
# this function is identical to the one above
6
有一种更简洁的方法来实现这个功能,同时还能告诉你哪些错误被触发了,那就是使用列表推导式:
errors = [message for (has_error, message) in (
(not pass_len(S), 'Password must be at least 6 characters long'),
(not pass_upper(S), 'Password must include upper case letters'),
(not pass_lower(S), 'Password must include lower case letters'),
(not pass_nums(S), 'Password must include digits.'),
) if has_error]
8
不要使用 elif
,用 if
会确保条件被检查。只有当 if
的结果是 False
时,elif
才会被检查。
In [40]: foo = 3
In [41]: if foo == 3:
....: print (foo)
....: if foo != 4:
....: print ("checked too")
....:
3
checked too
status = True
这行代码已经把状态设置为 True
了,所以直接 return status
就可以了,不需要再写一个 else
。