1.異常
1)異常捕獲
異常 - 程序執(zhí)行過程中出現(xiàn)錯(cuò)誤(報(bào)錯(cuò))
異常捕獲 - 讓程序出現(xiàn)異常的時(shí)候不崩潰,可以接著往后執(zhí)行
什么時(shí)候需要捕獲異常 - 明知道某個(gè)位置程序可能會(huì)出現(xiàn)異常妄均,但是又沒有辦法通過程序來控制的時(shí)候就使用異常捕獲
a.語法一:捕獲所有異常
try:
代碼塊1
except:
代碼塊2
其他語句
說明:
try - 關(guān)鍵字哪自,固定寫法
代碼塊1 - 和try保持一個(gè)縮進(jìn)的一條或者多條語句;需要捕獲異常的語句
except - 關(guān)鍵字壤巷,固定寫法
代碼塊2 - 和except保持一個(gè)縮進(jìn)的一條或者多條語句;出現(xiàn)異常后對(duì)異常進(jìn)行處理的代碼
執(zhí)行過程:先執(zhí)行代碼塊1寄症,如果執(zhí)行代碼塊1的時(shí)候出現(xiàn)異常,程序不崩潰(不報(bào)錯(cuò))释漆,直接執(zhí)行代碼塊2篮迎,執(zhí)行完代碼塊2再執(zhí)行其他語句男图;
如果執(zhí)行代碼塊1沒有出現(xiàn)異常甜橱,就直接執(zhí)行后面的其他語句
# 如果程序出現(xiàn)異常,那么程序就會(huì)直接結(jié)束难裆,不再執(zhí)行后面的語法
# print([1][1]) # IndexError: list index out of range
print('====')
try:
print([1][1])
age = int(input(':'))
print('okk')
except:
print('錯(cuò)了')
print('----')
b.語法二:捕獲指定異常
try:
代碼塊1
except 錯(cuò)誤類型:
代碼塊2
其他語句
執(zhí)行過程:先執(zhí)行代碼塊1譬胎,如果沒有異常,就直接執(zhí)行后面的其他語句偏化;
如果出現(xiàn)異常镐侯,并且異常類型和except后面的異常類型一樣,程序不崩潰韵卤,直接執(zhí)行代碼塊2崇猫,再執(zhí)行后面的語句
如果出現(xiàn)異常,并且異常類型和except后面的異常類型不一樣诅炉,程序直接崩潰
try:
print('1')
print({'name': 'a'}['age'])
print('2')
print([1, 2, 3][10])
except KeyError:
print('鍵錯(cuò)誤')
finally:
print('===')
print('------')
c.語法三涕烧、語法四:同時(shí)捕獲指定的多種異常
try:
代碼塊1
except(異常類型1,異常類型2议纯,...):
代碼塊2
try:
代碼塊1
except 異常類型1:
代碼塊11
except 異常類型2:
代碼塊22
...
d.finally關(guān)鍵字
以上所有的語法結(jié)構(gòu)的最后都可以加一個(gè)finally,加完后不會(huì)影響原結(jié)構(gòu)的功能憨攒。
特點(diǎn):在try后面的代碼塊不管發(fā)生什么情況,finally后面的代碼塊都會(huì)執(zhí)行
try:
print([1, 2, 3][10])
except:
print('error')
finally:
print('hh')
print('end')
2)拋出異常 - 主動(dòng)讓程序崩潰
raise 異常類型
print('=======拋出異常=======')
age = int(input('請(qǐng)輸入年齡:'))
if age < 0 or age > 200:
raise ValueError
2.模塊
1)什么是模塊
python中一個(gè)py文件就是一個(gè)模塊玫坛,模塊名就是py文件的文件名
2)模塊之間的相互引用
怎么在一個(gè)模塊中去使用另一個(gè)模塊的內(nèi)容:導(dǎo)入模塊
1.import 模塊名 - 導(dǎo)入指定的模塊,導(dǎo)入后可以在當(dāng)前模塊中使用指定模塊中所有的全局變量炕吸。
以‘模塊名.變量名’的方式去使用
import test
print(test.a) # 100
test.func1()
print(test.b)
2.from 模塊名 import 變量名1,變量名2树肃,變量名3瀑罗,... - 導(dǎo)入指定的模塊,導(dǎo)入后可以在當(dāng)前模塊中使用指定的全局變量劣像。
變量直接使用摧玫,不用加前綴
from test import func1, b
print(b)
func1()
# print(a) # NameError: name 'a' is not defined
3.from 模塊名 import * - 導(dǎo)入指定的模塊,導(dǎo)入后可以在當(dāng)前模塊中使用指定模塊中所有的全局變量屋群。
變量直接使用坏挠,不用加前綴
from test import *
print(a, b)
func1()
4.import 模塊名 as 新的模塊名 - 導(dǎo)入指定模塊,導(dǎo)入到給模塊重新命名降狠;在當(dāng)前模塊中應(yīng)使用新的模塊名
import test as ts
ts.func1()
5.from 模塊名 import 變量名1 as 新變量名1喊熟,變量名2,變量名3 as 新變量名3芥牌,...
from test import a as t_a, b as t_b, func1 as f
a = 'name'
print(t_a, a, t_b)
f()
3)導(dǎo)入模塊的原理
當(dāng)我們通過import或者from-import去導(dǎo)入一個(gè)模塊的時(shí)候,會(huì)將這個(gè)模塊中的代碼全部執(zhí)行一遍
怎么導(dǎo)入模塊的時(shí)候選擇性的執(zhí)行部分代碼:
代碼段1 - 在被導(dǎo)入的時(shí)候會(huì)被執(zhí)行的代碼
if __name__ == '__main__':
代碼段2 - 在被導(dǎo)入的時(shí)候不會(huì)被執(zhí)行的代碼谬俄,但是在當(dāng)前模塊直接執(zhí)行又會(huì)被執(zhí)行
原理:當(dāng)創(chuàng)建模塊的時(shí)候每個(gè)模塊中都有一個(gè)name屬性,用來保存當(dāng)前模塊的模塊名屎蜓。它的值默認(rèn)就是py文件的文件名钥勋。
當(dāng)直接運(yùn)行這個(gè)模塊的時(shí)候,模塊中的name屬性會(huì)臨時(shí)變成'main'
3.hashlib的使用
1)hashlib
hashlib是python提供用來產(chǎn)生摘要算法的模塊扼劈。摘要算法又叫哈希算法菲驴、離散算法。例如:md5先煎、sha相關(guān)算法巧涧。
1)哈希算法的特點(diǎn):
a.該算法不可逆(根據(jù)摘要(密文)不能獲取/推導(dǎo)出原文)
b.使用相同算法對(duì)相同的數(shù)據(jù)加密后的結(jié)果是一樣的
c.不同長(zhǎng)度的數(shù)據(jù)通過相同的算法加密后的密文的長(zhǎng)度是一樣的
2)怎么生成數(shù)據(jù)對(duì)應(yīng)的摘要(怎么加密)
1.根據(jù)算法創(chuàng)建hash對(duì)象
哈希對(duì)象 = hashlib.算法名()
hash1 = hashlib.md5()
2.對(duì)數(shù)據(jù)進(jìn)行加密
哈希對(duì)象.update(數(shù)據(jù)) - 指定加密數(shù)據(jù),數(shù)據(jù)必須是二進(jìn)制數(shù)據(jù)
hash1.update('123456'.encode())
補(bǔ)充:二進(jìn)制數(shù)據(jù)和字符串的相互轉(zhuǎn)換
二進(jìn)制數(shù)據(jù):bytes
字符串轉(zhuǎn)二進(jìn)制:bytes(字符串良风,encoding='utf-8') / 字符串.encode()
二進(jìn)制轉(zhuǎn)字符串:str(二進(jìn)制闷供,encoding='utf-8') / 二進(jìn)制.decode(encoding='utf-8')
3.獲取摘要(密文)
哈希對(duì)象.hexdigest() - 獲取以16進(jìn)制形式表示的密文(摘要),數(shù)據(jù)類型是字符串
pw = hash1.hexdigest()
print(pw)
4.時(shí)間戳
1)什么是時(shí)間戳
時(shí)間戳指的是一個(gè)時(shí)間到1970年1月1日0點(diǎn)0分0秒之間的時(shí)間差疑俭,用單位秒表示
t1 = time.time()
print(t1) # 1568881812.9372895
# 本地時(shí)間婿失,元組形式
print(time.localtime())
print(time.localtime(time.time()))
# 本地時(shí)間,字符串可讀形式
print(time.asctime(time.localtime(time.time())))
print(time.ctime())
# 本地時(shí)間哩照,接收元組形式懒浮,返回字符串可讀形式
print(time.strftime('%Y-%m-%d %H-%M-%S', time.localtime()))
print(time.strftime('%a %b %d %H:%M:%S %Y', time.localtime()))
# 時(shí)間加減
t1 = time.time()
t2 = t1 + 10
print(time.asctime(time.localtime(t1)))
print(time.ctime(t2))