本章通過判斷密碼強(qiáng)弱的6個(gè)案例來進(jìn)行學(xué)習(xí)基礎(chǔ)的Python程序
案例描述
密碼強(qiáng)度:是指一個(gè)密碼對(duì)抗猜測(cè)或時(shí)暴力破解的有效程度;一般是
1.指一個(gè)未授權(quán)的訪問者得到正確密碼的平均嘗試次數(shù)
2.強(qiáng)密碼可以降低安全漏洞的整體風(fēng)險(xiǎn)
3.簡(jiǎn)易版(常用)規(guī)則:(1)密碼長(zhǎng)度至少8位;(2)密碼含有數(shù)字;(3)密碼含有字母
案例分析
根據(jù)以下函數(shù)判斷密碼強(qiáng)度并輸出:
1.設(shè)置一個(gè)變量strength_level用于記錄密碼的強(qiáng)度,初始為0。滿足一個(gè)條件,對(duì)其加1;
2.長(zhǎng)度判斷:使用len()方法;
3.包含數(shù)字判斷:對(duì)密碼字符串遍歷,使用isnumeric()方法;
4.包含字母判斷:對(duì)密碼字符串遍歷,使用isalpha()方法;
5.如果strength_level等于3,密碼強(qiáng)度合格,否則不合格
v1.0
新建一個(gè)簡(jiǎn)單的Python程序,將判斷是否有數(shù)字和字幕的語(yǔ)句分別封裝成2個(gè)函數(shù),調(diào)用函數(shù)時(shí)傳遞密碼,返回結(jié)果,若有則返回True,否則False。
主函數(shù)則實(shí)現(xiàn)用戶輸入密碼,初始化密碼強(qiáng)度,依次判斷長(zhǎng)度、字母、數(shù)字,最后根據(jù)密碼強(qiáng)度stength_level判斷密碼是否合格并輸出結(jié)果。
知識(shí)點(diǎn):
1.Python字符串
(1)str.isnumeric():檢測(cè)字符串是否只由數(shù)字組成
(2)str.isalpha():檢測(cè)字符串是否只由字母組成
(3)str.islower():檢測(cè)字符串中所有的字母是否都為小寫
(4)str.isupper():檢測(cè)字符串中所有的字母是否都為大寫

PS:更多isxxx()方法請(qǐng)參考:https://docs.python.org/3/library/stdtypes.html#string-methods
判斷函數(shù):
def check_num_exist(passwd_input):
"""
檢查字符串是否有數(shù)字,有就返回true
"""
for c in passwd_input:
if c.isnumeric():
return True
return False
def check_letter_exist(passwd_input):
"""
檢查字符串是否有字母,有就返回true
"""
for c in passwd_input:
if c.isalpha():
return True
return False
主體代碼:
def main():
"""
主函數(shù)
"""
# 輸入密碼
passwd_input = input("請(qǐng)輸入密碼:")
# 密碼強(qiáng)度
stength_level = 0
# 判斷密碼長(zhǎng)度
if len(passwd_input) > 8:
stength_level += 1
else:
print("輸入的密碼不夠長(zhǎng)!")
# 判斷密碼是否有數(shù)字,然后操作
if check_num_exist(passwd_input):
stength_level += 1
else:
print("輸入的密碼沒有數(shù)字!")
# 判斷密碼是否有字母,然后操作
if check_letter_exist(passwd_input):
stength_level += 1
else:
print("輸入的密碼沒有字母!")
# 輸出結(jié)果——密碼強(qiáng)度
if stength_level >= 3:
print("恭喜!輸入的密碼合格!")
else:
print("輸入的密碼不合格!")
結(jié)果如圖所示:


v2.0
在v1.0的基礎(chǔ)上,2.0增加功能:限制密碼設(shè)置次數(shù);循環(huán)的終止。當(dāng)用戶在規(guī)定次數(shù)內(nèi)設(shè)置符合要求的密碼,則使用continue語(yǔ)句或者break語(yǔ)句終止循環(huán)。循環(huán)使用while,通過判斷 try_times是否達(dá)到5次來判斷是否繼續(xù),若超過次數(shù)則提示次數(shù)過多。若密碼合格也中斷循環(huán),符合日常使用,中斷使用break。
知識(shí)點(diǎn):
1.循環(huán)的終止:
(1)break語(yǔ)句:終止整個(gè)循環(huán)
(2)continue語(yǔ)句:只終止本次循環(huán),而不終止整個(gè)循環(huán)的執(zhí)行
循環(huán)終止操作示例:

判斷函數(shù):
def check_num_exist(passwd_input):
"""
檢查字符串是否有數(shù)字,有就返回true
"""
has_number = False
for c in passwd_input:
if c.isnumeric():
has_number = True
return has_number
def check_letter_exist(passwd_input):
"""
檢查字符串是否有字母,有就返回true
"""
has_letter = False
for c in passwd_input:
if c.isalpha():
has_letter = True
return has_letter
具體代碼:
def main():
"""
主函數(shù)
"""
# 密碼循環(huán)設(shè)置次數(shù)
try_times = 5
while try_times > 0:
# 輸入密碼
passwd_input = input("請(qǐng)輸入密碼:")
# 密碼強(qiáng)度
stength_level = 0
# 判斷密碼長(zhǎng)度
if len(passwd_input) > 8:
stength_level += 1
else:
print("輸入的密碼要求長(zhǎng)度過8位!")
# 判斷密碼是否有數(shù)字,然后操作
if check_num_exist(passwd_input):
stength_level += 1
else:
print("輸入的密碼要求包含數(shù)字!")
# 判斷密碼是否有字母,然后操作
if check_letter_exist(passwd_input):
stength_level += 1
else:
print("輸入的密碼要求包含字母!")
# 輸出結(jié)果——密碼強(qiáng)度
if stength_level >= 3:
print("恭喜!輸入的密碼合格!")
break
else:
print("輸入的密碼不合格!請(qǐng)重新輸入!")
try_times -= 1
print()
if try_times <= 0:
print("嘗試次數(shù)過多,終止密碼設(shè)置!")
運(yùn)行結(jié)果:
v3.0
在2.0的基礎(chǔ)上,3.0增加功能:保存設(shè)置的密碼及其對(duì)應(yīng)的強(qiáng)度到文件中。文件操作需要先用open()打開,然后寫入模式使用“a”避免覆蓋。每次寫入完成后都用戶close()關(guān)閉。其他細(xì)節(jié)與上一案例一致。
知識(shí)點(diǎn):
1.文件的基礎(chǔ)
(1)文件:存儲(chǔ)在外部介質(zhì)(如:硬盤)上的數(shù)據(jù)或信息的集合
(2)文本文件:一般指只有字符編碼存儲(chǔ)的文件,能夠被最簡(jiǎn)單的文本編輯器直接讀取
(3)編碼:信息從一種形式轉(zhuǎn)換為另一種形式的過程;常用的編碼:ASCII, Unicode, UTF-8…
(4)多行文本,用 \n 表示換行
2.文件的操作
(1)步驟:打開文件 -> 操作文件(讀、寫等)-> 關(guān)閉文件
(2)
- 打開文件:建立文件與程序的關(guān)聯(lián):
? open(filename, mode);filename:文件名(包括路徑);mode: 打開模式 - 操作文件:寫入,讀取,等
? 寫入操作:從計(jì)算機(jī)內(nèi)存向文件寫入數(shù)據(jù)
? write(): 將文本數(shù)據(jù)寫入文件中
? writelines(): 將字符串列表寫入文件中 - 關(guān)閉文件:終止程序與文件的關(guān)聯(lián)
? close()
PS:文件使用完畢后必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間能打開的文件數(shù)量也是有限的。
具體文件操作參考鏈接:https://www.cnblogs.com/xinchrome/p/5011304.html


例子主要代碼如下:
def check_num_exist(passwd_input):
"""
檢查字符串是否有數(shù)字,有就返回true
"""
has_number = False
for c in passwd_input:
if c.isnumeric():
has_number = True
return has_number
def check_letter_exist(passwd_input):
"""
檢查字符串是否有字母,有就返回true
"""
has_letter = False
for c in passwd_input:
if c.isalpha():
has_letter = True
return has_letter
def main():
"""
主函數(shù)
"""
# 密碼循環(huán)設(shè)置次數(shù)
try_times = 5
while try_times > 0:
# 輸入密碼
passwd_input = input("請(qǐng)輸入密碼:")
# 密碼強(qiáng)度
stength_level = 0
# 判斷密碼長(zhǎng)度
if len(passwd_input) > 8:
stength_level += 1
else:
print("輸入的密碼要求長(zhǎng)度過8位!")
# 判斷密碼是否有數(shù)字,然后操作
if check_num_exist(passwd_input):
stength_level += 1
else:
print("輸入的密碼要求包含數(shù)字!")
# 判斷密碼是否有字母,然后操作
if check_letter_exist(passwd_input):
stength_level += 1
else:
print("輸入的密碼要求包含字母!")
f = open("password_v3.0.txt", "a")
f.write("密碼:{},強(qiáng)度:{}\n".format(passwd_input, stength_level))
f.close()
# 輸出結(jié)果——密碼強(qiáng)度
if stength_level >= 3:
print("恭喜!輸入的密碼合格!")
break
else:
print("輸入的密碼不合格!請(qǐng)重新輸入!")
try_times -= 1
print()
if try_times <= 0:
print("嘗試次數(shù)過多,終止密碼設(shè)置!")
代碼部分運(yùn)行結(jié)果:


v4.0
在v3.0的基礎(chǔ)上,4.0增加功能:讀取保存的密碼。文件讀取操作分3種:read()、readline()、readlines(),具體作用如下所示。
知識(shí)點(diǎn):
1.文件的操作
(1)讀取操作:從文件中讀取數(shù)據(jù)到計(jì)算機(jī)內(nèi)存中
(2)read(): 返回值為包含整個(gè)文件內(nèi)容的一個(gè)字符串
(3)readline(): 返回值為文件下一行內(nèi)容的字符串
(4)readlines(): 返回值為整個(gè)文件內(nèi)容的列表,每項(xiàng)是以換行符為結(jié)尾的一行字符串
(5)文件的遍歷

主要代碼:
# 密碼循環(huán)設(shè)置次數(shù)
try_times = 5
while try_times > 0:
# 輸入密碼
passwd_input = input("請(qǐng)輸入密碼:")
# 密碼強(qiáng)度
stength_level = 0
# 判斷密碼長(zhǎng)度
if len(passwd_input) > 8:
stength_level += 1
else:
print("輸入的密碼要求長(zhǎng)度過8位!")
# 判斷密碼是否有數(shù)字,然后操作
if check_num_exist(passwd_input):
stength_level += 1
else:
print("輸入的密碼要求包含數(shù)字!")
# 判斷密碼是否有字母,然后操作
if check_letter_exist(passwd_input):
stength_level += 1
else:
print("輸入的密碼要求包含字母!")
f = open("password_v4.0.txt", "a")
f.write("密碼:{},強(qiáng)度:{}\n".format(passwd_input, stength_level))
f.close()
# 輸出結(jié)果——密碼強(qiáng)度
if stength_level >= 3:
print("恭喜!輸入的密碼合格!")
break
else:
print("輸入的密碼不合格!請(qǐng)重新輸入!")
try_times -= 1
print()
if try_times <= 0:
print("嘗試次數(shù)過多,終止密碼設(shè)置!")
f = open("password_v3.0.txt", "r")
# 1.read()
# content = f.read()
# print(content)
# 2.readline()
# line = f.readline()
# print(line)
# line = f.readline()
# print(line)
# 3.readlines()
lines = f.readlines()
print(lines)
for l in lines:
print(l)
f.close()
執(zhí)行結(jié)果:

v5.0
在v4.0的基礎(chǔ)上,5.0增加功能:將相關(guān)方法封裝成一個(gè)整體:面向?qū)ο缶幊?。因?yàn)镻ython是面向?qū)ο笳Z(yǔ)言,所以可以將密碼操作封裝成一個(gè)工具類,方法包含判斷是否有數(shù)字、字母和輸出密碼強(qiáng)度。主函數(shù)可以直接創(chuàng)建一個(gè)密碼類的對(duì)象,然后進(jìn)行相應(yīng)的處理。
知識(shí)點(diǎn):
1.面向過程vs面向?qū)ο?br>
(1)面向過程(POP):以程序執(zhí)行過程為設(shè)計(jì)流程的編程思想
(2)面向?qū)ο?OOP):以事物為中心的編程思想
(3)現(xiàn)實(shí)世界中的對(duì)象:屬性,行為
? 對(duì)象例子:
? 波斯貓,屬性:品種、顏色、大?。恍袨椋航?、捉老鼠
? 吉普車,屬性:類型、用途;行為:發(fā)動(dòng)、停車
2.類(class):某種類型集合的描述
(1)屬性:類本身的一些特性
(2)方法:類所能實(shí)現(xiàn)的行為
(3)類的定義:
class ClassName
init(self)構(gòu)造函數(shù):初始化對(duì)象的各屬性,可以傳參數(shù)進(jìn)來
self代表類的實(shí)例:屬性和方法的調(diào)用
類的創(chuàng)建示例:

PS:總結(jié):http://www.runoob.com/python/python-object.html
密碼類代碼:
class Password_tool:
def __init__(self, password):
self.password = password
self.stength_level = 0
def check_num_exist(self):
"""
檢查字符串是否有數(shù)字,有就返回true
"""
has_number = False
for c in self.password:
if c.isnumeric():
has_number = True
return has_number
def check_letter_exist(self):
"""
檢查字符串是否有字母,有就返回true
"""
has_letter = False
for c in self.password:
if c.isalpha():
has_letter = True
return has_letter
def passwd_process(self):
# 判斷密碼長(zhǎng)度
if len(self.password) > 8:
self.stength_level += 1
else:
print("輸入的密碼要求長(zhǎng)度過8位!")
# 判斷密碼是否有數(shù)字,然后操作
if self.check_num_exist():
self.stength_level += 1
else:
print("輸入的密碼要求包含數(shù)字!")
# 判斷密碼是否有字母,然后操作
if self.check_letter_exist():
self.stength_level += 1
else:
print("輸入的密碼要求包含字母!")
主函數(shù)代碼
# 密碼循環(huán)設(shè)置次數(shù)
try_times = 5
while try_times > 0:
# 輸入密碼
passwd_input = input("請(qǐng)輸入密碼:")
# 實(shí)例化密碼工具對(duì)象
password_tool = Password_tool(passwd_input)
password_tool.passwd_process()
f = open("password_v5.0.txt", "a")
f.write("密碼:{},強(qiáng)度:{}\n".format(passwd_input, password_tool.stength_level))
f.close()
# 輸出結(jié)果——密碼強(qiáng)度
if password_tool.stength_level >= 3:
print("恭喜!輸入的密碼合格!")
break
else:
print("輸入的密碼不合格!請(qǐng)重新輸入!")
try_times -= 1
print()
if try_times <= 0:
print("嘗試次數(shù)過多,終止密碼設(shè)置!")
f = open("password_v5.0.txt", "r")
# 3.readlines()
lines = f.readlines()
print(lines)
for l in lines:
print(l)
f.close()
執(zhí)行結(jié)果:

v6.0
在v5.0的基礎(chǔ)上,6.0增加功能:將文件操作封裝到一個(gè)類中。這里和密碼類一樣,新建一個(gè)文件操作的類,把讀和寫操作,參數(shù)是文件路徑。
知識(shí)點(diǎn):
1.面向?qū)ο蟮奶攸c(diǎn)
(1)封裝
? 將數(shù)據(jù)及相關(guān)操作打包在一起
? 支持代碼復(fù)用
(2)繼承
? 子類(subclass)借用父類(superclass)的行為
? 避免重復(fù)操作,提升代碼復(fù)用程度
? 定義 class ClassName(SuperClassName)
(3)多態(tài)
? 在不同情況下用一個(gè)函數(shù)名啟用不同方法
? 靈活性
具體示例參考:https://blog.csdn.net/qq_29287973/article/details/77868474
密碼類代碼:
class Password_tool:
def __init__(self, password):
self.password = password
self.stength_level = 0
def check_num_exist(self):
"""
檢查字符串是否有數(shù)字,有就返回true
"""
has_number = False
for c in self.password:
if c.isnumeric():
has_number = True
return has_number
def check_letter_exist(self):
"""
檢查字符串是否有字母,有就返回true
"""
has_letter = False
for c in self.password:
if c.isalpha():
has_letter = True
return has_letter
def passwd_process(self):
# 判斷密碼長(zhǎng)度
if len(self.password) > 8:
self.stength_level += 1
else:
print("輸入的密碼要求長(zhǎng)度過8位!")
# 判斷密碼是否有數(shù)字,然后操作
if self.check_num_exist():
self.stength_level += 1
else:
print("輸入的密碼要求包含數(shù)字!")
# 判斷密碼是否有字母,然后操作
if self.check_letter_exist():
self.stength_level += 1
else:
print("輸入的密碼要求包含字母!")
文件操作類
class File_tool:
"""
文件操作類
"""
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
主要代碼
# 密碼循環(huán)設(shè)置次數(shù)
try_times = 5
filepath = "password_v6.0.txt"
file_tool = File_tool(filepath)
while try_times > 0:
# 輸入密碼
passwd_input = input("請(qǐng)輸入密碼:")
# 實(shí)例化密碼工具對(duì)象
password_tool = Password_tool(passwd_input)
password_tool.passwd_process()
line = "密碼:{},強(qiáng)度:{}\n".format(passwd_input, password_tool.stength_level)
file_tool.write_to_file(line)
# 輸出結(jié)果——密碼強(qiáng)度
if password_tool.stength_level >= 3:
print("恭喜!輸入的密碼合格!")
break
else:
print("輸入的密碼不合格!請(qǐng)重新輸入!")
try_times -= 1
print()
if try_times <= 0:
print("嘗試次數(shù)過多,終止密碼設(shè)置!")
contents = file_tool.read_from_file()
print(contents)
執(zhí)行結(jié)果:

總結(jié)
判斷密碼強(qiáng)弱的6個(gè)例子,知識(shí)點(diǎn)歸納如下:

完整代碼查看碼云