目录
1.异常
当检测到⼀一个错误时,解释器器就⽆无法继续执⾏行行了了,反⽽而出现了了⼀一些错误的提示,这就是所谓的"异常"
1.1异常的写法
try:
#可能发生异常的地方
f = open('test.txt', 'r')
except:
#发生异常怎么处理
f = open('test.txt', 'w')
1.2 捕获多个异常
try:
print(1/0)
except (NameError, ZeroDivisionError):
print('有错误')
1.3 捕获多个异常信息
as result 获取异常类的信息
try:
print(num)
#多个异常
except (NameError, ZeroDivisionError) as result:
print(result)
1.4 捕获所有异常
- Exception是所有程序异常类的父类。
- else 是逻辑正常的时候要执行的顺序
- finally表示的是⽆无论是否异常都要执⾏行行的代码,例例如关闭⽂文件。
try:
print(num)
except Exception as result:
print(result)
finally
f.close()
else:
print('正常执行逻辑')
1.5 自定义异常
class ShortInputError(Exception):
def __init__(self, length, min_len):
self.length = length
self.min_len = min_len
# 设置抛出异常的描述信息
def __str__(self):
return f'你输⼊入的⻓长度是{self.length}, 不能少于{self.min_len}个字符'
def main():
try:
con = input('请输⼊入密码:')
if len(con) < 3:
raise ShortInputError(len(con), 3)
except Exception as result:
print(result)
else:
print('密码已经输⼊入完成')
main()
1.6 异常传递
异常从外层到内层的逻辑执行,也是异常嵌套
待补充
2.模块
模块(Module)是一个python文件
2.1导入模块
import 模块名(文件名)
#调用功能
模块名.功能名()
import math
print(maty.sqrt(10))
# 第二种导入 功能,可以直接使用功能名称
from math import sqrt
print(sqrt(9))
#第三种 from .. import *
from math import *
print( sqrt(9))
2.2定义别名
#import 模块名 as 别名
import math as mm
#使用别名
print(mm(9))
from time import sleep as tt
#睡眠200毫秒
tt(200)
2.3 模块定位顺序
1.当前目录
2.如果不在当前目录,Python去环境变量下搜索
3.如果找不到,在去找默认路径
注意:
自己文件名和已有模块重名,否则导致某些功能不能用。
from 模块 import 功能 导入功能名称相同,会使用最后定义的功能
2.4 all
只导入部分功能
__all__ = ['testA']
def testA():
print('A')
def testB():
print("B")
from All.test_all import *
testA()
testB()
3.包
创建一个文件夹,且包含一个__init__.py文件
- 导入包
第一种:
import 包名.模块名
#调用
包名.模块名.方法()
第二种:
必须在__init__.py 添加__all__=[],控制允许导入的模块列表
#添加允许访问的模块
__all__=['test_AB']
#from package import *
模块名().功能名()
4.多任务
多任务:同一个时间执行多个任务
并发:在一段时间交替去执行任务(单核CPU)
并行:多个内核真正去一起执行任务(多核CPU)
4.1 进程
多进程的使用
import multiprocessing
import time
def dance():
for i in range(10):
print('dance。。。。')
time.sleep(0.2)
def sing():
for i in range(10):
print('sing。。。。')
time.sleep(0.2)
try:
one = multiprocessing.Process(target=dance,name='one')
two = multiprocessing.Process(target=sing,name='two')
one.start()
two.start()
except Exception as ret:
print(ret)
5.深拷贝和浅拷贝
5.1 浅拷贝
- 可变类型:copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象。
- 不可变类型:不可变类型进行浅拷贝不会给拷贝的对象开辟新的内存空间,而只是拷贝了这个对象的引用。
- 总结:可变类型进行浅拷贝只对可变类型的第一层对象进行拷贝,对拷贝的对象会开辟新的内存空间进行存储,子对象不进行拷贝。
import copy
a =[1,2,3,(5,5)]
# 浅拷贝
b = copy.copy(a)
print(id(a))
print(id(b))
#结果
4563044096
4562964224
5.2 深拷贝
deepcopy函数是深拷贝, 只要发现对象有可变类型就会对该对象到最后一个可变类型的每一层对象就行拷贝, 对每一层拷贝的对象都会开辟新的内存空间进行存储。
- 不可变类型进行深拷贝如果子对象没有可变类型则不会进行拷贝,而只是拷贝了这个对象的引用,否则会对该对象到最后一个可变类型的每一层对象就行拷贝, 对每一层拷贝的对象都会开辟新的内存空间进行存储
import copy
a =[1,2,3,(5,5)]
# 深度拷贝
b = copy.deepcopy(a)
print(id(a))
print(id(b))
#运行结果
4523886272
4523806400
5.3 区别
浅拷贝最多拷贝对象的一层
深拷贝可能拷贝对象的多层
5.4 ==和is的区别
- is比较 的是两个实例对象地址,通过id()函数可以获取,是不是相同
- == 比较的是两个实例对象的值是否相等
6.迭代器
迭代是访问集合元素的一种方式
在python的常见数据类型中,str、list、dict、tuple、set等数据类型都是可迭代对象
iter()函数与next()函数
可以使用 isinstance() 判断一个对象是否是 Iterator 对象: