在Python中检查每个条件的if else,即使其中一个为真

2 投票
3 回答
10742 浏览
提问于 2025-04-18 16:36

在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

撰写回答