python进阶
一、数据类型分类
1.1 按存值个数区分
存多个值(容器):列表、元组、字典、集合
存单个值:整形、浮点型、字符串
1.2 按可变不可变区分
可变:字典、集合、列表
不可变:数字、字符串、元组
1.3 按有序无序区分
有序:字符串、列表、元组
无序:字典、集合
1.4 按访问类型区分
直接访问:数字
顺序访问(序列访问):字符串、列表、元组
key值访问(间接访问):字典
二、python深潜拷贝
在python中,对象赋值实际上是对象的引用。创建一个对象,把它赋给另一个变量,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。
2.1 拷贝
l2是l1的拷贝对象,l1内的任何数据变化,都会引起l2内的数据进行变化,l1、l2的id相同。
l1 = [1,2,3,4]
l2 = l1
l1.append(5)
print(l1)
print(l2)
print(id(l1))
print(id(l2))
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
2389714688328
2389714688328
2.2 浅拷贝
l2是l1的浅拷贝对象,l1内的不可变元素发生改变,l2不发生改变;如果l1内的可变元素发生了改变,则l2会跟着改变。
import copy
l1 = [1,2,3,[4,5,6]]
l2 = copy.copy(l1)
l1.append(7)
print(l1)
print(l2)
print(id(l1))
print(id(l2))
[1, 2, 3, [4, 5, 6], 7]
[1, 2, 3, [4, 5, 6]]
2209074390984
2209074391816
import copy
l1 = [1,2,3,[4,5,6]]
l2 = copy.copy(l1)
l1[3].append(7)
print(l1)
print(l2)
print(id(l1))
print(id(l2))
[1, 2, 3, [4, 5, 6, 7]]
[1, 2, 3, [4, 5, 6, 7]]
2207936817096
2207936817928
2.3 深拷贝
l2是l1的深拷贝对象,l1内的不可变元素发生改变,l2不变;如果l1内的可变元素发生了改变,l2也不会变,即l2永远不会因为l1的变化而变化。
import copy
l1 = [1,2,3,[4,5,6]]
l2 = copy.deepcopy(l1)
l1.append(7)
print(l1)
print(l2)
print(id(l1))
print(id(l2))
[1, 2, 3, [4, 5, 6], 7]
[1, 2, 3, [4, 5, 6]]
1654809896904
1654809897736
import copy
l1 = [1,2,3,[4,5,6]]
l2 = copy.deepcopy(l1)
l1[3].append(7)
print(l1)
print(l2)
print(id(l1))
print(id(l2))
[1, 2, 3, [4, 5, 6, 7]]
[1, 2, 3, [4, 5, 6]]
1728501852104
1728501852936
三 、异常处理
异常就是程序运行时发生错误的信号
3.1 语法错误
if # SyntaxError
语法错误报错都是SyntaxError。
3.2 逻辑错误
1/0 #ZeroDivisionError: division by zero
逻辑错误的报错都是不一样的。
3.3 常见的异常
- AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
- IOError 输入/输出异常;基本上是无法打开文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndentationError 语法错误(的子类) ;代码没有正确对齐
- IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- KeyError 试图访问字典里不存在的键
- KeyboardInterrupt Ctrl+C被按下
- NameError 使用一个还未被赋予对象的变量
- SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
- TypeError 传入对象类型与要求的不符合
- UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
- ValueError 传入一个调用者不期望的值,即使值的类型是正确的
3.4 异常的处理
异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
s1 = 'hello'
try:
int(s1)
except IndexError as e: # 未捕获到异常,程序直接报错
print(e)
多分支结构
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
invalid literal for int() with base 10: 'hello'
万能异常Exception
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
异常的最终执行
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
#except Exception as e:
# print(e)
else:
print('try内代码块没有异常则执行我')
finally:
print('无论异常与否,都会执行该模块,通常是进行清理工作')
try...except是最重要的异常捕捉的方式,而Exception可以捕捉任何异常。
3.5 raise抛出异常(了解)
try:
raise TypeError('抛出异常,类型错误')
except Exception as e:
print(e)
3.6assert断言(了解)
a = 1
a += 1
assert a == 3 # 条件成立会跳过,条件错误会报AssertionError错误
print(3)
断言是最早没有pycharm时做调试用的,所一现在基本没有用。
文件处理
一、基本文件操作
1.1 什么是文件
文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位。文件的操作是基于文件,即文件的操作核心就是读和写。
1.2打开文件流程
如果我们需要打开一个文件,需要向操作系统发起请求,要求操作系统打开文件,占用操作系统资源。Python中使用open()方法可以打开某个具体的文件,open()方法内写入文件路径。
1.2.1 找到文件路径
path = r'D:上海Python11期视频python11期视频day 09 est.py' # 鼠标右键点击文件,copy path
1.2.2 双击打开
f = open(path, 'w') # r-->read 只读 ; w-->只写,清空当前文件后写入print(f) # 文件数据类型
1.2.3 看文件
data = f.read()
print(data)
1.2.4 写文件
f.write('nick handsome')
1.2.5 关闭文件
del f # 只删除了文件的引用以及文件在python内存中的占用,但是没有删除对操作系统的占用
f.close() # 关闭操作系统对文件的占用
二、绝对路径和相对路径
2.1 绝对路径
Windows系统绝对路径从盘符(C:、D:)开始写一个完整的路径。
2.2 相对路径
相对于当前执行文件所在的文件夹开始找。