15779327169 发表于 2024-4-5 23:16:44

求助 小甲鱼学python第26讲字典,课后练习最后一题

dict1 = {}


def now_user():
    name = input("'请输入用户名:")
    while True:
      if name in dict1:
            input('此用户名以被注册,请从新输入:')
            continue
      else:
            break
    password = input("'请输入密码:")
    dict1 = password
    print('注册成功,赶紧登入试试吧!')

def new_login():
    name = input("'请输入用户名:")
    while True:
      if name not in dict1:
            print('您输入的用户不存在,请从新输入:')
            continue
      else:
            break
    login_word = input("'请输入密码:")
    while True:
      if login_word == dict1:
            print('欢迎进入系统!')
            break
      else:
            print('密码不正确,请从新输入密码:')
            continue
def system():
    print('----新建用户:N/n----\n----登入账号:E/e----\n----退出程序”Q/q----')
    while True:
      com = str(input('请输入指令代码:'))
      if com == 'n' or com == 'N':
            now_user()
            continue
      if com == 'E' or com == 'e':
            new_login()
            continue
      if com == 'q' or com =='Q':
            print('感谢您的使用,谢谢!')
            break

system()

我这行代码存在的问题由:
1、now_user()函数中,输入N/n指令后,注册新用户aaa,密码111后,再次输入N/n指令,输入同样的aaa用户后,提示此用户名以被注册,请从新输入:,之后再输入ccc或者其他任何用户,都重复出现此用户名以被注册,请从新输入:,没有跳出循环,这是什么情况,如何解决。
2、创建用户用户aaa,密码111后,在new_login()函数中,如果故意将用户aaa的密码输错后,会不断重复您输入的用户不存在,请从新输入:,请问这如何解决。
我是新手,问的比较粗浅,希望大神多多指点,感谢!

FishC 发表于 2024-4-5 23:17:09

问题1的解决方案是将`dict1`声明为全局变量,以便在`now_user()`函数中访问它并进行判断。同时,你需要使用`dict1`来存储密码。修改后的代码如下:

dict1 = {}

def now_user():
    global dict1
    name = input("请输入用户名:")
    while True:
      if name in dict1:
            name = input('此用户名已被注册,请重新输入:')
            continue
      else:
            break
    password = input("请输入密码:")
    dict1 = password
    print('注册成功,赶紧登录试试吧!')

def new_login():
    global dict1
    name = input("请输入用户名:")
    while True:
      if name not in dict1:
            name = input('您输入的用户不存在,请重新输入:')
            continue
      else:
            break
    login_word = input("请输入密码:")
    while True:
      if login_word == dict1:
            print('欢迎进入系统!')
            break
      else:
            login_word = input('密码不正确,请重新输入密码:')
            continue

def system():
    print('----新建用户:N/n----\n----登录账号:E/e----\n----退出程序:Q/q----')
    while True:
      com = input('请输入指令代码:')
      if com.lower() == 'n':
            now_user()
      elif com.lower() == 'e':
            new_login()
      elif com.lower() == 'q':
            print('感谢您的使用,谢谢!')
            break

system()

问题2的解决方案是在`new_login()`函数中添加一个计数器,在用户输入错误密码时,计数器递增,达到一定次数后提示用户密码错误,并跳出循环。修改后的代码如下:

dict1 = {}

def now_user():
    global dict1
    name = input("请输入用户名:")
    while True:
      if name in dict1:
            name = input('此用户名已被注册,请重新输入:')
            continue
      else:
            break
    password = input("请输入密码:")
    dict1 = password
    print('注册成功,赶紧登录试试吧!')

def new_login():
    global dict1
    name = input("请输入用户名:")
    while True:
      if name not in dict1:
            name = input('您输入的用户不存在,请重新输入:')
            continue
      else:
            break
    login_word = input("请输入密码:")
    count = 0
    while True:
      if login_word == dict1:
            print('欢迎进入系统!')
            break
      else:
            count += 1
            if count >= 3:
                print('密码错误次数过多,登录失败!')
                break
            else:
                login_word = input('密码不正确,请重新输入密码:')

def system():
    print('----新建用户:N/n----\n----登录账号:E/e----\n----退出程序:Q/q----')
    while True:
      com = input('请输入指令代码:')
      if com.lower() == 'n':
            now_user()
      elif com.lower() == 'e':
            new_login()
      elif com.lower() == 'q':
            print('感谢您的使用,谢谢!')
            break

system()

希望这可以帮助到你!有任何问题请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

15779327169 发表于 2024-4-5 23:28:08

FishC 发表于 2024-4-5 23:17
问题1的解决方案是将`dict1`声明为全局变量,以便在`now_user()`函数中访问它并进行判断。同时,你需要使用 ...

请问,为什么小甲鱼的答案中没有将user_data = {}设置为全局变量呢

user_data = {}

def new_user():
    prompt = '请输入用户名:'
    while True:
      name = input(prompt)
      if name in user_data:
            prompt = '此用户名已经被使用,请重新输入:'
            continue
      else:
            break

    passwd = input('请输入密码:')
    user_data = passwd
    print('注册成功,赶紧试试登录吧^_^')

def old_user():
    prompt = '请输入用户名:'
    while True:
      name = input(prompt)
      if name not in user_data:
            prompt = '您输入的用户名不存在,请重新输入:'
            continue
      else:
            break
   
    passwd = input('请输入密码:')
    pwd = user_data.get(name)
    if passwd == pwd:
      print('欢迎进入XXOO系统,请点右上角的X结束程序!')
    else:
      print('密码错误!')

def showmenu():
    prompt = '''
|--- 新建用户:N/n ---|
|--- 登录账号:E/e ---|
|--- 推出程序:Q/q ---|
|--- 请输入指令代码:'''

    while True:
      chosen = False
      while not chosen:
            choice = input(prompt)
            if choice not in 'NnEeQq':
                print('您输入的指令代码错误,请重新输入:')
            else:
                chosen = True

      if choice == 'q' or choice == 'Q':
            break
      if choice == 'n' or choice == 'N':
            new_user()
      if choice == 'e' or choice == 'E':
            old_user()

showmenu()

FishC 发表于 2024-4-5 23:28:27

15779327169 发表于 2024-04-05 23:28
请问,为什么小甲鱼的答案中没有将user_data = {}设置 ...

小甲鱼的答案中没有将`user_data`设置为全局变量是因为在函数内部对`user_data`进行了赋值操作,这会创建一个新的局部变量,而不是访问外部的全局变量。

你可以使用`global`关键字将`user_data`声明为全局变量,这样就能在函数内部对其进行修改和访问。修改后的代码如下:

user_data = {}

def new_user():
    global user_data
    prompt = '请输入用户名:'
    while True:
      name = input(prompt)
      if name in user_data:
            prompt = '此用户名已经被使用,请重新输入:'
            continue
      else:
            break
    passwd = input('请输入密码:')
    user_data = passwd
    print('注册成功,赶紧试试登录吧!^_^')

def old_user():
    global user_data
    prompt = '请输入用户名:'
    while True:
      name = input(prompt)
      if name not in user_data:
            prompt = '您输入的用户名不存在,请重新输入:'
            continue
      else:
            break
    passwd = input('请输入密码:')
    pwd = user_data.get(name)
    if passwd == pwd:
      print('欢迎进入XXOO系统,请点右上角的X结束程序!')
    else:
      print('密码错误!')

def showmenu():
    prompt = '''|--- 新建用户:N/n ---|
|--- 登录账号:E/e ---|
|--- 推出程序:Q/q ---|
|--- 请输入指令代码:'''
    while True:
      chosen = False
      while not chosen:
            choice = input(prompt)
            if choice not in 'NnEeQq':
                print('您输入的指令代码错误,请重新输入:')
            else:
                chosen = True
      if choice == 'q' or choice == 'Q':
            break
      if choice == 'n' or choice == 'N':
            new_user()
      if choice == 'e' or choice == 'E':
            old_user()

showmenu()

现在,代码中的`user_data`变量就是一个全局变量,可以在多个函数中共享,并且在`new_user()`函数中将用户名和密码添加到`user_data`字典中。这样,无论是注册新用户还是登录现有用户,都能正确地访问和修改`user_data`字典。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

15779327169 发表于 2024-4-5 23:45:20

FishC 发表于 2024-4-5 23:28
小甲鱼的答案中没有将`user_data`设置为全局变量是因为在函数内部对`user_data`进行了赋值操作,这会创 ...

def now_user():
    name = input("请输入用户名:")
    while True:
      if name in dict1:
            name = '此用户名以被注册,请从新输入:'
            continue
      else:
            break

这个代码和
def now_user():
    name = "请输入用户名:"
    while True:
      xx = input(name)
      if xx in dict1:
            name = '此用户名以被注册,请从新输入:'
            continue
      else:
            break
    password = input("'请输入密码:")
    dict1 = password
有所不同,为什么给出的结果完全不一样
while Ture里和continue的结合,为何第二个代码才能生效,求教

FishC 发表于 2024-4-5 23:45:32

15779327169 发表于 2024-04-05 23:45
def now_user():
    name = input("请输入用户名:" ...

第一个代码片段中的问题在于,当用户名已经存在时,你将错误信息赋值给了`name`变量,而没有重新接收用户输入的用户名。这导致在下一次循环中,无论用户输入什么内容,`name`的值始终是错误信息,而不会再次进入输入用户名的逻辑。因此,无论输入什么用户名,都会陷入无限循环。

第二个代码片段中使用了一个额外的变量`xx`来接收用户输入的用户名,并且将错误信息赋值给了`name`变量。由于`xx`和`name`是不同的变量,所以当用户输入正确的用户名时,`name`不会受到影响,循环可以正常退出。

总结起来,第二个代码片段更正确,因为它避免了将错误信息赋值给控制循环的变量。这样,在错误情况下也能正确地重新接收用户输入的用户名。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

15779327169 发表于 2024-4-5 23:57:01

FishC 发表于 2024-4-5 23:45
第一个代码片段中的问题在于,当用户名已经存在时,你将错误信息赋值给了`name`变量,而没有重新接收用 ...

是不是可以这样理解,while True循环中嵌套continue时事,需要一个变量,之前问的
def now_user():
    name = input("请输入用户名:")
    while True:
      if name in dict1:
            name = '此用户名以被注册,请从新输入:'
            continue
      else:
            break
这段代码中,第一次在 while True循环外部传入一个name变量后,之后不论外部name变量怎么变,对于内部的“name”变量是不能起到影响的,是这个意思吗?

FishC 发表于 2024-4-5 23:57:12

15779327169 发表于 2024-04-05 23:57
是不是可以这样理解,while True循环中嵌套continue时 ...

是的,你理解得很对!在第一段代码中,`name`变量在循环外部被赋值后,循环内部的`name`变量不会受到外部变量的影响。这是因为在每次循环开始时,`name`会重新从用户输入中获取新的值,而不是使用之前外部变量的值。因此,无论外部的`name`变量怎么改变,对循环内部来说都没有影响。为了解决这个问题,我们需要使用一个额外的变量(如上述代码中的`xx`)来接收用户输入,并用这个变量进行判断和操作。这样,每次循环都可以重新获取用户输入的最新值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

15779327169 发表于 2024-4-5 23:58:40

FishC 发表于 2024-4-5 23:57
是的,你理解得很对!在第一段代码中,`name`变量在循环外部被赋值后,循环内部的`name`变量不会受到外 ...

感谢!,大师我悟了

FishC 发表于 2024-4-5 23:58:53

15779327169 发表于 2024-04-05 23:58
感谢!,大师我悟了

不客气!很高兴能帮到你,你的进步莫过于你自己的领悟。继续努力学习,你一定可以成为更好的程序员!如果有任何其他问题,随时都可以向我提问。祝你编程之路顺利!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助 小甲鱼学python第26讲字典,课后练习最后一题