【问题标题】:How to iterate through list in a function properly如何正确遍历函数中的列表
【发布时间】:2021-09-26 20:02:25
【问题描述】:
users = [{"username":"tom", "password":1234},{"username":"pete", "password":1234},{"username":"lisa", "password":1234}]

loged_in = False

def login(log):
    while loged_in == False:
        username_check = input("Please enter your username")
        password_check = str(input("Please enter your password"))
        for user in users:
            if username_check == user["username"] and str(password_check) == str(user["password"]):
                print("Welcome, you're logged in.")
                loged_in == True
                break
            if username_check != user["username"] or str(password_check) != str(user["password"]):
                print("Wrong username or password, please try again.")
                continue

如何让它显示登录是否仅成功/失败一次,而不是显示列表中每个项目的结果?像这样:

“用户名或密码错误,请重试。”

“用户名或密码错误,请重试。”

“用户名或密码错误,请重试。”

【问题讨论】:

  • 这是一个错字; loged_in == True 是一个被丢弃的比较。你至少需要loged_in = True 成为一个作业(单个=;我不能保证它可以解决其他问题)
  • 为什么你要遍历所有用户,而你只要求登录/通过一次?
  • 另外,它是“记录”而不是“记录”,但这是另一回事
  • 并考虑您的数据结构 - 而不是 dicts 列表,只是 dict 其中 key 是用户名和密码是 value 更好这将允许更简单的代码
  • 当遍历这样的列表时,只有在没有匹配项的情况下才知道是否输入了错误的用户名或密码。

标签: python for-loop while-loop


【解决方案1】:

您的代码有几个实现错误。这是一个更简单的功能版本:

users = {"tom": 1234, "pete": 1234, "lisa": 1234}
# NB. to convert the previous list format into a dictionary, use:
# users = {d['username']: d['password'] for d in users}

def login(log):         # not sure what log is for here
    logged_in = False   # initialize in the function (or it will be True forever once a successful login is made
    while not logged_in:  # no need to compare booleans to booleans
        username_check = input("Please enter your username")
        password_check = input("Please enter your password") # no need for str conversion, input is already str
        if username_check in users and password_check == str(users[username_check]):
            print("Welcome, you're logged in.")
            logged_in = True # this and the line below are redundant
            break
        else: # no need to test the previous condition again
            print("Wrong username or password, please try again.")

【讨论】:

  • 嗯,logged_in 似乎是多余的。
  • 我明白你的意思,是的,这个变量在这种情况下是无用的,我把它留了下来,因为它可能用于其他用途。 log 也是一样,不知道这是干什么用的,我把它放在那里
【解决方案2】:

创建一个变量(例如 state=0)。在 for 循环中,如果登录成功,则给它 1(状态 = 1),如果有错误,给它一个错误编号。 根据您的状态,在 for 循环后打印登录结果。 类似:

users = [{"username":"tom", "password":1234},{"username":"pete", "password":1234},{"username":"lisa", "password":1234}]

logged_in = False

def login(log):
    while logged_in == False:
        state = 0
        username_check = input("Please enter your username")
        password_check = str(input("Please enter your password"))
        for user in users:
            if username_check == user["username"] and str(password_check) == str(user["password"]):
                state = 1
                logged_in = True
                break
        if state == 1:
            print("Welcome, you're logged in.")
        else:
            print("Wrong username or password, please try again.")

或者只是:

users = [{"username":"tom", "password":1234},{"username":"pete", "password":1234},{"username":"lisa", "password":1234}]

logged_in = False

def login(log):
    while logged_in == False:
        username_check = input("Please enter your username")
        password_check = str(input("Please enter your password"))
        for user in users:
            if username_check == user["username"] and str(password_check) == str(user["password"]):
                logged_in = True
                break
        if logged_in  == False:
            print("Wrong username or password, please try again.")
    else:
        print("Welcome, you're logged in.")

【讨论】:

  • for 内的第二个if 完全是多余的,可以删除。
  • 非常正确。谢谢。
  • 但它给出了一个错误:在登录时logged_in == False:UnboundLocalError:在分配之前引用了局部变量'logged_in'
  • 我只是考虑打印部分错误,而不是登录机制。
【解决方案3】:

将用户/通过检查逻辑移动到它自己的方法中。这将更容易确定如何构建循环。

这是一个方法示例,如果用户名和密码有效,则返回用户,否则,如果输入不正确,则不返回任何内容。

def validate_user_pass(users, username, password):
    for user in users:
        if (username, password) == (user["username"], user["password"]):
            return user
    return None

现在您的登录方法如下所示:

while True:
    username = input("Please enter your username")
    password = input("Please enter your password")
    user = validate_user_pass(users, username, password)
    if user:
        print("Welcome, you're logged in.")
        break
    else:
        print("Wrong username or password, please try again.")

【讨论】:

  • 谢谢它的工作,但你能告诉我第一个函数中“用户”参数的目的是什么
  • 你能解释一下“if user:”是什么意思吗?如果用户是什么?
  • @Domi 如果可能的话,我希望避免让函数依赖于外部状态。尽管代码的其他部分使用来自全局状态的users,但这会使代码无法灵活更改。想象一下,几个月后你改变了这个设计来处理两个不同的系统,而这些系统有不同的用户集。当我们使用全局范围内的users 变量时,我们无法为第二个系统中的用户交换它。相反,如果我们将数据提供给方法,我们可以通过传入不同的列表作为参数轻松交换用户集。
  • @Domi if user: 正在测试该值是否为None。在这种情况下,它与编写 if user is not None: 基本相同,我们要对此进行测试,因为如果找不到用户,我们将返回 None
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2013-03-28
  • 2019-08-19
  • 2018-10-20
  • 1970-01-01
相关资源
最近更新 更多