题目要求如下:
尝试编写一个用户登陆程序(这次尝试将该功能封装成函数),程序实现如图:
个人代码如下:
data = {}
def denglu():
print('''\n
|--- 新建用户:N/n ---|
|--- 登陆账号:E/e ---|
|--- 退出程序:Q/q ---|''')
order = input('|--- 请输入指令代码:')
if order == 'n' or order == 'N':
name = input('请输入用户名:')
flag1 = 1 #flag1用以判断输入的用户名是否存在,存在为1,不存在为0
while flag1:
if name in data:
name = input('此用户名已经被使用,请重新输入:')
else:
flag1 = 0
password = input('请输入密码:')
data = [name, password]
print('注册成功,赶紧试试登陆吧^_^')
return denglu()
elif order == 'e' or order == 'E':
name = input('请输入用户名:')
flag2 = 1 #flag2用以判断输入的用户名是否存在,不存在为1,存在为0
while flag2:
if name not in data:
name = input('您输入的用户名不存在,请重新输入:')
else:
flag2 = 0
password = input('请输入密码:')
flag3 = 1
while flag3: #flag3用以判断输入的密码是否存在,不存在为1,存在为0
if password != data[name]:
password = input('密码错误,请重新输入:')
else:
flag3 = 0
print('欢迎进入xxoo系统,请点右上角的x结束程序')
else:
print('欢迎使用XXX登陆程序!')
denglu()
运行程序,当输入指令为n(N)或者e(E),输入用户名之后,报错,提示为:
UnboundLocalError: local variable 'data' referenced before assignment
但是data字典是我在函数外面定义的全局变量,所以不太理解哪里有问题,希望有经验的小伙伴指出问题所在,感激不尽!!!!!!
因为你要修改全局变量,你需要在修改前的地方global data申明一下它是全局空间变量,不然就会被认为本地变量找不到定义。
谢谢大神的解答,按照你的建议修改后,程序可以正常运行,但是还是存在两个问题:
1.在函数denglu()中,先声明了全局变量data(global data)之后,运行程序
当注册的用户数n大于1个时,程序无法找到前n-1个数据,只能找到第n个账号的信息,关于这个问题,自己不太能想明白,如下所示(不能上传图片,
就直接复制运行结果过来了):
当n=1时,结果如下:
|--- 新建用户:N/n ---|
|--- 登陆账号:E/e ---|
|--- 退出程序:Q/q ---|
|--- 请输入指令代码:n
请输入用户名:测试
请输入密码:123
注册成功,赶紧试试登陆吧^_^
|--- 新建用户:N/n ---|
|--- 登陆账号:E/e ---|
|--- 退出程序:Q/q ---|
|--- 请输入指令代码:E
请输入用户名:测试
请输入密码:123
欢迎进入xxoo系统,请点右上角的x结束程序
当N大于1时,结果如下:
|--- 新建用户:N/n ---|
|--- 登陆账号:E/e ---|
|--- 退出程序:Q/q ---|
|--- 请输入指令代码:n
请输入用户名:测试
请输入密码:123
注册成功,赶紧试试登陆吧^_^
|--- 新建用户:N/n ---|
|--- 登陆账号:E/e ---|
|--- 退出程序:Q/q ---|
|--- 请输入指令代码:N
请输入用户名:测试1
请输入密码:123
注册成功,赶紧试试登陆吧^_^
|--- 新建用户:N/n ---|
|--- 登陆账号:E/e ---|
|--- 退出程序:Q/q ---|
|--- 请输入指令代码:n
请输入用户名:测试2
请输入密码:123
注册成功,赶紧试试登陆吧^_^
|--- 新建用户:N/n ---|
|--- 登陆账号:E/e ---|
|--- 退出程序:Q/q ---|
|--- 请输入指令代码:E
请输入用户名:测试
您输入的用户名不存在,请重新输入:测试1
您输入的用户名不存在,请重新输入:测试2
请输入密码:123
欢迎进入xxoo系统,请点右上角的x结束程序
2.关于定义全局变量data的问题,data字典是我在函数外部定义的全局变量,在函数中引用的时候,为什么程序会判断data为局部变量并且没有
声明呢?
以上,THANKS。