常用模塊:
- 須知:import 模塊名 導入模塊
random模塊:
-
''' random.random() # 獲取[0.0,1.0)範圍內的一個浮點數 random.randint(a, b) # 獲取這個[a,b]區間範圍內的一個整數 random.uniform(a, b) # 獲取[a,b]區間範圍內的浮點數 random.shuffle(x) # 把 參數指定的數據中的元素 打亂,參數必須是一個可變的數據類型 random.sample(x,k) # 從x中隨機抽取k個數據,組成一個列表返回 ''‘
-
練習
-
把參數指定的數據中的元素 打亂 參數必須時一個可變的數據類型
-
可變(不可哈希)的數據類型:list dict set -------修改後,原對象發生變化
不可變(可哈希)的數據類型: str bool int tuple(元組) -----修改原對象,不會對原對象產生任何改變
-
-
lst = list(range(10)) # ---[0,1,2,3,4,5,6,7,8,9]
random.shuffle(lst)
print(lst)+ 從x中隨機抽取k個數據,組成一個列表返回 + ```python x = (1, 2, 3) # 通過sample變相打亂 l = random.sample(x, len(x)) print(l)
-
time模塊:
-
封裝了獲取時間戳和字符串形式的時間的一些方法
- 1.獲取 時間戳
- 時間戳:從時間元年(1970.1.1 00:00:00)到現在經過的秒數
print(time.time()) # 1581688611.4762974
-
2.獲取格式化時間對象:九個字段組成
-
默認參數是當前系統的時間戳
-
print(time.gmtime()) # GMT: # time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=13, tm_min=56, tm_sec=51, tm_wday=4, tm_yday=45, tm_isdst=0) print(time.localtime()) # 當地時間 # time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=21, tm_min=56, tm_sec=51, tm_wday=4, tm_yday=45, tm_isdst=0)
-
-
3.時間元年過一秒後對應的時間對象
-
print(time.gmtime(1)) # time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=1, tm_wday=3, tm_yday=1, tm_isdst=0)
-
-
4.格式化時間對象和字符串之間的轉換
-
將時間對象轉換成時間字符串
-
s = time.strftime("%Y %m %d %H:%M:%S") # 年月日 時 分 秒 print(s) # 2020 02 14 21:56:51
-
-
5.把時間字符串轉換成時間對象
-
time_obj = time.strptime('2010 10 10', '%Y %m %d') print(time_obj) # time.struct_time(tm_year=2010, tm_mon=10, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=283, tm_isdst=-1)
-
-
時間對象 —> 時間戳
-
t1 = time.localtime() # 時間對象 t2 = time.mktime(t1) # 獲取對應的時間戳 print(t2) # 1581689092.0
-
- 1.獲取 時間戳
-
時間對象,時間戳,時間字符串的表示方法 時間對象(結構化時間):time.struct_time(tm_year=2020, tm_mon=1, tm_mday=9, tm_hour=11, tm_min=16, tm_sec=47, tm_wday=3, tm_yday=9, tm_isdst=0) 時間戳:1578568607.0 時間字符串(格式化時間):2020 01 09 19:16:47
-
4.time.sleep(secs) (線程)推遲指定的時間運行。單位爲秒。
-
總結:
- 如有問題,查看上述time模塊
# # 格式化時間 ----> 結構化時間
# ft = time.strftime('%Y/%m/%d %H:%M:%S')
# print(ft) # 2020/02/14 21:49:14
# st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
# print(st) # time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=21, tm_min=49, tm_sec=14, tm_wday=4, tm_yday=45, tm_isdst=-1)
# # 結構化時間 ---> 時間戳
# t = time.mktime(st)
# print(t) # 1581688154.0
#
# # 時間戳 ----> 結構化時間
# t = time.time()
# st = time.localtime(t)
# print(st) # time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=21, tm_min=49, tm_sec=14, tm_wday=4, tm_yday=45, tm_isdst=0)
# # 結構化時間 ---> 格式化時間
# ft = time.strftime('%Y/%m/%d %H:%M:%S',st)
# print(ft) # 2020/02/15 21:56:08
序列化模塊
json模塊
-
JavaScript Object Notation:Java腳本對象標記語言-----將大部分數據類型變成字符串,但集合(set)不可以
-
已經成爲一種簡單的數據交換格式
-
不完全的序列化----轉化成 字符串的數據類型
1.json.dumps從內存到內存,在可轉的情況下轉化成字符串類型
- 列表序列化
s = json.dumps([1, 2, 3])
print(type(s)) # <class 'str'> 把指定的對象轉換成json格式的字符串
print(s) # 輸出[1, 2, 3] 實際上'[1, 2, 3]'
- 元組可以json序列化,序列化後變成列表,但數據類型使字符串
s = json.dumps((1,2, 3))
print(s) # [1, 2, 3]---------字符串類型 <class 'str'>
res = json.dumps(10)
print(res) # 10 -----'10' <class 'str'>
- 字典的序列化
res = json.dumps({'name':'Andy', 'age':10})
print(res) # {"name": "Andy", "age": 10} <class 'str'>
- set不能序列化
res = json.dumps(set('abc'))
print(res) # TypeError: Object of type set is not JSON serializable
hashlib模塊
- hashlib模塊-學習:
-
封裝一些用來加密的一些類:
-
md5()----不可逆—王小云測算可逆
-
注意:加密的目的:用於判斷和驗證,而並非解密,
-
特點:
-
1.把一個大的數據,切分成不同快,分別對不同的快進行加密,再彙總的結果,和直接對整體數據加密的結果是一樣的
-
2.單向加密,不可逆,
-
3.原始數據的一點小的變化,將導致結果的非常大的差異,'雪崩’效應
-
-
'''md5加密算法:
給一個數據加密的三大步驟:
1.獲取一個加密對象(md5......)
2.使用update方法進行加密,加密方法可以調用多次
3.通常通過hexdigest獲取加密結果,或digest()方法獲取字節串
'''
# 1.獲取一個加密對象
m = hashlib.md5()
# 2.使用加密對象的update,進行加密
m.update(b'abc') # 字節類型的參數 b''裏面不能加中文
m.update('abc中文'.encode('utf-8'))
# 3.(1)通過hexdigest獲取加密的結果
res = m.hexdigest()
print(res) # 1af98e0571f7a24468a85f91b908d335 ---字符串類型 ---16進制(四個二進制位)
# 3.(2)通過digest()方法加密結果獲取字節串
res = m.digest()
print(res) # b'\x1a\xf9\x8e\x05q\xf7\xa2Dh\xa8_\x91\xb9\x08\xd35'
-
給一個數據加密
- 驗證:用另一個數據加密的結果和第一次加密的結果進行對比
- 如果加密結果一樣,說明原文相同,如果不相同,說明原文不同
-
不同加密算法,加密結果的長度不同
s = hashlib.sha224()
s.update('abc'.encode('utf-8'))
print(s.hexdigest()) # 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
print(len(hashlib.md5().hexdigest())) # 32個十六進制位
print(len(hashlib.sha256().hexdigest())) # 64個十六進制位
- 在創建加密對象時,可以指定參數,成爲salt 通過對原始口令加一個複雜字符串來實現,俗稱“加鹽“
m = hashlib.md5(b'abc')
print(m.hexdigest()) # 900150983cd24fb0d6963f7d28e17f72
#
m = hashlib.md5()
m.update('abc'.encode('utf-8'))
print(m.hexdigest()) # 900150983cd24fb0d6963f7d28e17f72
m = hashlib.md5(b'abc')
m.update('ccc'.encode('utf-8'))
print(m.hexdigest()) # bd1e6dd82ca1e4a0408d653407d13c85
- 把一個大的數據,切分成不同快,分別對不同的快進行加密,再彙總的結果,和直接對整體數據加密的結果是一樣的
m = hashlib.md5()
m.update('abc'.encode('utf-8'))
m.update('def'.encode('utf-8'))
print(m.hexdigest()) # e80b5017098950fc58aad83c8c14978e
m = hashlib.md5()
m.update('abcdef'.encode('utf-8'))
print(m.hexdigest()) # e80b5017098950fc58aad83c8c14978e
- 註冊登錄程序
- 用戶選擇
def get_md5(username, passwd):
# 獲取加密對象
m = hashlib.md5()
# 使用加密對象的update,進行加密
m.update(username.encode('utf-8'))
m.update(passwd.encode('utf-8'))
return m.hexdigest()
def register(username, passwd):
# 獲取返回值
res = get_md5(username, passwd)
# 寫入文件 利用a模式操作文件,那麼它會在文件的最後面追加內容
with open('login', 'a') as f:
f.write(res)
f.write('\n')
def login(username, passwd):
# 獲取當前登錄信息的加密結果
res = get_md5(username, passwd)
# 讀文件,進行對比
with open('login', 'r') as f:
for line in f:
if res == line.strip():
return True
else:
return False
while True:
op = int(input("1.註冊 2. 登錄 3.退出"))
if op == 1:
username = input("輸入用戶名:")
passwd = input("輸入密碼:")
register(username, passwd)
elif op ==2:
username = input("輸入用戶名:")
passwd = input("輸入密碼:")
res = login(username, passwd)
if res:
print('登錄成功')
else:
print('登錄失敗')
elif op == 3:
break