一、异常处理
异常有分为语法错误和逻辑错误
1、异常的种类
1.1 常用异常
- AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
- IOError 输入/输出异常;基本上是无法打开文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndentationError 语法错误(的子类) ;代码没有正确对齐
- IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- KeyError 试图访问字典里不存在的键
- KeyboardInterrupt Ctrl+C被按下
- NameError 使用一个还未被赋予对象的变量
- SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
- TypeError 传入对象类型与要求的不符合
- UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
- ValueError 传入一个调用者不期望的值,即使值的类型是正确的
2、异常处理
2.1 之后预防处理
如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理
#基本语法为
try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
# 举例
try:
f = [
'a',
'a',
'a',
'a',
'a',
'a',
'a',
]
g = (line.strip() for line in f)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
except StopIteration:
f.close()
2.2 万能异常处理:Exception
别的基本用不到,Exception是万能的
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
二、数据类型分类
按存值个数区分
存值个数 | 数据类型 |
---|---|
单个值 | 整型、浮点型、字符串 |
多个值 | 列表、字典、元组、集合 |
按可变不可变区分
可变or不可变 | 数据类型 |
---|---|
可变 | 列表、字典、集合 |
不可变 | 整型、浮点型、字符串、元组 |
按有序无序区分
有序or无序 | 数据类型 |
---|---|
有序 | 字符串、列表、元组 |
无序 | 字典、集合 |
按访问类型区分
访问类型 | 数据类型 |
---|---|
直接访问 | 整型、浮点型 |
顺序访问(序列类型) | 字符串、列表、元组 |
key值访问(映射类型) | 字典 |
三、python深浅拷贝
1、拷贝
list2是list1的拷贝对象,list1内的任何数据类型的元素变化,list2都会跟着变化,因为列表是可变类型
l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = l1
l1.append('g')
print(l1) # ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2) # ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
2、浅拷贝
需导入一个包:import copy,list2=copy.copy(list1),list2是list1的浅拷贝对象,list1内的不可变数据类型元素发生改变,list2不变;list1内的可变数据类型元素发生改变,list2会跟着改变
import copy
l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.copy(l1)
l1.append('g')
print(l1) # ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2) # ['a', 'b', 'c', ['d', 'e', 'f']]
l1[3].append('g')
print(l1) # ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2) # ['a', 'b', 'c', ['d', 'e', 'f', 'g']]
3、深拷贝
需导入一个包:import copy,list2=copy.deepcopy(list1),list2是list1的深拷贝对象,list1内的不可变数据类型元素发生改变,list2不变;list1内的可变数据类型元素发生改变,list2也不会改变。即list2永远不会因为list1的改变而改变
import copy
l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.deepcopy(l1)
l1.append('g')
print(l1) # ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2) # ['a', 'b', 'c', ['d', 'e', 'f']]
l1[3].append('g')
print(l1) # ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2) # ['a', 'b', 'c', ['d', 'e', 'f']]
四、基本的文件操作
1、打开文件
f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt')
print(f)
打开文件需要注意编码格式,我的电脑打开文件必须在open里加入encoding='UTF-8'
f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt',encoding='UTF-8')
print(f)
2、读取数据
打开文件之后,文件不仅占用了内存,他还对应了操作系统打开的以文件,相当于使用文本编辑器打开了一个文件。并且我们说了我们操控文件只是为了读和写,因此打开文件并不是目的,读和写才是目的,接下来我们尝试如何读写文件。
f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='r') # read模式打开文件
data = f.read()
print(data) # 读取文件内容,向操作系统发起读请求,会被操作系统转成具体的硬盘操作,将内容由硬盘读入内存
f.close() # 关闭文件 # 由于Python的垃圾回收机制只回收引用计数为0的变量,但是打开文件还占用操作系统的资源,所以我们需要回收操作系统的资源资源
# del f 只是回收变量f
3、写入数据
# write模式打开文件
f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='w')
f.write("""name = 'nick'
pwd = '123'""")
f.close()
f = open(r'/Users/mac/desktop/jupyter/pythonCourseware/32.txt', mode='r')
data = f.read()
print(data)
五、绝对路径和相对路径
1、绝对路径
- Windows系统绝对路径从盘符(C:、D:)开始写一个完整的路径。
- macos系统从根目录(/Users)开始写一个完整的路径。
2、相对路径
相对于当前执行文件所在的文件夹开始找。
f = open('32.txt') # 32.txt与该.md文档同路径位置