0806 随笔 1.数据类型分类 2.深浅拷贝 3.异常处理 4.基本的文件处理 5.绝对路径和相对路径

按存值个数

​ 存一个值: 整型/浮点型/字符串

​ 存多个值: 列表/字典/元组/集合

按有序or无序

​ 有序: 字符串/列表/元祖

​ 无序: 字典/集合

按可变or不可变

​ 可变: 列表/字典/集合

​ 不可变: 整型/浮点型/字符串/元组

2.深浅拷贝

2.1 拷贝(简单的赋值)

当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化,lt内的不可变类型变化,lt2变化。

lt = [1,2,3]
lt2 = lt

lt.append(4)
print(lt)
# 因为列表是可变类型,所以lt的值变化,lt2的值也会跟着变化
print(lt2)

2.2 浅拷贝(copy.copy)

当lt2为lt的浅拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2不变化。

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]

#
lt = [1000,2000,3000,[4000,5000,6000]]
lt2 = copy.copy(lt)
lt[0] += 1
print(lt)    # [1001, 2000, 3000, [4000, 5000, 6000, 7]]
print(lt2)   # [1000, 2000, 3000, [4000, 5000, 6000, 7]]

# lt2变化的情况
lt = [1000,2000,3000,[4000,5000,6000]]
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 = [1000,2000,3000,[4000,5000,6000]]
lt2 = copy.copy(lt)

lt[-1].append(7)
print(lt)   # [1,2,3,[4,5,6,7]]
print(lt2)   # [1,2,3,[4,5,6,7]]

2.3 深拷贝(copy.deepcopy)

当lt2为lt的深拷贝对象时,lt内的可变类型变化,lt2不变化;lt内的不可变类型变化,lt2不变。

import copy
lt = [1000,2000,3000,[4000,5000,6000]]
lt2 = copy.deepcopy(lt)

lt.append(4)
print(lt)    # [1000, 2000, 3000, [4000, 5000, 6000], 4]
print(lt2)   # [1000, 2000, 3000, [4000, 5000, 6000]]

lt = [1000, 2000, 3000, [4000, 5000, 6000]]
lt2 = copy.deepcopy(lt)
lt[-1].append(7)
print(lt)   # [1000, 2000, 3000, [4000, 5000, 6000], 7]
print(lt2)  # [1000, 2000, 3000, [4000, 5000, 6000]]

拷贝/浅拷贝/深拷贝 只针对可变数据类型

3.异常处理

异常:报错

就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)

3.1 语法异常(错误都是SyntaxError)

# if # SyntaxError
# 0 = 1 # SyntaxError

# try:
#     if
# except Exception as e:   # 语法错误无法捕捉
#     print(e)

3.2 逻辑异常(错误类型往往是不一样的)

1/0
dic = {}
print(dic['skjdis'])  # KeyError

print(1)
try:   # 尝试
    print(3)  # 代码自上而下,上面会运行
    1 / 0   # 错误不影响其他代码,报错马上终止try缩进里面的代码
    print(4)
except:  # 除此之外
    pass


print(1)
try:   # 尝试
    num = input('输入一个值')
    dic = {'0':'a'}
    print(dic[num])

    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)

## 最重要,以后想捕捉异常就用这个
print(1)
try:  # 尝试
    num = input('输入一个值')
    dic = {'0': 'a'}
    print(dic[num])

    print(3)  # 代码自上而下,上面会运行
    1 / int(num)  # 错误不影响其他代码,报错马上终止try缩进里面的代码
    print(4)
except Exception as e:  # Exception可以捕捉任意异常
    print('e:', e)

3.3 了解

print(1)
try:  # 尝试
    1/0
except Exception as e:  # Exception可以捕捉任意异常
    print('e:', e)
finally:   # 最终的意思,无论报不报错都会打印
    print(3)
print(2)

# eg:
f = open('test.py','r')
data = f.read()
try:
    1/0
    print(data)
    # def f  # 只删除f,变量名,对操作系统的占用不会关闭
except Exception as e:
    print('e:',e)
finally:
    f.close()   # 即删除f的引用,又会命令操作系统关闭对外存文件的占用

# assert 断言,最早的时候没有pycharm,拿这个做调试,用不上了
a = 1
a += 1
assert a == 2 # 条件成立会跳过,条件错误会报AssertionError错误
print(3)

# raise 主动抛错    创建框架/创建语言  C/C++ 有用
raise KeyError('主动抛错')

4.基本的文件处理

什么是文件:操作系统提供给用户的一个虚拟单位

文件有什么用:存储数据

# 打开文件的流程

# 1.找到文件路径
path = r'F:实习python 806	est'  # 鼠标右键点击文件,copy path

# 2.双击打开
f = open(path,'w',encoding='utf-8')   # r--->read 只读   w--->write 只写,清空当前文件后写入
print(f)   # 文件数据类型

# 3.看文件
data = f.read()
print(data)

# 4.写文件
f.write('你好')

# 5.关闭文件
#def f   # 只删除了文件的引用以及文件在python内存中的占用,但是没有删除对操作系统的占用
f.close()  # 关闭操作系统对文件的占用

5.绝对路径和相对路径

5.1 绝对路径

从根目录(C/D/E盘)开始的这种类型的路径叫做绝对路径

path = r'F:实习python 806	est'
f = open(path, 'w')
f.write('nick handsome')
f.close()

5.2 相对路径

当前文件夹下,可以直接写文件名

path = r'test'  # 鼠标右键点击文件,copy path
f = open(path, 'r')
print(f.read())
f.close()

5.3 补充

为什么文件不能既可以读又可以写

假设文件内容为1

1.文件既可以读也可以写

2.在1后面追加2,文件内容变成12(需要10s)

3.在这10s内读文件(5s),读出来的内容是1

4.在1后面追加2,文件内容变成12(需要时间10s),等10s过完文件内容其实是12,就会报错