python学习Day12
Day 12
今日内容概要
- 垃圾回收机制(理论)
- 字符编码概述(理论)
- 字符编码相关操作
- 文件操作
今日内容详细
1.垃圾回收机制(理论)
'能自动帮助管理程序运行中产生的垃圾数据'
''''python会自动帮你申请和释放内存空间
别的编程语言需要自己申请或释放''''
策略1.引用计数
当数据值身上的引用计数不为0表示该数据值还有用,不会删除
当数据值身上的引用计数为0,则会被垃圾回收机制回收
name = 'jason' #数据值jason身上的引用计数就是1
name1 = name #数据值jason身上的引用计数就是2
del name1 #数据值jason身上的引用计数变为1
#删除name1(就是解除绑定关系)
'引用计数中有一个循环引用的问题
#循环引用
l1 = ['jason', ]
l2 = ['kevin', ]
l1.append(l2) # 引用计数为2
l2.append(l1) # 引用计数为2
del l1 # 解除变量名l1与列表的绑定关系 列表引用计数减一
del l2 # 解除变量名l1与列表的绑定关系 列表引用计数减一
策略2.标记清除
专门用来解决循环引用的问题,将内存中程序产生的所有数据值全检查一遍,对存在循环引用(两个数据值循环引用,没有变量名)的打上标记之后一次性清除
#标记清除是每隔一段时间就把所有数据排查一遍资源消耗过大
策略3.分代回收
#为了减轻垃圾回收机制的资源损耗,开发了三代管理,越往下检测频率越低用于节省资源
类似于在学校,差学生每隔5分钟检查一下,中学生每隔15分钟检查一次,好学生每隔45分钟检查一次
区分数据是看该数据值引用计数多与少来判断是否频繁在使用
2.字符编码概述(理论)
字符编码简介:
#只有文本文件才有字符编码
#计算机内部存储数据的本质是二进制,也就是计算机只认识0和1
#我们打出的字为什么可以被计算机识别是因为中间有一个转换关系
#转换关系不能随意更改,应有统一标准。字符编码表就是记录了人类的字符与数字的对应关系
字符编码发展阶段
一:一家独大
由于计算机时美国发明的,所以一开始只有美国有字符编码,用来让计算机识别英文字符
ASCII码:内部用来记录英文字符与数字的对应关系
1字节bytes来存储字符
A~Z 65~90
a~z 97~122
二:群雄割据
各国开始创建自己的字符编码
中国:GBK码,记录中文、英文与数字的对应关系
2字节存储字符 1字节存储英文
韩国:Euc_kr码,记录韩文、英文与数字的对应关系
日本:shift_JIS码,记录日文、英文与数字的对应关系
ps:此时各国计算机文本文件无法直接交互数据,会出现乱码
三:天下一统
万国码(unicode):兼容多个国家字符与数字的对应关系
但是所有字符都是采用2字节起步存储
后来utf家族发布了万国码的优化版>>>utf8
英文1bytes 其他采用3bytes
ps:目前内存使用unicode 硬盘使用utf8
3.字符编码相关操作
'''只有字符串可以参与编码解码,其他数据类型需要先转换成字符才可以'''
1.解决乱码的措施:
当初以什么编码存的就用什么编码解
2.编码与解码
编码:人类的字符>>计算机的字符
将人类的字符按照指定的编码转换成计算机可识别的数字
解码:计算机的字符>>人类的字符
将计算机可识别的数字按照指定的编码转换成人类的字符
编码的方法:(只有字符串可以使用这两种方法)
(一):
s1 = '张三aaaaa'
res = s1.encode('utf8')#不做特殊说明时都用utf8
print(res)# b'\xe5\xbc\xa0\xe4\xb8\x89aaaaa'
'''
b 就是bytes类型,在python中该类型可以直接当作二进制
'''
(二):
'当要编码的内容都是纯英文或者数字时可以简写'
print(b'hello my baby')#在字符前加b即可
解码的方法:
res1 = res.decode('utf8')
print(res1)#张三aaaaa
3.解释器层面
1)python2默认的编码是ASCII码
如果想用python2使用utf8则需要:
1.文件头(文件最上方)加一句
# coding:utf8
2.每一个字符串前加u
print(u'你好你好')
2)python3默认的编码是utf8码
4.文件操作
1.什么是文件操作?
通过编写代码来自动操作文件的读写
2.什么是文件?
#双击文件图标就是从硬盘加载数据到内存
#写文件之后保存的就是将内存中的数据放到硬盘中
文件就是操作系统暴漏给用户操作计算机硬盘的快捷方式之一
3.如何用代码操作文件?
方式一:
open(文件路径,读写模式,字符编码)#字符编码一般写utf8
eg:
res = open('a.txt','r',encoding='utf8')
print(res.read())#读取该文件的内容
print(res.close())#关闭该文件
方式二:(建议)
with open() as 变量名:
子代码运行结束后自动调用close()方法
eg:
with open('a.txt','r',encoding='utf8') as res1:
print(res1.read())#好处在于自动调用close()方法
4. 针对文件路径需要注意:
可能存在特殊含义(字母与撬棍的组合)
#在字符串的前面加字母 r 即可取消特殊含义
eg:
with open(r'D:\a.txt','r',encoding='utf8') as res1:
作业:
1.统计列表中每个数据值出现的次数并组织成字典
eg: l1 = ['jason','jason','kevin','oscar']
结果:{'jason':2,'kevin':1,'oscar':1}
————————————————————————————————————————————————————————————————
方式一:
l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin']
dict = {}
for i in l1:#i循环打印l1的值
dict[i]=l1.count(i)#新增键值对(存在就修改,不存在就新增)=统计l1各个值出现的次数
print(dict)
————————————————————————————————————————————————————————————————
方式二:
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
#1.先产生一个空字典
data_dict={}
#2.统计出现的次数前需先取出所有数据值(用for循环)
for name in l1:
#3.判断当前数据值是否已经存在字典的k中,如果不存在就新增一个键值对,如果存在则让该键对应的值自增1
if name not in data_dict:
data_dict[name]=1#新增一个键值对
else:
data_dict[name]+=1#获取键对应的值并自增1
print(data_dict)
2.编写员工管理系统
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
提示:用户数据有编号、姓名、年龄、岗位、薪资
数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
———————————————————————————————————————————————————————————————————————————
d1={}#创建一个字典1用来存储用户信息
num=0#创建一个变量名做为员工编号
while True:
print(''' ------------
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
------------''')
zl=input('请输入您的指令:').strip()#获取用户指令
if zl == '1':
name = input('请输入员工姓名:').strip()
age = input('请输入员工年龄:').strip()
job = input('请输入员工岗位:').strip()
salary = input('请输入员工薪资:').strip()
num += 1 #编号自增1
d2={'工号':num,'name':name,'age':age,'job':job,'salary':salary}#创建一个字典2
d1[num]=d2 #字典1的K键为该员工编号,V值为字典2的员工详细信息
print(f'员工{name}已添加成功')
print(d1)
elif zl == '2':
num=input('请输入员工编号:').strip()
if not num.isdigit():#判断如果用户输入不是纯数字
print('编号必须是纯数字')
continue#跳出返回上一步
else:
num = int(num)#将字符串改为int类型整数
if num in d1:#判断员工编号是否在字典1中
new_salary=input('请输入要修改的薪资:').strip()
if new_salary.isdigit():#判断用户输入的薪资是否是纯数字
d1[num]['salary']=new_salary#修改字典V值
print('修改薪资成功')
else:
print('请输入正确薪资')
else:
print(f'员工编号{num}不存在')
elif zl == '3':
cknum=input('请输入您要查看的员工编号:').strip()
if not cknum.isdigit():#判断用户输入员工编号是否是纯数字
print('编号必须是纯数字')
continue#跳出返回上一步
else:
cknum = int(cknum)#将字符串改为int类型
# print(d1.get(cknum,'该员工信息不存在'))#字典取值 当k不存在时返回自己编辑的内容
d2=d1.get(cknum)#根据员工编号获取用户字典
print(f"""
-------{d2.get('name')}个人资料-------
编号:{d2.get('工号')}
姓名:{d2.get('name')}
年龄:{d2.get('age')}
职业:{d2.get('job')}
薪资:{d2.get('salary')}
------------------------
""")
elif zl == '4':
d2=d1.values()#获取字典所有的V值
for i in d2:#循环获取每一个员工字典
print(f"""
-------{i.get('name')}个人资料-------
编号:{i.get('工号')}
姓名:{i.get('name')}
年龄:{i.get('age')}
职业:{i.get('job')}
薪资:{i.get('salary')}
------------------------
""")
elif zl == '5':
del_num=input('请输入您要删除的员工编号:').strip()
if not del_num.isdigit():#判断如果用户输入不是纯数字
print('编号必须是纯数字')
continue#跳出返回上一步
else:
del_num = int(del_num)#将字符串改为int类型整数
if del_num in d1:#如果要删除的编号在字典1中
del d1[del_num]#删除该k键
print(f'员工编号{del_num}信息已删除')
else:
print(f'员工编号{del_num}不存在')
else:
print('指令输入错误,请重新输入')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)