Python学习笔记——循环控制练习
设定一个小目标
利用条件判断和循环控制语句编写一段模拟登陆交互功能
- 提示输入用户名,能自行检验用户名,用户名错误则循环检验,直到正确
- 用户名检验正确后,提示输入密码,能自行检验密码
- 密码检验正确,提示登陆成功,则程序执行结束
- 密码检验错误,则循环检验,连续n次检验错误,则需重新输入用户名
- 重复上述流程,直到用户名和密码都校验通过,则程序执行结束
流程图逻辑分析
(不太熟悉CSDN提供的流程图脚本,流程图显示有点别扭,欢迎指教)
涉及函数
input()
关于输入互动可以使用input()
e.g.
>>> username = input() # 执行语句后,屏幕等待输入
Lily # 随便输入个名字
>>> username # 输出变量 username 的值
'Lily' # 屏幕输出字符串
小结 可以用于解决用户名、密码的输入问题
print()
屏幕输出括号中的内容
e.g.
>>> username = input() # 执行语句后,屏幕等待输入
Lily # 随便输入个名字
>>> print('Hello ' + username) # 输出指定字符串和变量username的值,注意空格也会被打印到屏幕
Hello Lily # 屏幕输出字符串
if,else,elif 条件判断
基本构型(1)
if 条件成立: # 注意此处有冒号“:”,与其他编程语言不同,另外须注意冒号采用英文格式
执行语句 # 注意缩进(Python的特色)
基本构型(2)
if 条件成立:
执行语句
else: # 注意冒号
执行语句
基本构型(3)
if 条件成立:
执行语句
elif 条件成立: # 增加判定条件
执行语句
else:
执行语句
根据if语句的特点,写一段简单的判断
username = input() # 执行语句后,屏幕等待输入
if username == "Lily":
print('Hello Lily!!')
else:
print('No such username')
# 执行后屏幕等待输入,输入Lily时,输出如下
Hello Lily!! # 屏幕输出字符串
# 执行后屏幕等待输入,输入Mary时,输出如下
No such username # 屏幕输出字符串
while循环 & break中断
上面的练习仅完成了一次判断,没有循环。当输入不是Lily
时,屏幕提示No such username
,然后就结束了。无法重新输入用户名。所以需要引入循环控制,输入错误时可以重新输入,直到输入正确。
while True:
username = input()
if username != "Lily":
print('No such username')
else:
break
print('Welcome Lily')
# 执行后屏幕等待输入,输入Lily时,输出如下
Welcome Lily # 屏幕输出字符串
# 执行后屏幕等待输入,输入其他字符时,输出如下,并重新进入输入状态
No such username # 屏幕输出字符串
代码实现
基本功能
上述函数基本够用,增加对密码的判断,代码就基本成型。
能实现下述功能:
- 能自动验证用户名,用户名错误可重新输入,直到验证正确;
- 用户名正确后,能自动验证密码,错误可重输,直到正确;
代码如下:
while True:
username = input()
if username != "Lily":
print('No such username')
else:
print('Welcome Lily')
print('Please input password')
while True:
password = input()
if password != "123456":
print('Password input again')
else:
print('Access')
break
break
# 执行后效果如下:
mary
No such username
Lily
Welcome Lily
Please input password
123
Password input again
123
Password input again
123456
Access
Process finished with exit code 0
功能完善(增加密码校验次数)
基本思路:
在密码验证的循环,引入次数变量cont
,密码验证错误1次,变量cont
自增或自减1,满足阈值要求时退出密码验证的循环
需要考虑的问题:
- 密码正确时,跳出密码校验循环,再跳出用户名校验循环,程序结束;
- 密码错误,校验超过限定次数时,跳出密码校验循环,但要保持用户名校验循环继续进行
解决思路:
在密码校验正确的分支中个引入1个传递变量run
(建议为布尔型,其他数据类型也可以),初始run = True
放在用户名校验循环外,并将run
加到用户名校验循环的while
判断中
当密码正确时,给run
赋值False
,跳出密码校验循环之后,便会因run
的赋值跳出用户名校验循环
代码简化结构如下:
run = True # 引入传递变量,使密码校验正确后,能连续跳出2个循环
while run: # 通过传递变量,在密码校验正确时,增加1次判断
username = input() # 输入 用户名
if username == "李四": # 分支 用户名正确
print('……') # 用户名校验正确 提示
cont = 3 # 密码校验次数 初始化
while cont != 0: # 设定校验次数阈值,作为退出循环条件
password = input() # 输入 密码
if password == "123456": # 分支 密码正确
print('……') # 密码校验正确 提示
run = False # 改变传递变量赋值,以便控制退出父循环
break # 跳出子循环
else: # 分支 密码错误
print('……') # 密码校验错误 提示
cont = cont - 1 # 密码校验错误,cont减1
else: # 分支 用户名错误
print('……') # 用户名校验错误 提示,不跳出循环,继续执行
最终代码成品
基于上面的分析,最终代码完成效果如下:
print('请输入用户名')
run = True
while run:
print('用户名:', end='')
username = input()
if username == "李云龙":
print('你好,请输入密码!')
print('密码:', end='')
cont = 3
while cont != 0:
password = input()
if password == "123456":
print('密码通过验证,登陆成功!')
run = False
break
elif cont > 1:
print('密码错误!请重新输入。剩余验证次数:' + str(cont - 1) + '次')
print('密码:', end='')
cont = cont - 1
else:
print('密码错误超过3次,请重新输入用户名。')
cont = cont - 1
else:
print('无此用户名,请重新输入!')
运行情况如下:
请输入用户名
用户名:lll
无此用户名,请重新输入!
用户名:李四
你好,请输入密码!
密码:123
密码错误!请重新输入。剩余验证次数:2次
密码:123
密码错误!请重新输入。剩余验证次数:1次
密码:123
密码错误超过3次,请重新输入用户名。
用户名:ll
无此用户名,请重新输入!
用户名:李四
你好,请输入密码!
密码:123
密码错误!请重新输入。剩余验证次数:2次
密码:123456
密码通过验证,登陆成功!
Process finished with exit code 0