案例六 判断密码强弱
功能1.0 基础判断
识别密码是否满足:
- 8位
- 有数字
- 有字母
def check_num1(strings):
for x in strings:
if x.isnumeric():
return True
return False
def check_letter1(strings):
for x in strings:
if x.isalpha():
return True
return False
def check_passwords1():
passwords = input('请输入密码:')
strength_level = 0
#规则1
if len(passwords) >= 8:
strength_level += 1
else:
print('密码至少8位!')
#规则2
if check_num1(passwords):
strength_level += 1
else:
print('密码至少包含一位数字!')
#规则3
if check_letter1(passwords):
strength_level += 1
else:
print('密码至少包含一位字母!')
if strength_level == 3:
print('恭喜!密码强度合格!')
else:
print('对不起,您的密码强度过低,请再次输入!')
check_passwords1()
请输入密码:1234
密码至少8位!
密码至少包含一位字母!
对不起,您的密码强度过低,请再次输入!
功能2.0 限制输入次数
限制输入次数,并且提前终止
- break
- continue
for i in range(10):
if i % 2 == 0:
break
print('如果是break,输出为:',i)
#break终止整个循环,i第一个就是0,所以不打印直接终止整个循环,输出为空
for i in range(10):
if i % 2 == 0:
continue
print('如果是continue,输出为:',i)
#bcontinue终止当前循环,i如果是偶数,就结束这个循环,继续下一个循环,下一个循环i是奇数,所以输出i
如果是continue,输出为: 1
如果是continue,输出为: 3
如果是continue,输出为: 5
如果是continue,输出为: 7
如果是continue,输出为: 9
def check_num2(strings):
has_number = False
for x in strings:
if x.isnumeric():
has_number = True
break
return has_number
def check_letter2(strings):
has_letter = False
for x in strings:
if x.isalpha():
has_letter = True
break
return has_letter
↑更改判断循环的输出结构,并且添加密码输入次数限制2次↓
- 自己写的
def check_passwords2():
passwords = input('请输入密码:')
n = 1
while n <=3:
strength_level = 0
#规则1
if len(passwords) >= 8:
strength_level += 1
else:
print('密码至少8位!')
#规则2
if check_num2(passwords):
strength_level += 1
else:
print('密码至少包含一位数字!')
#规则3
if check_letter2(passwords):
strength_level += 1
else:
print('密码至少包含一位字母!')
if strength_level == 3:
print('恭喜!密码强度合格!')
break
else:
print('对不起您,的密码强度太低!')
print('**************************************')
n += 1
if n <= 2:
passwords = input('请再次输入:')
if n >= 3:
print('您的输入次数已达上限,请稍后再试!')
- 老师写的(限制5次输入)
def check_passwords3():
times = 5
while times > 0:
passwords = input('请输入密码:')
strength_level = 0
#规则1
if len(passwords) >= 8:
strength_level += 1
else:
print('密码至少8位!')
#规则2
if check_num2(passwords):
strength_level += 1
else:
print('密码至少包含一位数字!')
#规则3
if check_letter2(passwords):
strength_level += 1
else:
print('密码至少包含一位字母!')
if strength_level == 3:
print('恭喜!密码强度合格!')
break
else:
print('对不起您,的密码强度太低!')
print('**************************************')
times -= 1
if times <= 0:
print('您的输入次数已达上限,请稍后再试!')
check_passwords3()
请输入密码:1234
密码至少8位!
密码至少包含一位字母!
对不起您,的密码强度太低!
**************************************
请输入密码:abcd
密码至少8位!
密码至少包含一位数字!
对不起您,的密码强度太低!
**************************************
请输入密码:1234abc
密码至少8位!
对不起您,的密码强度太低!
**************************************
请输入密码:12341234
密码至少包含一位字母!
对不起您,的密码强度太低!
**************************************
请输入密码:acdvfghjk
密码至少包含一位数字!
对不起您,的密码强度太低!
**************************************
您的输入次数已达上限,请稍后再试!
功能3.0 保存密码及强度
def check_passwords4():
times = 5
while times > 0:
passwords = input('请输入密码:')
strength_level = 0
#规则1
if len(passwords) >= 8:
strength_level += 1
else:
print('密码至少8位!')
#规则2
if check_num2(passwords):
strength_level += 1
else:
print('密码至少包含一位数字!')
#规则3
if check_letter2(passwords):
strength_level += 1
else:
print('密码至少包含一位字母!')
#文件操作,在之前文件的基础上续写,如果没有该文件则直接创建新文件
f = open('passwords.txt','a')
f.write('密码:{},强度:{}\n'.format(passwords,strength_level))
f.close()
if strength_level == 3:
print('恭喜!密码强度合格!')
break
else:
print('对不起您,的密码强度太低!')
print('**************************************')
times -= 1
if times <= 0:
print('您的输入次数已达上限,请稍后再试!')
check_passwords4()
请输入密码:12345ghjk
恭喜!密码强度合格!
功能4.0 文件读取
文件读取有几种方式:
- read 读取全部内容为一个字符串
- readline 按行读取,每次读取一行,返回下一行内容的字符串
- readlines 按行读取,一次读取所有行为一个列表,每一个元素是以换行符为结尾的一个字符串
遍历文件的方式:首先是f = open(‘filename’,‘r’)
- for line in f.readlines():
- for line in f:
还是习惯用pandas的读取存储。。。
功能5.0 判断函数的封装
面向对象(OPP,Object Oriented Programming)编程。
- 类的概念——对象的集合称为类(class)
- 类的属性——类本身的一些特征
- 类的方法——类所能实现的行为
- 类的定义
class ClassName
init(self)构造函数:初始化类的属性
self代表类的实例
类的定义
本例中,是将密码判断的一系列函数都作为对象来处理的,这些函数抽象为一种处理工具,工具自身有两个属性,分别是密码和密码强度,其中密码需要输入实参,所以在初始化时,需要设定一个输入参数密码password,并且给密码强度一个初始值。
类里函数的定义:func(self,agrs)。如果函数内部需要的参数是类的属性值,则直接调用class.attr,不用在定义时写形参。
class PasswordTool:
'''
密码工具类
'''
#初始化
def __init__(self,password):
#类的属性
self.password = password
self.strength_level = 0
#类的方法
def process_password(self):
#规则1
if len(self.password) >= 8:
self.strength_level += 1
else:
print('密码至少8位!')
#规则2
if self.check_num3():
self.strength_level += 1
else:
print('密码至少包含一位数字!')
#规则3
if self.check_letter3():
self.strength_level += 1
else:
print('密码至少包含一位字母!')
def check_num3(self):
has_number = False
for x in self.password:
if x.isnumeric():
has_number = True
break
return has_number
def check_letter3(self):
has_letter = False
for x in self.password:
if x.isalpha():
has_letter = True
break
return has_letter
类的调用
直接将类赋值给一个变量a,则其内部所有的函数func和变量arg都可以直接用a.func和a.arg来调用。
def check_passwords5():
times = 5
while times > 0:
password = input('请输入密码:')
#实例化密码工具对象
password_tool = PasswordTool(password)
password_tool.process_password()
#文件操作,在之前文件的基础上续写,如果没有该文件则直接创建新文件
f = open('passwords.txt','a')
f.write('密码:{},强度:{}\n'.format(password,password_tool.strength_level))
f.close()
if password_tool.strength_level == 3:
print('恭喜!密码强度合格!')
break
else:
print('对不起您,的密码强度太低!')
print('**************************************')
times -= 1
if times <= 0:
print('您的输入次数已达上限,请稍后再试!')
check_passwords5()
请输入密码:123456
密码至少8位!
密码至少包含一位字母!
对不起您,的密码强度太低!
**************************************
请输入密码:abcd
密码至少8位!
密码至少包含一位数字!
对不起您,的密码强度太低!
**************************************
请输入密码:1234abcd
恭喜!密码强度合格!
功能6.0 文件函数的封装
类的定义
本例中,是将文件读取和写入函数作为对象来处理的,这些函数抽象为一种处理工具,工具自身有一个属性,就是文件路径,它需要输入实参,所以在初始化时,需要设定一个输入参数文件路径filepath。
class FileTool:
'''
文件工具类
'''
#初始化
def __init__(self,filepath):
#类的属性
self.filepath = filepath
#类的方法
def write_to_file(self,line):
f = open(self.filepath,'a')
f.write(line)
f.close()
def read_from_file(self):
f = open(self.filepath,'r')
lines = f.readlines()
f.close()
return lines
类的调用
def check_passwords6():
times = 5
filepath = 'passwords_6.txt'
file_tool = FileTool(filepath)
while times > 0:
password = input('请输入密码:')
#实例化密码工具对象
password_tool = PasswordTool(password)
password_tool.process_password()
#实例化文件工具对象
#写操作
line = '密码:{},强度:{}\n'.format(password,password_tool.strength_level)
file_tool.write_to_file(line)
if password_tool.strength_level == 3:
print('恭喜!密码强度合格!')
break
else:
print('对不起您,的密码强度太低!')
print('**************************************')
times -= 1
if times <= 0:
print('您的输入次数已达上限,请稍后再试!')
#读操作
lines = file_tool.read_from_file()
for line in lines:
print(line)
check_passwords6()
请输入密码:1234
密码至少8位!
密码至少包含一位字母!
对不起您,的密码强度太低!
**************************************
请输入密码:abcd
密码至少8位!
密码至少包含一位数字!
对不起您,的密码强度太低!
**************************************
请输入密码:1234abcd
恭喜!密码强度合格!
密码:1234,强度:1
密码:abcd,强度:1
密码:1234abcd,强度:3
课后思考
- 同时必须包含大小写
- 必须包含特殊符号,如:+、-、* 等
思考1很简单,只需要再写两个判断函数借助于is.upper和is.lower来判断即可。
思考2判断方法如下,求出字符串中特殊符号的个数,然后再判断是否为0,进而输出布尔值。就不写函数了。(这种方法不支持\符号的使用)
#定义一个判断是否含有特殊符号的函数
def check_special():
password = input('请输入密码:')
special_list = r'''
'";:[]{}.,><+-!@#$%^&*()=_\|/?~`
'''
has_special = False
for i in password:
if i in special_list:
has_special = True
return has_special