爱吃菠萝包 发表于 2025-5-7 21:51:03

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

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=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==hashed_password:
                        print('恭喜,登录成功~')
                        break                                    #来个大佬吧!这里我无法实现成功后退到最外层循环[/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
            

爱吃菠萝包 发表于 2025-5-7 21:51:40

{:10_266:}

FishC 发表于 2025-5-7 21:52:07

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

修正后的代码:


import hashlib

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

while True:
    cmd = input('请输入指令(1注册 2登录 3退出):')
   
    if cmd == '1':
      name = input('请输入用户名:')
      if name in register:
            print('该用户名已存在')
      else:
            pwd = input('请输入密码:')
            hashed_pwd = hashlib.md5(pwd.encode()).hexdigest()
            register = hashed_pwd# 正确保存键值对
            print('注册成功~')
   
    elif cmd == '2':
      login_success = False# 登录状态标记
      
      while not login_success:
            name = input('用户名:')
            if name not in register:
                print('用户不存在')
                continue# 继续用户名循环
               
            # 密码重试最多3次
            for _ in range(3):
                pwd = input('密码:')
                hashed_pwd = hashlib.md5(pwd.encode()).hexdigest()
               
                if hashed_pwd == register:
                  print('登录成功!')
                  login_success = True
                  break# 退出密码循环
                else:
                  print('密码错误')
            
            if login_success:
                break# 退出用户名循环
      
      # 登录成功后自动返回主循环
   
    elif cmd == '3':
      break


主要改进点:

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


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

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

jackz007 发表于 2025-5-7 22:16:45

本帖最后由 jackz007 于 2025-5-8 01:17 编辑

import hashlib

register = dict()
while True:
    command = '1' if not register else input('请输入指令:')
    if command == '1' :
      name = input('【注册】-> 请输入用户名:')
      if name in register . keys() :
            print('该用户名已存在')
      else:
            number = input('【登录】-> 请输入密码:')
            result = hashlib . md5(number.encode('utf-8'))
            hashed_password = result . hexdigest()
            register = hashed_password
            print('恭喜,注册成功~\n')
    elif command == '2':
      f = True                                                      # 注意此处
      while f :                                                       # 注意此处
            names = input('【登录】-> 请输入用户名:')
            if names in register . keys() :
                numbers=input('【登录】-> 请输入密码:')
                result = hashlib . md5(numbers . encode('utf-8'))
                hashed_password = result . hexdigest()
                if register == hashed_password:
                  print('恭喜,登录成功~\n')
                  break
                else:
                  print('【错误】:* 密码错误 *\n')
                  f = False                                           # 注意此处
            else:
                print('【错误】:* 用户不存在 *\n')

    elif command == '3' :
      break

爱吃菠萝包 发表于 2025-5-7 22:20:53

jackz007 发表于 2025-5-7 22:16


我懂可以这样改,可是如果要加上我的这一串呢:numbers=input('请重新输入密码:')
我要实现的是输入密码错误后的指令发生了改变

jackz007 发表于 2025-5-7 22:25:58

本帖最后由 jackz007 于 2025-5-8 01:22 编辑

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

      没看懂,我要实现的是输入密码错误后的指令发生了改变什么叫指令发生了改变,你举例说明一下呢。

player-none 发表于 2025-5-7 23:18:15

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

求最佳

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

另有几点修改建议

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


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=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==hashed_password:
                        print('恭喜,登录成功~')
                        break
                  print('密码错误!')
                  numbers=input('请重新输入密码:')
                  result=hashlib.md5(numbers.encode('utf-8'))
                  hashed_password=result.hexdigest()
                break
            print('该用户名不存在。')
            names=input('请重新输入用户名:')
    elif commend=='3':
      break

爱吃菠萝包 发表于 2025-5-8 21:39:04

jackz007 发表于 2025-5-7 22:25
没看懂,什么叫指令发生了改变,你举例说明一下呢。

哥,我跟你说一下哈,你的密码错误,就直接跳到请输入指令了(这运用到实际中也不适用嘛),我要实现密码错误,然后给一个语句说:请重新输入密码,就是names=input('请重新输入密码’),然后对密码进行验证

爱吃菠萝包 发表于 2025-5-8 22:16:04

player-none 发表于 2025-5-7 23:18
求最佳

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


大佬,牛啊,但是我想问一下原理,能细讲一下吗?这个把else去掉我没看懂这部分

jackz007 发表于 2025-5-8 22:18:09

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

      现在再试试呢?
import hashlib

register = dict()
while True:
    command = '1' if not register else input('请输入指令:')
    if command == '1' :
      name = input('【注册】-> 请输入用户名:')
      if name in register . keys() :
            print('【错误】* 用户已存在 *')
            print('请重新输入!\n')
      else:
            number = input('【注册】-> 请输入密码:')
            result = hashlib . md5(number.encode('utf-8'))
            hashed_password = result . hexdigest()
            register = hashed_password
            print('恭喜,注册成功~\n')
    elif command == '2':
      f = True
      while f :
            names = input('【登录】-> 请输入用户名:')
            if names in register . keys() :
                while f :
                  numbers=input('【登录】-> [%s] 请输入密码:' % names)
                  result = hashlib . md5(numbers . encode('utf-8'))
                  hashed_password = result . hexdigest()
                  if register == hashed_password:
                        print('恭喜,登录成功~\n')
                        f = False
                  else:
                        print('【错误】:* 密码错误 *')
                        print('请重新输入!\n')
            else:
                print('【错误】:* 用户不存在 *\n')
    elif command == '3' :
      break

player-none 发表于 2025-5-8 22:43:33

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

你看:

while (blablabla):
    if (blablabla):
      print(1)
      break
    else: # 这个else就没有必要
      print(2)
      continue # 这也没必要


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

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

if (blablabla):
    print(1)
print(2)

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

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

(突然发现这玩意很难表述出来……代码写多了,bug出多了就习惯了)

爱吃菠萝包 发表于 2025-5-8 22:50:10

player-none 发表于 2025-5-8 22:43
你看:




我悟了,有了break,就不会执行到print(2),所以else就多余了,感谢{:5_109:}

player-none 发表于 2025-5-8 22:53:06

jackz007 发表于 2025-5-8 22:18
现在再试试呢?

没必要这样搞吧,本来就是登陆成功break,外面那个 if names in register 块下面刚好也应该break了,可以直接退到最外层
页: [1]
查看完整版本: 来个大佬吧,我的逻辑是不是有问题,怎么改啊?