您的位置:首页 > 大数据 > 人工智能

人工智能学习联盟免费课程——案例六:判断密码强弱

2019-03-23 11:16 190 查看

目录

案例六 判断密码强弱

功能1.0 基础判断

识别密码是否满足:

  1. 8位
  2. 有数字
  3. 有字母
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. 同时必须包含大小写
    2. 必须包含特殊符号,如:+、-、* 等

    思考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
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐