我正在编写一个简单的程序,如果用户提供的登录详细信息与列表中的详细信息匹配,则返回True/False。
...
details = [['Charlie', 'Password'],
['Turnbull', 'Password']]
def authenticate():
login_details = get_entry_values() # list of user input [username, password]
for username, password in details:
if login_details[0] == username and login_details[1] == password:
print("Authenticated")
return True
else:
print("Incorrect")
return False
但是,当我输入第一个登录详细信息(“Charlie”后接“Password”)时,它返回True,但当我输入第二个时,它返回False
1条答案
按热度按时间jutyujz01#
因为你有一个列表的列表,你想看看一个给定的列表是否在列表的列表中,你不需要循环遍历这个列表,你只需要做:
如果你不想打印任何东西(你可能不应该打印,因为这会增加代码重用的难度),那么函数可以简化为:
不过,让我们回到你的原始代码,看看问题出在哪里,很简单:你只检查列表中的第一个密码。你的
if
语句总是返回,无论是否匹配,所以代码从不考虑details
中的第二个或后续项。你需要做的是 * 保持检查 * 如果你没有得到匹配。换句话说,直到你完成循环,密码才能被声明为不正确。所以:正如其他人在评论中提到的,字典是存储用户名和密码的更好的数据结构,如果使用字典,就根本不需要循环了:
如果用户名不在字典中,这里使用
dict.get()
返回None
,并且None
不等于任何字符串,因此这有效地同时检查了用户名存在和密码正确。