数据类型分类总结
1)按存值个数
存一个值: 整型/浮点型/字符串
存多个值: 列表/字典/元组/集合
2)按有序or无序
有序: 字符串/列表/元祖
无序: 字典/集合
3)按可变or不可变
可变: 列表/字典/集合
不可变: 整型/浮点型/字符串/元组
Python深浅拷贝
1)拷贝(赋值)
lt = [1, 2, 3]
lt2 = lt
lt.append(4)
print(lt) # [1, 2, 3, 4]
print(lt2) # [1, 2, 3, 4]
因为列表是可变类型,所以lt的值变化,lt2的值也会跟着变2)浅拷贝
import copy
lt2没有变化的情况
lt = [1, 2, 3]
lt2 = copy.copy(lt)
lt.append(4)
print(lt) # [1, 2, 3, 4]
print(lt2) # [1, 2, 3]
lt2变化的情况
lt = [1, 2, 3, [4, 5, 6]]
lt2 = copy.copy(lt)
lt.append(4)
print(lt) # [1, 2, 3, [4, 5, 6], 4]
print(lt2) # [1, 2, 3, [4, 5, 6]]
lt[-1].append(7)
print(lt) # [1, 2, 3, [4, 5, 6, 7]]
print(lt2) # [1, 2, 3, [4, 5, 6, 7]]
3)深拷贝
import copy
lt = [1, 2, 3, [4, 5, 6]]
lt2 = copy.deepcopy(lt)
lt.append(4)
print(lt) # [1, 2, 3, [4, 5, 6], 4]
print(lt2) # [1, 2, 3, [4, 5, 6]]
lt[-1].append(7)
print(lt) # [1, 2, 3, [4, 5, 6, 7]]
print(lt2) # [1, 2, 3, [4, 5, 6]]
牢记: 拷贝/浅拷贝/深拷贝 只针对可变数据类型
拷贝: 当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化
简单的赋值
浅拷贝:当lt2为lt的浅拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2不变化
copy.copy() 可变数据的类型中的内置方法.copy()
深拷贝: 当lt2为lt的深拷贝对象时,lt内的可变类型变化,lt2不变化;lt内的不可变类型变化,lt2不变
copy.deepcopy()
毫无应用,面试经常问
异常处理
语法异常(错误都是SyntaxError)
if # SyntaxError
0 = 1 # SyntaxError
逻辑异常(错误类型往往是不一样的)
1/0
dic = {}
print(dic['skldfj']) # KeyError
except:
try: # 尝试
num = input('输入一个值') # 123124
dic = {'0': 'a'}
print(dic[num]) # dic['123124']
print(3) # 代码自上而下,上面会运行
1 / int(num) # 错误不影响其他的代码,报错马上终止try缩进里面的代码
print(4)
except ZeroDivisionError as e: # 除此之外 # try里面的代码出了什么错误,就得用什么错误捕捉 # as是把错误赋值给e
print('e:', e)
except KeyError as e: # 可以写多个except捕捉多个异常
print('e:', e)
exception:
最重要,以后想捕捉异常就用这个,只要记住这个就够用了
print(1)
try: # 尝试
num = input('输入一个值') # 123124
dic = {'0': 'a'}
print(dic[num]) # dic['123124']
print(3) # 代码自上而下,上面会运行
1 / int(num) # 错误不影响其他的代码,报错马上终止try缩进里面的代码
print(4)
except Exception as e: # Exception可以捕捉任意异常,语法错误无法捕捉
print('e:', e)
接下来讲的也是了解部分
finally:
print(1)
try: # 尝试
1 / 1
except Exception as e:
print('e:', e)
finally: # 最终的意思,无论报不报错都会打印 明天讲文件处理的时候带着你用
print(3)
assert: 断言,最早的时候没有pycharm,那这个做调试,一辈子都用不上了
a = 1
a += 1
assert a == 3 # 条件成立会跳过,条件错误会报AssertionError错误
print(3)
raise: 主动抛错,没有用. 创建框架/创建语言 C/C++ 有用
print(1)
raise ZeroDivisionError('主动抛错干嘛')
print(2)
基本文件处理
什么是文件:操作系统提供给用户的一个虚拟单位
文件有什么用: 存储数据
打开文件的流程
1) 找到文件路径
path = r'D:上海Python11期视频python11期视频day 09 est.py' # 鼠标右键点击文件,copy path
2) 双击打开
f = open(path, 'w') # r-->read 只读 ; w-->只写,清空当前文件后写入,自动创建文件
print(f) # 文件数据类型
3) 看文件
data = f.read()
print(data)
4) 写文件.
f.write('nick handsome')
5) 关闭文件
del f # 只删除了文件的引用以及文件在python内存中的占用,但是没有删除对操作系统的占用
f.close() # 会命令操作系统对外存文件的占用
绝对路径和相对路径
绝对路径:这种类型的叫做绝对路径,从根目录(C/D/E盘)开始
path = r'D:上海Python11期视频python11期视频day 09 est.py' # 鼠标右键点击文件,copy path
相对路径:(当前文件夹下,可以直接写文件名)
path = r'test.py'
为什么不能对文件又读又写?
假设文件内容为 1
1. 文件既可以读又可以写
2. 在1后面追加2,文件内容变成12(需要时间10s)
3. 在这10s内读文件(5s),读出来的内容是1
4. 在1后面追加2,文件内容变成12(需要时间10s),等10s过完文件内容其实是12,就会报错