- str. isnumeric()
检测字符串是否只由数字组成- str. isalpha()
检测字符串是否只由字母组成- str.islower()
检测字符串中所有的字母是否都为小写- str.isupper()
检测字符串中所有的字母是否都为大写- 更多isxxx()方法请参考:
https://docs.python.org/3/library/stdtypes.html#string-methods
由于isnumeric()判断字符串是否只由数字组成,isalpha()判断字符串是否只由字母组成。考虑使用循环判断每个字符是否为字母或者数字,如果满足则强度加1。
代码实现:
def check_number_exist(password_str):
"""
功能:判断密码中是否包含数字
"""
for x in password_str:
if x.isnumeric():
return True
return False
def check_letter_exist(password_str):
"""
功能:判断密码中是否包含字母
"""
for x in password_str:
if x.isalpha():
return True
return False
def main():
password = input('请输入密码:')
# 密码强度
strength_level = 0
# 规则1:密码长度大于8
if len(password) > 8:
strength_level += 1
else:
print('密码长度大于8位')
# 规则2:密码是否包含字母
if check_number_exist(password):
strength_level += 1
else:
print('密码中必须包含数字!')
# 规则3:密码是否包含字母
if check_letter_exist(password):
strength_level += 1
else:
print('密码中必须包含字母!')
if strength_level == 3:
print('密码强度符合要求!')
else:
print('密码强度不符合要求!')
if __name__ == '__main__':
main()
- break语句
终止整个循环- continue语句
只终止本次循环,而不终止整个循环的执行
代码实现:
def check_number_exist(password_str):
"""
功能:判断密码中是否包含数字
"""
is_number_exist = False
for x in password_str:
if x.isnumeric():
is_number_exist = True
break
return is_number_exist
def check_letter_exist(password_str):
"""
功能:判断密码中是否包含字母
"""
is_letter_exist = False
for x in password_str:
if x.isalpha():
is_letter_exist = True
break
return is_letter_exist
def main():
"""
主函数
"""
try_times = 5
while try_times > 0:
password = input('请输入密码:')
# 密码强度
strength_level = 0
# 规则1:密码长度大于8
if len(password) > 8:
strength_level += 1
else:
print('密码长度大于8位')
# 规则2:密码是否包含字母
if check_number_exist(password):
strength_level += 1
else:
print('密码中必须包含数字!')
# 规则3:密码是否包含字母
if check_letter_exist(password):
strength_level += 1
else:
print('密码中必须包含字母!')
if strength_level == 3:
print('密码强度符合要求!')
break
else:
print('密码强度不符合要求!')
try_times -= 1
print()
if try_times <= 0:
print('***********************************************')
print('尝试次数过多,密码设置失败!')
if __name__ == '__main__':
main()
- 文件:存储在外部介质(如:硬盘)上的数据或信息的集合
- 文本文件:一般指只有字符编码存储的文件,能够被最简单的文本编辑器直接读取
- 编码:信息从一种形式转换为另一种形式的过程
- 常用的编码:ASCII, Unicode, UTF-8…
- 多行文本,用 \n 表示换行
文件的操作
打开文件 -> 操作文件(读、写等)-> 关闭文件
打开模式 | 含义 |
---|---|
r | 只读,文件不存在则报错 |
w | 只写,文件不存在则自动创建 |
a | 在文件末尾附加 |
r+ | 读写 |
密码强度三条规则判断完成后,添加如下代码来实现将密码及强度保存至文件中
代码实现:
# 根据密码强度级别设置强弱,以用户可知的样式显示密码强弱
level = '弱'
if strength_level == 2:
level = '中'
elif strength_level == 3:
level = '强'
# 将密码以及密码强度写入文件
f = open('password_3.0.txt', 'a')
f.write('密码:{},强度:{}\n'.format(password, level))
f.close()
读取操作:从文件中读取数据到计算机内存中
- read(): 返回值为包含整个文件内容的一个字符串
- readline(): 返回值为文件下一行内容的字符串
- readlines(): 返回值为整个文件内容的列表,每项是以换行符为结尾的一行字符串
文件的遍历:
f = open('password_3.0.txt', 'r')
for line in f.readlines():
print(line)
f.close()
或者
f = open('password_3.0.txt', 'r')
for line in f:
print(line)
f.close()
将password的相关属性以及函数封装到password工具类(PasswordTool)中
代码实现:
"""
作者:
功能:判断密码强弱
版本:v4.0
日期:07/01/2019
2.0新增功能:循环的终止;设置循环次数
3.0新增功能:保存设置的密码及其对应的强度到文件中
4.0新增功能:读取文件中的密码
5.0新增功能:定义一个password工具类
"""
class PasswordTool:
"""
密码工具类
"""
def __init__(self, password):
# 类的属性
self.password = password
self.strength_level = 0
self.level = '弱'
def process_password(self):
# 规则1:密码长度大于8
if len(self.password) > 8:
self.strength_level += 1
else:
print('密码长度大于8位')
# 规则2:密码是否包含字母
if self.check_number_exist():
self.strength_level += 1
else:
print('密码中必须包含数字!')
# 规则3:密码是否包含字母
if self.check_letter_exist():
self.strength_level += 1
else:
print('密码中必须包含字母!')
self.get_level_description()
# 类的方法
def check_number_exist(self):
"""
功能:判断密码中是否包含数字
"""
is_number_exist = False
for x in self.password:
if x.isnumeric():
is_number_exist = True
break
return is_number_exist
def check_letter_exist(self):
"""
功能:判断密码中是否包含字母
"""
is_letter_exist = False
for x in self.password:
if x.isalpha():
is_letter_exist = True
break
return is_letter_exist
def get_level_description(self):
"""
根据密码强度级别设置强弱,以用户可知的样式显示密码强弱
"""
if self.strength_level == 2:
self.level = '中'
elif self.strength_level == 3:
self.level = '强'
def main():
"""
主函数
"""
try_times = 5
f = open('password_5.0.txt', 'w')
while try_times > 0:
password = input('请输入密码:')
# 实例化密码工具对象
password_tool = PasswordTool(password)
password_tool.process_password()
# 将密码以及密码强度写入文件
f.write('密码:{},强度:{}\n'.format(password, password_tool.level))
if password_tool.strength_level == 3:
print('密码强度合格!')
break
else:
print('密码强度不符合要求!')
try_times -= 1
print()
f.close()
if try_times <= 0:
print('***********************************************')
print('尝试次数过多,密码设置失败!')
if __name__ == '__main__':
main()
将操作文件的方法封装到文件工具类(FileTool)中
封装和调用代码实现:
class FileTool:
def __init__(self, file_path):
self.file_path = file_path
def write_to_file(self, line):
f = open(self.file_path, 'a')
f.write(line)
f.close()
def read_from_file(self):
f = open(self.file_path, 'r')
lines = f.readlines()
f.close()
return lines
def main():
"""
主函数
"""
try_times = 5
file_path = 'password_6.0.txt'
# 实例化文件工具类
file_tool = FileTool(file_path)
while try_times > 0:
password = input('请输入密码:')
# 实例化密码工具对象
password_tool = PasswordTool(password)
password_tool.process_password()
line = '密码:{},强度:{}\n'.format(password, password_tool.level)
file_tool.write_to_file(line)
if password_tool.strength_level == 3:
print('密码强度合格!')
break
else:
print('密码强度不符合要求!')
try_times -= 1
print()
if try_times <= 0:
print('***********************************************')
print('尝试次数过多,密码设置失败!')
lines = file_tool.read_from_file()
for line in lines:
print(line)
面向对象的特点
- 封装
- 将数据及相关操作打包在一起
- 支持代码复用
- 继承
- 子类(subclass)借用父类(superclass)的行为
- 避免重复操作,提升代码复用程度
- 定义 class ClassName(SuperClassName)
- 多态
- 在不同情况下用一个函数名启用不同方法
- 灵活性