鱼C论坛

 找回密码
 立即注册
查看: 1809|回复: 7

[已解决]求助老师们关于 python 第41课函数作业的问题

[复制链接]
发表于 2022-6-13 21:16:40 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 caeser 于 2022-6-13 21:16 编辑

我在做第41课函数作业是,出现一个问题,运行程序时,如果直接选择3退出,程序运行正常,但选择1注册用户成功后,再选择3退出,却变成了要求注册用户,这是怎么一回事啊?求助各位老师!!!


直接退出正常

直接退出正常

注册用户后再选择退出,变成了重新注册

注册用户后再选择退出,变成了重新注册



我的程序代码:

register_dict={'adm':'123'}

print("欢迎来到鱼C论坛")


def get_int(): # 获取用户指令函数
    print("""
==============
1.注册
2.登录
3.退出
             """)
    num = int(input("请输入指令: "))
    while num > 0 :
        if num == 1:
            register()
        elif num == 2:
            login()
        elif num == 3:
            break
   


def login():#登录函数
    pass
   

def register():# 注册函数
   
    name = input("请输入用户名:")
    password = input("请输入密码:")
   
    encrypt(name,password)
   
   

def encrypt(x,y):# 存放用户名和密码函数
    #keys = register_dict.keys()
   
    for each in list(register_dict.keys()):
        if each == x:
            print("用户名已经存在:请重新注册")
            register()
    register_dict[x] = y
   
    print("恭喜,注册成功")
    get_int()

get_int()

最佳答案
2022-6-13 21:38:18
本帖最后由 临时号 于 2022-6-13 21:44 编辑

首先,你输入了1,调用了register()函数
然后在register()函数中,你调用了encrypt函数
在encrypt函数中,你调用了get_int()函数
在get_int()函数中,你输入了3,跳出了循环,get_int()函数结束,你又回到了调用get_int()函数的地方,也就是encrypt函数中
在encrypt函数中,函数结束,你又回到了调用encrypt函数的地方,也就是register()函数
在register()函数中,函数结束,你又回到了第一次调用register()函数的地方,也就是get_int()函数
在get_int()函数中,由于num变量是局部变量,而你第一次调用get_int()函数时,你输入的是1,所以num=1
又因为程序目前在while循环中,num>0,所以程序又进了while循环,因为num=1,所以又调用了register()函数,又开始了注册
解决的方法有两种:
1.声明num变量为全局变量
  1. register_dict={'adm':'123'}

  2. print("欢迎来到鱼C论坛")


  3. def get_int(): # 获取用户指令函数
  4.     print("""
  5. ==============
  6. 1.注册
  7. 2.登录
  8. 3.退出
  9.              """)
  10.     global num
  11.     num = int(input("请输入指令: "))
  12.     while num > 0 :
  13.         if num == 1:
  14.             register()
  15.         elif num == 2:
  16.             login()
  17.         elif num == 3:
  18.             break
  19.    


  20. def login():#登录函数
  21.     pass
  22.    

  23. def register():# 注册函数
  24.    
  25.     name = input("请输入用户名:")
  26.     password = input("请输入密码:")
  27.    
  28.     encrypt(name,password)
  29.    
  30.    

  31. def encrypt(x,y):# 存放用户名和密码函数
  32.     #keys = register_dict.keys()
  33.    
  34.     for each in list(register_dict.keys()):
  35.         if each == x:
  36.             print("用户名已经存在:请重新注册")
  37.             register()
  38.     register_dict[x] = y
  39.    
  40.     print("恭喜,注册成功")
  41.     get_int()

  42. get_int()
复制代码

2.在输入3后不使用break跳出循环,而是使用exit()函数退出程序
  1. register_dict={'adm':'123'}

  2. print("欢迎来到鱼C论坛")


  3. def get_int(): # 获取用户指令函数
  4.     print("""
  5. ==============
  6. 1.注册
  7. 2.登录
  8. 3.退出
  9.              """)
  10.     num = int(input("请输入指令: "))
  11.     while num > 0 :
  12.         if num == 1:
  13.             register()
  14.         elif num == 2:
  15.             login()
  16.         elif num == 3:
  17.             exit()
  18.    


  19. def login():#登录函数
  20.     pass
  21.    

  22. def register():# 注册函数
  23.    
  24.     name = input("请输入用户名:")
  25.     password = input("请输入密码:")
  26.    
  27.     encrypt(name,password)
  28.    
  29.    

  30. def encrypt(x,y):# 存放用户名和密码函数
  31.     #keys = register_dict.keys()
  32.    
  33.     for each in list(register_dict.keys()):
  34.         if each == x:
  35.             print("用户名已经存在:请重新注册")
  36.             register()
  37.     register_dict[x] = y
  38.    
  39.     print("恭喜,注册成功")
  40.     get_int()

  41. get_int()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-13 21:38:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 临时号 于 2022-6-13 21:44 编辑

首先,你输入了1,调用了register()函数
然后在register()函数中,你调用了encrypt函数
在encrypt函数中,你调用了get_int()函数
在get_int()函数中,你输入了3,跳出了循环,get_int()函数结束,你又回到了调用get_int()函数的地方,也就是encrypt函数中
在encrypt函数中,函数结束,你又回到了调用encrypt函数的地方,也就是register()函数
在register()函数中,函数结束,你又回到了第一次调用register()函数的地方,也就是get_int()函数
在get_int()函数中,由于num变量是局部变量,而你第一次调用get_int()函数时,你输入的是1,所以num=1
又因为程序目前在while循环中,num>0,所以程序又进了while循环,因为num=1,所以又调用了register()函数,又开始了注册
解决的方法有两种:
1.声明num变量为全局变量
  1. register_dict={'adm':'123'}

  2. print("欢迎来到鱼C论坛")


  3. def get_int(): # 获取用户指令函数
  4.     print("""
  5. ==============
  6. 1.注册
  7. 2.登录
  8. 3.退出
  9.              """)
  10.     global num
  11.     num = int(input("请输入指令: "))
  12.     while num > 0 :
  13.         if num == 1:
  14.             register()
  15.         elif num == 2:
  16.             login()
  17.         elif num == 3:
  18.             break
  19.    


  20. def login():#登录函数
  21.     pass
  22.    

  23. def register():# 注册函数
  24.    
  25.     name = input("请输入用户名:")
  26.     password = input("请输入密码:")
  27.    
  28.     encrypt(name,password)
  29.    
  30.    

  31. def encrypt(x,y):# 存放用户名和密码函数
  32.     #keys = register_dict.keys()
  33.    
  34.     for each in list(register_dict.keys()):
  35.         if each == x:
  36.             print("用户名已经存在:请重新注册")
  37.             register()
  38.     register_dict[x] = y
  39.    
  40.     print("恭喜,注册成功")
  41.     get_int()

  42. get_int()
复制代码

2.在输入3后不使用break跳出循环,而是使用exit()函数退出程序
  1. register_dict={'adm':'123'}

  2. print("欢迎来到鱼C论坛")


  3. def get_int(): # 获取用户指令函数
  4.     print("""
  5. ==============
  6. 1.注册
  7. 2.登录
  8. 3.退出
  9.              """)
  10.     num = int(input("请输入指令: "))
  11.     while num > 0 :
  12.         if num == 1:
  13.             register()
  14.         elif num == 2:
  15.             login()
  16.         elif num == 3:
  17.             exit()
  18.    


  19. def login():#登录函数
  20.     pass
  21.    

  22. def register():# 注册函数
  23.    
  24.     name = input("请输入用户名:")
  25.     password = input("请输入密码:")
  26.    
  27.     encrypt(name,password)
  28.    
  29.    

  30. def encrypt(x,y):# 存放用户名和密码函数
  31.     #keys = register_dict.keys()
  32.    
  33.     for each in list(register_dict.keys()):
  34.         if each == x:
  35.             print("用户名已经存在:请重新注册")
  36.             register()
  37.     register_dict[x] = y
  38.    
  39.     print("恭喜,注册成功")
  40.     get_int()

  41. get_int()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-6-13 21:45:09 | 显示全部楼层
临时号 发表于 2022-6-13 21:38
首先,你输入了1,调用了register()函数
然后在register()函数中,你调用了encrypt函数
在encrypt函数中,你 ...

请问是如果调用了多个函数,当函数都运行完以后要依次原路返回,可以这么理解吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 21:45:56 | 显示全部楼层
森亦简 发表于 2022-6-13 21:45
请问是如果调用了多个函数,当函数都运行完以后要依次原路返回,可以这么理解吗?


对,要回到调用函数的地方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 21:48:11 | 显示全部楼层
好的,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-13 21:56:08 | 显示全部楼层
老师,再请问下,为什么设置为全局变量后,就退出了呢?按照您说的不是应该又回到了调用get_int()函数的地方了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-13 22:02:22 | 显示全部楼层
caeser 发表于 2022-6-13 21:56
老师,再请问下,为什么设置为全局变量后,就退出了呢?按照您说的不是应该又回到了调用get_int()函数的地 ...

在get_int()函数中,由于num变量是局部变量,而你第一次调用get_int()函数时,你输入的是1,所以num=1

当你将num变量设置为全局变量后,num就不是1了,而是你第二次输入的3,所以num=3,跳出了循环
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-14 09:51:03 | 显示全部楼层
临时号 发表于 2022-6-13 22:02
当你将num变量设置为全局变量后,num就不是1了,而是你第二次输入的3,所以num=3,跳出了循环

哦,明白了,谢谢老师
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 16:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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