鱼C论坛

 找回密码
 立即注册
查看: 182|回复: 9

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

[复制链接]
发表于 2024-4-5 23:16:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
dict1 = {}


def now_user():
    name = input("'请输入用户名:")
    while True:
        if name in dict1:
            input('此用户名以被注册,请从新输入:')
            continue
        else:
            break
    password = input("'请输入密码:")
    dict1[name] = 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[name]:
            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的密码输错后,会不断重复您输入的用户不存在,请从新输入:,请问这如何解决。
我是新手,问的比较粗浅,希望大神多多指点,感谢!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-5 23:17:09 | 显示全部楼层
问题1的解决方案是将`dict1`声明为全局变量,以便在`now_user()`函数中访问它并进行判断。同时,你需要使用`dict1[name]`来存储密码。修改后的代码如下:

  1. dict1 = {}

  2. def now_user():
  3.     global dict1
  4.     name = input("请输入用户名:")
  5.     while True:
  6.         if name in dict1:
  7.             name = input('此用户名已被注册,请重新输入:')
  8.             continue
  9.         else:
  10.             break
  11.     password = input("请输入密码:")
  12.     dict1[name] = password
  13.     print('注册成功,赶紧登录试试吧!')

  14. def new_login():
  15.     global dict1
  16.     name = input("请输入用户名:")
  17.     while True:
  18.         if name not in dict1:
  19.             name = input('您输入的用户不存在,请重新输入:')
  20.             continue
  21.         else:
  22.             break
  23.     login_word = input("请输入密码:")
  24.     while True:
  25.         if login_word == dict1[name]:
  26.             print('欢迎进入系统!')
  27.             break
  28.         else:
  29.             login_word = input('密码不正确,请重新输入密码:')
  30.             continue

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

  42. system()
复制代码


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

  1. dict1 = {}

  2. def now_user():
  3.     global dict1
  4.     name = input("请输入用户名:")
  5.     while True:
  6.         if name in dict1:
  7.             name = input('此用户名已被注册,请重新输入:')
  8.             continue
  9.         else:
  10.             break
  11.     password = input("请输入密码:")
  12.     dict1[name] = password
  13.     print('注册成功,赶紧登录试试吧!')

  14. def new_login():
  15.     global dict1
  16.     name = input("请输入用户名:")
  17.     while True:
  18.         if name not in dict1:
  19.             name = input('您输入的用户不存在,请重新输入:')
  20.             continue
  21.         else:
  22.             break
  23.     login_word = input("请输入密码:")
  24.     count = 0
  25.     while True:
  26.         if login_word == dict1[name]:
  27.             print('欢迎进入系统!')
  28.             break
  29.         else:
  30.             count += 1
  31.             if count >= 3:
  32.                 print('密码错误次数过多,登录失败!')
  33.                 break
  34.             else:
  35.                 login_word = input('密码不正确,请重新输入密码:')

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

  47. system()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[name] = 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-5 23:28:27 | 显示全部楼层
15779327169 发表于 2024-04-05 23:28
请问,为什么小甲鱼的答案中没有将user_data = {}设置 ...


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

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

  1. user_data = {}

  2. def new_user():
  3.     global user_data
  4.     prompt = '请输入用户名:'
  5.     while True:
  6.         name = input(prompt)
  7.         if name in user_data:
  8.             prompt = '此用户名已经被使用,请重新输入:'
  9.             continue
  10.         else:
  11.             break
  12.     passwd = input('请输入密码:')
  13.     user_data[name] = passwd
  14.     print('注册成功,赶紧试试登录吧!^_^')

  15. def old_user():
  16.     global user_data
  17.     prompt = '请输入用户名:'
  18.     while True:
  19.         name = input(prompt)
  20.         if name not in user_data:
  21.             prompt = '您输入的用户名不存在,请重新输入:'
  22.             continue
  23.         else:
  24.             break
  25.     passwd = input('请输入密码:')
  26.     pwd = user_data.get(name)
  27.     if passwd == pwd:
  28.         print('欢迎进入XXOO系统,请点右上角的X结束程序!')
  29.     else:
  30.         print('密码错误!')

  31. def showmenu():
  32.     prompt = '''|--- 新建用户:N/n ---|
  33. |--- 登录账号:E/e ---|
  34. |--- 推出程序:Q/q ---|
  35. |--- 请输入指令代码:'''
  36.     while True:
  37.         chosen = False
  38.         while not chosen:
  39.             choice = input(prompt)
  40.             if choice not in 'NnEeQq':
  41.                 print('您输入的指令代码错误,请重新输入:')
  42.             else:
  43.                 chosen = True
  44.         if choice == 'q' or choice == 'Q':
  45.             break
  46.         if choice == 'n' or choice == 'N':
  47.             new_user()
  48.         if choice == 'e' or choice == 'E':
  49.             old_user()

  50. showmenu()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[xx] = password
有所不同,为什么给出的结果完全不一样
while Ture里和continue的结合,为何第二个代码才能生效,求教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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”变量是不能起到影响的,是这个意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-5 23:57:12 | 显示全部楼层
15779327169 发表于 2024-04-05 23:57
是不是可以这样理解,while True循环中嵌套continue时 ...


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢!,大师我悟了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-5 23:58:53 | 显示全部楼层
15779327169 发表于 2024-04-05 23:58
感谢!,大师我悟了


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 13:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表