求助 小甲鱼学python第26讲字典,课后练习最后一题
dict1 = {}def now_user():
name = input("'请输入用户名:")
while True:
if name in dict1:
input('此用户名以被注册,请从新输入:')
continue
else:
break
password = input("'请输入密码:")
dict1 = 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:
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的密码输错后,会不断重复您输入的用户不存在,请从新输入:,请问这如何解决。
我是新手,问的比较粗浅,希望大神多多指点,感谢! 问题1的解决方案是将`dict1`声明为全局变量,以便在`now_user()`函数中访问它并进行判断。同时,你需要使用`dict1`来存储密码。修改后的代码如下:
dict1 = {}
def now_user():
global dict1
name = input("请输入用户名:")
while True:
if name in dict1:
name = input('此用户名已被注册,请重新输入:')
continue
else:
break
password = input("请输入密码:")
dict1 = password
print('注册成功,赶紧登录试试吧!')
def new_login():
global dict1
name = input("请输入用户名:")
while True:
if name not in dict1:
name = input('您输入的用户不存在,请重新输入:')
continue
else:
break
login_word = input("请输入密码:")
while True:
if login_word == dict1:
print('欢迎进入系统!')
break
else:
login_word = input('密码不正确,请重新输入密码:')
continue
def system():
print('----新建用户:N/n----\n----登录账号:E/e----\n----退出程序:Q/q----')
while True:
com = input('请输入指令代码:')
if com.lower() == 'n':
now_user()
elif com.lower() == 'e':
new_login()
elif com.lower() == 'q':
print('感谢您的使用,谢谢!')
break
system()
问题2的解决方案是在`new_login()`函数中添加一个计数器,在用户输入错误密码时,计数器递增,达到一定次数后提示用户密码错误,并跳出循环。修改后的代码如下:
dict1 = {}
def now_user():
global dict1
name = input("请输入用户名:")
while True:
if name in dict1:
name = input('此用户名已被注册,请重新输入:')
continue
else:
break
password = input("请输入密码:")
dict1 = password
print('注册成功,赶紧登录试试吧!')
def new_login():
global dict1
name = input("请输入用户名:")
while True:
if name not in dict1:
name = input('您输入的用户不存在,请重新输入:')
continue
else:
break
login_word = input("请输入密码:")
count = 0
while True:
if login_word == dict1:
print('欢迎进入系统!')
break
else:
count += 1
if count >= 3:
print('密码错误次数过多,登录失败!')
break
else:
login_word = input('密码不正确,请重新输入密码:')
def system():
print('----新建用户:N/n----\n----登录账号:E/e----\n----退出程序:Q/q----')
while True:
com = input('请输入指令代码:')
if com.lower() == 'n':
now_user()
elif com.lower() == 'e':
new_login()
elif com.lower() == 'q':
print('感谢您的使用,谢谢!')
break
system()
希望这可以帮助到你!有任何问题请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 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 = 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() 15779327169 发表于 2024-04-05 23:28
请问,为什么小甲鱼的答案中没有将user_data = {}设置 ...
小甲鱼的答案中没有将`user_data`设置为全局变量是因为在函数内部对`user_data`进行了赋值操作,这会创建一个新的局部变量,而不是访问外部的全局变量。
你可以使用`global`关键字将`user_data`声明为全局变量,这样就能在函数内部对其进行修改和访问。修改后的代码如下:
user_data = {}
def new_user():
global user_data
prompt = '请输入用户名:'
while True:
name = input(prompt)
if name in user_data:
prompt = '此用户名已经被使用,请重新输入:'
continue
else:
break
passwd = input('请输入密码:')
user_data = passwd
print('注册成功,赶紧试试登录吧!^_^')
def old_user():
global user_data
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()
现在,代码中的`user_data`变量就是一个全局变量,可以在多个函数中共享,并且在`new_user()`函数中将用户名和密码添加到`user_data`字典中。这样,无论是注册新用户还是登录现有用户,都能正确地访问和修改`user_data`字典。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 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 = password
有所不同,为什么给出的结果完全不一样
while Ture里和continue的结合,为何第二个代码才能生效,求教 15779327169 发表于 2024-04-05 23:45
def now_user():
name = input("请输入用户名:" ...
第一个代码片段中的问题在于,当用户名已经存在时,你将错误信息赋值给了`name`变量,而没有重新接收用户输入的用户名。这导致在下一次循环中,无论用户输入什么内容,`name`的值始终是错误信息,而不会再次进入输入用户名的逻辑。因此,无论输入什么用户名,都会陷入无限循环。
第二个代码片段中使用了一个额外的变量`xx`来接收用户输入的用户名,并且将错误信息赋值给了`name`变量。由于`xx`和`name`是不同的变量,所以当用户输入正确的用户名时,`name`不会受到影响,循环可以正常退出。
总结起来,第二个代码片段更正确,因为它避免了将错误信息赋值给控制循环的变量。这样,在错误情况下也能正确地重新接收用户输入的用户名。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 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”变量是不能起到影响的,是这个意思吗? 15779327169 发表于 2024-04-05 23:57
是不是可以这样理解,while True循环中嵌套continue时 ...
是的,你理解得很对!在第一段代码中,`name`变量在循环外部被赋值后,循环内部的`name`变量不会受到外部变量的影响。这是因为在每次循环开始时,`name`会重新从用户输入中获取新的值,而不是使用之前外部变量的值。因此,无论外部的`name`变量怎么改变,对循环内部来说都没有影响。为了解决这个问题,我们需要使用一个额外的变量(如上述代码中的`xx`)来接收用户输入,并用这个变量进行判断和操作。这样,每次循环都可以重新获取用户输入的最新值。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-5 23:57
是的,你理解得很对!在第一段代码中,`name`变量在循环外部被赋值后,循环内部的`name`变量不会受到外 ...
感谢!,大师我悟了 15779327169 发表于 2024-04-05 23:58
感谢!,大师我悟了
不客气!很高兴能帮到你,你的进步莫过于你自己的领悟。继续努力学习,你一定可以成为更好的程序员!如果有任何其他问题,随时都可以向我提问。祝你编程之路顺利!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]