不知道大家在网上注册账户的时候有没有发现,一般来说你去一个网站上注册一个账号,网站不会随随便便就让你填一串数字就完事,往往为了安全为由要你填一大串包含各种东西的密码。
虽然这有点反人类,但这可以用Python实现
找了个例题
编写一个程序,该程序能实现:
设置用户名和n位的密码(其中n≥8),并且要求密码为长度至少8位的字母和数字构成的不能存在重复字符,否则会要求重新设置,直到设置成功
设计思路1
使用“input”,将用户输入的用户名与密码赋值给一个变量
2
While True死循环,直到密码满足条件后使用”break“退出
3
最关键的部分,判断是否符合题目要求的三个条件
密码长度≥8
数字和字母构成,即不能只包含数字或字母
不能存在重复字符
有了思路,就可以开始上手试试
0 1输入部分
这里用两个变量来储存用户输入的内容,分别为”name“”password“
使用”input“记录用户的输入,使用”str“转换为字符串并最终赋值给前面的变量
name=str(input('请输入用户名:'))password=str(input('请输入密码(应为长度至少8位数的字母和数字构成,且不能出现重复字符)'))
0 2循环部分
为了使用户在输入不合规密码时重新让用户再次输入,所以我们需要一个循环
这里解释下为什么选择while而不用for,因为我们没办法确定用户输入密码的次数,所以,使用while会更加方便
由于我们需要用户输入有误时重新输入,所以我们要将输入密码的部分放到循环内
我们这里用的while True:由于while的特性,这段程序将是一个死循环,所以我们要在合适的位置加上一个”break“来退出循环
name=str(input('请输入用户名:'))while True:password=str(input('请输入密码(应为长度至少8位数的字母和数字构成,且不能出现重复字符)'))#输入密码部分放在循环内#此处省略判断条件 break #条件合适后再执行这行代码
0 3判断密码长度
字符串有一个内建函数“len()”,这个内建函数可以输出指定字符串的长度,
if len(password)<8: print('您设置的密码位数不足8为,请重新设置!!!')
04判断密码是否仅为字母或数字构成
首先,先来介绍两个方法,“isalpha”和“isdigit”
“isalpha”,这个方法可以用来判断字符串是否只包含字母,要是只包含字母,则返回“True”,反之则是“False”
使用方法:
str.isalpha()
“isalpha”,这个方法和前者很像,可以用来判断字符串是否只包含数字,要是只包含数字,则返回“True”,反之则是“False”
使用方法:
str.isdigit()
所以,我们可以利用这两个方法,做出判断字符串是否只包含字母或数字
if password.isalpha() or password.isdigit(): print('您设置的密码不能仅仅包含数字或字母,请重新设置!!!')
0 5是否含有重复的字符
这个不太好理解,我先解释下
例如“abca123456”
这里包含了两个“a”,所以存在重复的字符
我的思路是这样的,首先使用for循环,逐个判断每个字符在字符串中含有几个,至于如何判断,可以使用“count()”函数解决
for i in range(0,len(password)): if password.count(password[i])>1: j=1 #一个临时变量,当某一个字符在字符串中存在一个以上,则给临时变量赋值为1,这个临时变量是为了后面做准备
这里注意一个问题,我们这里使用了一个临时变量,要是我们第一次密码存在重复,但因为循环,会要求用户再次输入密码,这时候即使不存在重复,临时变量依旧为1,所以程序就会出现一个永远都判断你的密码存在重复字符的bug,这个时候我们就需要在合适的地方初始化这个变量,例如:
while True: cf=0
最后使用if语句判断这个临时变量是不是1,要是1则代表该字符串出现了重复的字符
if j==1: #注意两个等号 print('您设置的密码出现了重复的字符,请重新设置!!!')
06符合要求,退出循环
要是密码是满足条件的,则我们还要提示用户并退出循环
在Python循环语句中,我们可以用“break”终止循环
if not (len(password)<8 or (password.isalpha() or password.isdigit()) or cf==1): #不满足前面的条件,这行代码请根据实际情况修改,例如前面的“if”语句是嵌套的形式,可以用“else” print('密码设置成功!!!') break
自此,我们的程序基本上已经完成,只需简单的调试和修饰即可
以下是完成后的代码,我建议看到这可以尝试自己先动手试试,先不直接看成品
在下面
name=str(input('请输入用户名:'))print('你好 %s ,首次使用请设置密码!!!'%name)while True: cf=0 print('='*70)#来个分割线,防止多次运行时一堆字堆一起看不清 password=str(input('请输入密码(应为长度至少8位数的字母和数字构成,且不能出现重复字符)')) if len(password)<8: print('▶您设置的密码位数不足8位,请重新设置!!!') if password.isalpha() or password.isdigit(): print('▶您设置的密码不能仅仅包含数字或字母,请重新设置!!!') for i in range(0,len(password)): if password.count(password[i])>1: cf=1 if cf==1: print('▶您设置的密码出现了重复的字符,请重新设置!!!') if not (len(password)<8 or (password.isalpha() or password.isdigit()) or cf==1): print('密码设置成功!!!') break """解释下为什么我不用多个嵌套的if,因为当我们密码有多个不合规点时,应该一口气告诉用户,不然用户可能会出现多次密码不合规反复输入,我感觉这样的交互就很不友好虽然这样做代码执行的效率不高"""