鱼C论坛

 找回密码
 立即注册
查看: 105|回复: 12

[已解决]来个大佬吧,我的逻辑是不是有问题,怎么改啊?

[复制链接]
发表于 前天 21:51 | 显示全部楼层 |阅读模式

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

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

x
while True:
    commend=input('请输入指令:')

    if commend=='1':
        name=input('请输入用户名:')
        if name in register:
            print('该用户名已存在')
        else:
            number=input('请输入密码:')
            result=hashlib.md5(number.encode('utf-8'))
            hashed_password=result.hexdigest()
            register[name]=hashed_password
            print('恭喜,注册成功~')

    elif commend=='2':
        while True:
            names=input('请输入用户名:')
            if names in register:
                numbers=input('请输入密码:')
                result=hashlib.md5(numbers.encode('utf-8'))
                hashed_password=result.hexdigest()
                while True:
                    if register[names]==hashed_password:
                        print('恭喜,登录成功~')
                        break                                    #来个大佬吧!这里我无法实现成功后退到最外层循环[[/b]/color]
                    else:
                        print('密码错误!')
                        numbers=input('请重新输入密码:')
                        result=hashlib.md5(numbers.encode('utf-8'))
                        hashed_password=result.hexdigest()
                        continue
            else:
                print('该用户名不存在。')
                register=input('请重新输入用户名:')
                continue

    elif commend=='3':
        break
            

最佳答案
前天 23:18
爱吃菠萝包 发表于 2025-5-7 22:20
我懂可以这样改,可是如果要加上我的这一串呢:numbers=input('请重新输入密码:')
我要实现的是输入密 ...

求最佳

其实你原来的代码应该可以实现break到最外层的
我稍微修改了下,现在逻辑稍微好点了

另有几点修改建议
  • md5/sha1加密已被证实不安全(容易重复之类的问题)
  • command而不是commend
  • 非列表的变量名建议使用单数形式
  • 合并print和它后面的input
  • 不要加不加也可以的else


  1. while True:
  2.     commend=input('请输入指令:')
  3.     if commend=='1':
  4.         name=input('请输入用户名:')
  5.         if name in register:
  6.             print('该用户名已存在')
  7.         else:
  8.             number=input('请输入密码:')
  9.             result=hashlib.md5(number.encode('utf-8'))
  10.             hashed_password=result.hexdigest()
  11.             register[name]=hashed_password
  12.             print('恭喜,注册成功~')
  13.     elif commend=='2':
  14.         while True:
  15.             names=input('请输入用户名:')
  16.             if names in register:
  17.                 numbers=input('请输入密码:')
  18.                 result=hashlib.md5(numbers.encode('utf-8'))
  19.                 hashed_password=result.hexdigest()
  20.                 while True:
  21.                     if register[names]==hashed_password:
  22.                         print('恭喜,登录成功~')
  23.                         break
  24.                     print('密码错误!')
  25.                     numbers=input('请重新输入密码:')
  26.                     result=hashlib.md5(numbers.encode('utf-8'))
  27.                     hashed_password=result.hexdigest()
  28.                 break
  29.             print('该用户名不存在。')
  30.             names=input('请重新输入用户名:')
  31.     elif commend=='3':
  32.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 前天 21:51 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 21:52 | 显示全部楼层
问题分析:
1. register 应该是个字典保存用户名和密码,但当前被覆盖为字符串
2. 登录成功后缺少退出多层循环的机制
3. 用户名不存在时的错误处理有逻辑问题(错误地使用了register=input()
4. 密码比对逻辑需要改进


修正后的代码:


  1. import hashlib

  2. register = {}  # 初始化字典保存用户数据

  3. while True:
  4.     cmd = input('请输入指令(1注册 2登录 3退出):')
  5.    
  6.     if cmd == '1':
  7.         name = input('请输入用户名:')
  8.         if name in register:
  9.             print('该用户名已存在')
  10.         else:
  11.             pwd = input('请输入密码:')
  12.             hashed_pwd = hashlib.md5(pwd.encode()).hexdigest()
  13.             register[name] = hashed_pwd  # 正确保存键值对
  14.             print('注册成功~')
  15.    
  16.     elif cmd == '2':
  17.         login_success = False  # 登录状态标记
  18.         
  19.         while not login_success:
  20.             name = input('用户名:')
  21.             if name not in register:
  22.                 print('用户不存在')
  23.                 continue  # 继续用户名循环
  24.                
  25.             # 密码重试最多3次
  26.             for _ in range(3):
  27.                 pwd = input('密码:')
  28.                 hashed_pwd = hashlib.md5(pwd.encode()).hexdigest()
  29.                
  30.                 if hashed_pwd == register[name]:
  31.                     print('登录成功!')
  32.                     login_success = True
  33.                     break  # 退出密码循环
  34.                 else:
  35.                     print('密码错误')
  36.             
  37.             if login_success:
  38.                 break  # 退出用户名循环
  39.         
  40.         # 登录成功后自动返回主循环
  41.    
  42.     elif cmd == '3':
  43.         break
复制代码


主要改进点:
  • 使用register = {}作为用户数据库(字典结构)
  • 增加登录状态标记login_success控制循环层级
  • 限制密码最多尝试3次(安全改进)
  • 修复用户不存在时的错误处理逻辑
  • 注册时正确保存用户名和密码的对应关系


这样修改后:
1. 注册成功时会保存用户名和对应的哈希密码
2. 登录成功后会自动退回到主指令循环
3. 密码错误超过3次会返回用户名输入界面
4. 输入3可以正常退出程序

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 22:16 | 显示全部楼层
本帖最后由 jackz007 于 2025-5-8 01:17 编辑
  1. import hashlib

  2. register = dict()
  3. while True:
  4.     command = '1' if not register else input('请输入指令:')
  5.     if command == '1' :
  6.         name = input('【注册】-> 请输入用户名:')
  7.         if name in register . keys() :
  8.             print('该用户名已存在')
  9.         else:
  10.             number = input('【登录】-> 请输入密码:')
  11.             result = hashlib . md5(number.encode('utf-8'))
  12.             hashed_password = result . hexdigest()
  13.             register[name] = hashed_password
  14.             print('恭喜,注册成功~\n')
  15.     elif command == '2':
  16.         f = True                                                        # 注意此处
  17.         while f :                                                       # 注意此处
  18.             names = input('【登录】-> 请输入用户名:')
  19.             if names in register . keys() :
  20.                 numbers=input('【登录】-> 请输入密码:')
  21.                 result = hashlib . md5(numbers . encode('utf-8'))
  22.                 hashed_password = result . hexdigest()
  23.                 if register[names] == hashed_password:
  24.                     print('恭喜,登录成功~\n')
  25.                     break
  26.                 else:
  27.                     print('【错误】:* 密码错误 *\n')
  28.                     f = False                                           # 注意此处
  29.             else:
  30.                 print('【错误】:* 用户不存在 *\n')

  31.     elif command == '3' :
  32.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 22:20 | 显示全部楼层

我懂可以这样改,可是如果要加上我的这一串呢:numbers=input('请重新输入密码:')
我要实现的是输入密码错误后的指令发生了改变
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 22:25 | 显示全部楼层
本帖最后由 jackz007 于 2025-5-8 01:22 编辑
爱吃菠萝包 发表于 2025-5-7 22:20
我懂可以这样改,可是如果要加上我的这一串呢:numbers=input('请重新输入密码:')
我要实现的是输入密 ...


        没看懂,
我要实现的是输入密码错误后的指令发生了改变
什么叫指令发生了改变,你举例说明一下呢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 23:18 | 显示全部楼层    本楼为最佳答案   
爱吃菠萝包 发表于 2025-5-7 22:20
我懂可以这样改,可是如果要加上我的这一串呢:numbers=input('请重新输入密码:')
我要实现的是输入密 ...

求最佳

其实你原来的代码应该可以实现break到最外层的
我稍微修改了下,现在逻辑稍微好点了

另有几点修改建议
  • md5/sha1加密已被证实不安全(容易重复之类的问题)
  • command而不是commend
  • 非列表的变量名建议使用单数形式
  • 合并print和它后面的input
  • 不要加不加也可以的else


  1. while True:
  2.     commend=input('请输入指令:')
  3.     if commend=='1':
  4.         name=input('请输入用户名:')
  5.         if name in register:
  6.             print('该用户名已存在')
  7.         else:
  8.             number=input('请输入密码:')
  9.             result=hashlib.md5(number.encode('utf-8'))
  10.             hashed_password=result.hexdigest()
  11.             register[name]=hashed_password
  12.             print('恭喜,注册成功~')
  13.     elif commend=='2':
  14.         while True:
  15.             names=input('请输入用户名:')
  16.             if names in register:
  17.                 numbers=input('请输入密码:')
  18.                 result=hashlib.md5(numbers.encode('utf-8'))
  19.                 hashed_password=result.hexdigest()
  20.                 while True:
  21.                     if register[names]==hashed_password:
  22.                         print('恭喜,登录成功~')
  23.                         break
  24.                     print('密码错误!')
  25.                     numbers=input('请重新输入密码:')
  26.                     result=hashlib.md5(numbers.encode('utf-8'))
  27.                     hashed_password=result.hexdigest()
  28.                 break
  29.             print('该用户名不存在。')
  30.             names=input('请重新输入用户名:')
  31.     elif commend=='3':
  32.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 21:39 | 显示全部楼层
jackz007 发表于 2025-5-7 22:25
没看懂,什么叫指令发生了改变,你举例说明一下呢。

哥,我跟你说一下哈,你的密码错误,就直接跳到请输入指令了(这运用到实际中也不适用嘛),我要实现密码错误,然后给一个语句说:请重新输入密码,就是names=input('请重新输入密码’),然后对密码进行验证
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 22:16 | 显示全部楼层
player-none 发表于 2025-5-7 23:18
求最佳

其实你原来的代码应该可以实现break到最外层的

大佬,牛啊,但是我想问一下原理,能细讲一下吗?这个把else去掉我没看懂这部分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:18 | 显示全部楼层
爱吃菠萝包 发表于 2025-5-8 21:39
哥,我跟你说一下哈,你的密码错误,就直接跳到请输入指令了(这运用到实际中也不适用嘛),我要实现密码错 ...

        现在再试试呢?
  1. import hashlib

  2. register = dict()
  3. while True:
  4.     command = '1' if not register else input('请输入指令:')
  5.     if command == '1' :
  6.         name = input('【注册】-> 请输入用户名:')
  7.         if name in register . keys() :
  8.             print('【错误】* 用户已存在 *')
  9.             print('请重新输入!\n')
  10.         else:
  11.             number = input('【注册】-> 请输入密码:')
  12.             result = hashlib . md5(number.encode('utf-8'))
  13.             hashed_password = result . hexdigest()
  14.             register[name] = hashed_password
  15.             print('恭喜,注册成功~\n')
  16.     elif command == '2':
  17.         f = True
  18.         while f :
  19.             names = input('【登录】-> 请输入用户名:')
  20.             if names in register . keys() :
  21.                 while f :
  22.                     numbers=input('【登录】-> [%s] 请输入密码:' % names)
  23.                     result = hashlib . md5(numbers . encode('utf-8'))
  24.                     hashed_password = result . hexdigest()
  25.                     if register[names] == hashed_password:
  26.                         print('恭喜,登录成功~\n')
  27.                         f = False
  28.                     else:
  29.                         print('【错误】:* 密码错误 *')
  30.                         print('请重新输入!\n')
  31.             else:
  32.                 print('【错误】:* 用户不存在 *\n')
  33.     elif command == '3' :
  34.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:43 | 显示全部楼层
爱吃菠萝包 发表于 2025-5-8 22:16
大佬,牛啊,但是我想问一下原理,能细讲一下吗?这个把else去掉我没看懂这部分

你看:

  1. while (blablabla):
  2.     if (blablabla):
  3.         print(1)
  4.         break
  5.     else: # 这个else就没有必要
  6.         print(2)
  7.         continue # 这也没必要
复制代码


while/for 代码块中最后的那个 continue 没意义,因为本来就要进入下一次循环了,continue 跳过了 0 行代码

关于多余的 else 你可以看看这个例子:

  1. if (blablabla):
  2.     print(1)
  3. print(2)
复制代码


很明显,要让程序只输出 1/只输出 2 得加else,不然两个都输出。为什么两个都输出呢?print(2) 没有被跳过,它被执行了。

可是为什么加了break就不用else了呢?如果说“要用else”,得像上面一样,“没有被跳过”。可是break后的代码是被跳过了的。

(突然发现这玩意很难表述出来……代码写多了,bug出多了就习惯了)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 22:50 | 显示全部楼层

我悟了,有了break,就不会执行到print(2),所以else就多余了,感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:53 | 显示全部楼层
jackz007 发表于 2025-5-8 22:18
现在再试试呢?

没必要这样搞吧,本来就是登陆成功break,外面那个 if names in register 块下面刚好也应该break了,可以直接退到最外层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-9 00:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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