day13-异常和模块
-
1.异常
程序运行时程序报错,又叫程序出现异常
当执行程序的时候如果出现异常,出现异常的线程直接奔溃,不会执行线程后面的其他代码
-
2.异常捕获
1)语法1:可以捕获任何类型的异常
try: --关键字,固定写法
代码块1 -- 和try保持缩进的一条或多条语句
except: --关键字,固定写法
代码块2 --和try保持缩进的一条或多条语句
其他语句
说明:
代码块1 -- 需要捕获异常的代码
代码块2 -- 异常发生后执行的代码
执行过程:先执行代码块1,如果在执行代码块1的时候出现异常,程序不会崩溃,直接执行代码块2,然后在执行后面的其他语句;如果在执行代码块1的时候没有出现异常,代码块2不会执行,直接执行其他语句。
2)语法2:捕获制定异常
try:
代码块1
except 异常类型:
代码块2
其他语句
执行过程:先执行代码块1,如果出现异常,检查异常类型是否和except后面的异常类型一致,如果一致,程序不崩溃,直接执行代码块2,如果不一致,程序崩溃;
如果执行代码块1的时候没有出现异常,不执行代码块2,直接执行后面的其他语句
3)语法3:同时捕获指定的多种异常
try:
代码块1
except (异常类型1,异常类型2,...):
代码块2
其他语句
4)语法4:同时捕获多个异常
try:
代码块1
except 异常类型1:
代码块11
except 异常类型2:
代码块22
except 异常类型3:
代码块33
...
其他语句
-
3.finally关键字
前面四种捕获异常的结构最后面都可以加一个finally
注意:finally后面的语句一定会执行
比如:
try:
代码块1
except:
代码块2
finally:
代码块3
其他代码
-
4.抛出异常
主动让程序崩溃
语法:
raise 异常类型
说明:异常类型必须是Exception的子类
模块的使用
-
1.什么是模块
python中一个py文件就是一个模块
-
2.怎么在一个模块中使用另一个模块中的内容
如果要在一个模块中使用另一个模块必须先导入模块
1)语法1:
a.import 模块名 - 导入指定模块,导入后可以在当前模块中使用模块中所有的全局变量
以'模块名.全局变量名'的方式去使用
b.from 模块名 import 变量名1,变量名2... -- 只能使用导入的import后面的指定变量
倒入后指定的全局变量可以直接使用,不用在前面加'模块名.'
c.from 模块名 import * -- 导入指定模块,导入后可以在当前模块中使用模块中所有的全局变量
倒入后指定的全局变量可以直接使用,不用在前面加'模块名.'
d.import 模块名 as 新模块名 - 模块名给一个新的名字,代码中使用新名字去使用模块中的功能
e.from 模块名 import 变量名1 as 新变量名1,变量名2,...
-
3.导入模块的原理
当执行导入模块的代码时候,会直接执行被导入的模块中的所有代码
1)重复导入问题
import 在导入模块的时候会自动检查这个模块之前是否已经导入过,来避免一个模块重复导入
2)阻止模块中的内容被其他模块导入
将不需要的其他模块执行的语句写入"if __name__ == '__main__':"对应的语句中
包的使用
-
1.什么是包
一个带有'__init__.py'文件的文件夹就是包
# 1.直接导入包 -- 只执行__init__.py文件
# import animal
# 2.从包中导入指定的模块
# from animal import dog
# 3.从包中的模块导入变量
# from animal.dog import d
系统常用模块
-
1.加密 ----hashlib
hashlib是python3.x中提供的一个hash加密模块;支持目前主流的加密算法:sha256,md5等
hash加密特点:
a.相同的数据采用同一个加密算法,保障加密结果一样
b.通过加密后的数据不能反向获取原数据
c.保证采用同样的加密算法,不管原数据的大小是多少,加密后的数据长度是一样的
-
2.加密步骤;
# 1)根据加密算法创建一个hash对象
pw = input('输入密码:')
# hash = hashlib.md5()
hash = hashlib.sha256()
# 2)对数据进行加密
# hash对象.update(加密数据) -- 加密数据必须是二进制
# 字符串转二进制:1.字符串.encode(encoding='utf-8') 2.bytes(字符串,encoding='utf-8')
hash.update(pw.encode())
# 3.根据hash对象获取加密后的数据(字符串类型)
result = hash.hexdigest()
print(result)
-
2.math模块
# math模块的使用
# 1.ceil(x) -- 取大于等于x的最小整数值,如果x是一个整数,返回x
print(math.ceil(4.3)) # 5
print(math.ceil(-2.1)) # -2
print(math.ceil(3)) # 3
# 2.cos(x) -- 求x的余弦,x必须是弧度
print(math.cos(math.pi/3)) # 0.5000000000000001
# 3.degrees(x) - 将x从弧度转换成角度
print(math.degrees(math.pi/4)) # 45.0
# 4.fabs(x) - 返回x的绝对值
print(math.fabs(-100)) # 100.0
print(math.fabs(120), math.fabs(-0.3)) # 120.0 0.3
# 5.factorial(x) - 返回x的阶乘的值
print(math.factorial(5)) # 120
print(math.factorial(10)) # 3628800
# 6.fsum(iter) - 对迭代器中的每个元素进行求和操作
print(math.fsum((1, 2, 3, 5))) # 11.0
print(math.fsum([1, 2, 3, 6, 5, 4])) # 21.0
# 7.gcd(x, y) - 返回x和y的最大公约数
print(math.gcd(10, 9)) # 1
print(math.gcd(8, 6)) # 2
# 9.pow(x, y) - 返回x的y次方 (x**y)
print(math.pow(10, 3)) # 1000.0
# 10.sqrt(x) - x的平方根
print(math.sqrt(100)) # 10.0
# 11.trunc(x) - 返回x的整数部分
print(math.trunc(22.315)) # 22
print(math.trunc(-23.012)) # 23
-
3.time模块
# 1.time.localtime() - 将一个时间戳转换成当前时区的时间
print(time.localtime()) # time.struct_time(tm_year=2019, tm_mon=8, tm_mday=7, tm_hour=20, tm_min=34, tm_sec=3, tm_wday=2, tm_yday=219, tm_isdst=0)
# 2.time.gmtime() - 和time.locatime()效果一样
print(time.gmtime())
# 3.time.time() -- 返回当前时间的时间戳
print(time.time()) # 1565181463.7705276
# 4.time.sleep() - 线程推迟指定时间运行,单位为秒
for x in range(6):
print(x)
time.sleep(1)
# 5.time.clock() -- 第一次调用,返回的是进程运行的实际时间。
# 而第二次之后的调用是自第一次调用以后到现在的运行时间。
print('时间1:%s' % time.clock())
time.sleep(2)
print('时间2:%s' % time.clock())
time.sleep(2)
print('时间3:%s' % time.clock())
# 6.time.clime() - 把一个时间戳转换成形式:'Sun Jun 20 23:21:05 1993'。
print(time.ctime(time.time())) # Wed Aug 7 20:50:17 2019