通过我的方法一个并检查每个方法的结果是什么好方法?



我是Python编程的新手,但试图使密码检查器检查单个字符串输入中的某些东西。如果任何方法返回else,我想重新启动while循环。

def length():
if len(password) > 8:
print("Password is long enough. ")
else:
print("Password too short, please try a new password. ")

def numbers():
if len([num for num in password if num.isdigit()]) >= 2:
print("Password has two digits. ")
else:
print("Password needs two digits, please try a new password. ")

def lower():
if any(map(str.islower, password)):
print("Password has lower case. ")
else:
print("Password needs an lowercase letter, please try a new password.")

def upper():
if any(map(str.isupper, password)):
print("Password has upper case. ")
else:
print("Password needs an uppercase letter, please try a new password.")

while True:
password = str(input("What is your password? n"))
length()
numbers()
lower()
upper()

我不知道我能做些什么来有效地遍历这些方法并检查我是否得到了我想要的结果。

你可以这样做:

from typing import List

def length(pwd: str) -> bool:
return len(pwd) > 8

def numbers(pwd: str) -> bool:
return len([num for num in pwd if num.isdigit()]) >= 2

def lower(pwd: str) -> bool:
return any(map(str.islower, pwd))

def upper(pwd: str) -> bool:
return any(map(str.isupper, pwd))

if __name__ == "__main__":
functions_to_check: List = [length, numbers, lower, upper]
is_password_satisfactory: bool = False
password: str = ""
while not is_password_satisfactory:
password = str(input("What is your password? n"))
is_password_satisfactory = all(map(lambda f: f(password), functions_to_check))
print(f"{password} is satisfactory")

简单回顾一下anyall是如何工作的:它们都接受一个布尔值列表作为参数,如果列表中的任何(或所有)元素是True,则返回True
扩展这个想法,我们首先列出我们必须使用的函数来验证密码(functions_to_check)。
然后循环,直到密码有效为止。
我们通过构建一个布尔值列表来检查密码是否有效(map(lambda f: f(password), functions_to_check):我们将每个验证函数应用于密码并将结果存储在一个列表中),然后检查该列表中的所有元素是否都是True(我们将其作为参数传递给all函数)。
然后将all函数的结果存储到用于继续循环的变量中,如果密码有效,则中断。

可以从函数返回一个布尔值,作为while循环是否继续的标志。

如果密码不是大写字母,函数返回True,因此循环继续调用upper()。

我鼓励你试着找出如何在所有函数中实现它。

def upper():
if any(map(str.isupper, password)):
print("Password has upper case. ")
return False #exit
else:
print("Password needs an uppercase letter, please try a new password.")
return True # keeps going
flag = True
while flag:
password = str(input("What is your password? n"))
flag = upper()
  1. 为函数添加参数
  2. 让你的函数返回bool
  3. 如果满足所有条件,使用break跳出while-循环。
def length(password):
if len(password) > 8:
print("Password is long enough.")
return True
else:
print("Password too short, please try a new password.")
return False
def numbers(password):
if len([num for num in password if num.isdigit()]) >= 2:
print("Password has two digits.")
return True
else:
print("Password needs two digits, please try a new password.")
return False
def lower(password):
if any(map(str.islower, password)):
print("Password has lower case.")
return True
else:
print("Password needs a lowercase letter, please try a new password.")
return False
def upper(password):
if any(map(str.isupper, password)):
print("Password has upper case.")
return True
else:
print("Password needs an uppercase letter, please try a new password.")
return False
while True:
pw = str(input("What is your password?n"))
if (length(pw) and numbers(pw) and lower(pw) and upper(pw)):
break

返回布尔值的另一种方法是使用异常:

class InvalidPasswordException(Exception):
pass

def validate_length(password: str):
if len(password) < 9:
raise InvalidPasswordException("Password too short, please try a new password.")

def validate_numbers(password: str):
if len([num for num in password if num.isdigit()]) < 2:
raise InvalidPasswordException("Password needs two digits, please try a new password.")

def validate_lower(password: str):
if not any(map(str.islower, password)):
raise InvalidPasswordException("Password needs an lowercase letter, please try a new password.")

def validate_upper(password: str):
if not any(map(str.isupper, password)):
raise InvalidPasswordException("Password needs an uppercase letter, please try a new password.")

def get_password() -> str:
while True:
try:
password = str(input("What is your password? n"))
validate_length(password)
validate_numbers(password)
validate_lower(password)
validate_upper(password)
return password
except InvalidPasswordException as error:
print(error)

if __name__ == '__main__':
get_password()

另外,您可能希望跳出while True循环。为此,您可以使用breakreturn(如果它在函数内)。

使用异常并不比其他方法更好或更差。这是一种不同的风格(参见"请求原谅而不是允许")。