垃圾回收机制以及字符编码
目录
- 垃圾回收机制
- 字符编码
1.字符编码简介
2.字符编码的发展史
3.字符编码的实操 - 文件操作简介
垃圾回收机制
-
什么是垃圾回收机制
垃圾回收机制就是python解释器中自带的一种机制,是为了回收清除不可用变量所占用的资源。 -
垃圾回收机制的作用
程序运行过程中,所产生的一些滞留代码得不到及时清理,则会导致CPU过载,甚至造成系统崩溃,故而使用垃圾回收机制来清除这些不需要的数据,缓解CPU的运行空间。 -
垃圾回收机制的方法
-
引用计数
当数据值的引用计数不为0时,则还能继续运行,不会被垃圾回收机制所回收
当数据值的引用计数为0 时,该数据值再程序中就不会再被引用,该机制就会对其进行回收清除。
引用计数有一个弊端,就是会形成某些垃圾文件在“循环引用”中一直被引用但无法运行,在这种情况下,就该用到该机制的标记清除用法 -
标记清楚
该用法主要是解决循环引用所产生的问题
标记清除是将内存中程序所产生的所有数据值全部检查一遍,看是否存在循环引用,若存在将其打上标记,之后一次性清空删除。
循环引用
l1 = ['jason', ]
l2 = ['kevin', ]
l1.append(l2) # 引用计数为2
l2.append(l1) # 引用计数为2
del l1 # 解除变量名l1与列表的绑定关系 列表引用计数减一
del l2 # 解除变量名l2与列表的绑定关系 列表引用计数减一
由于标记清除每隔一段时间就需要将所有数据重新排查一遍,资源消耗过大,所以产生了分代回收的用法
- 分代回收
将垃圾回收机制分了三层,进行三代管理
在历经多次扫描的情况下都没有被回收的变量,垃圾回收机制会认为是常用变量,对其扫描频率会降低
字符编码
- 字符编码简介
- 计算机是采用二进制来存取数据的(计算机只能识别0和1)
- 由于计算机中存在着人类字符和数字之间的转换关系,我们才能在计算机中查阅各国文字
- 字符和数字之间的转换关系不能随意修改,应有统一的标准
字符编码表:记录了字符与数字之间的对应关系
- 字符编码发展史
字符编码的发展史分三个阶段
第一阶段(一家独大):
由于计算机是美国发明的,美国人需要将计算机识别英文字符,则诞生了ASCII码
ASCII码的内部只存储了英文字符与数字之间的对应关系
第二阶段(群雄割据):
随着时代的发展,各国也开始接触计算机,开始开发属于自己国家的计算机编码,用来在计算机上转换识别各国的文字。
其中,我国开发的GBK码就是记录了中文字符、英文字符与数字的对应关系。
用2 bytes起步存储中文,1butes存储英文(bytes 字节8位)
第三阶段(一统天下):
由于各个国家的编译码不同,国家与国家之间相互交互的时候会存在乱码的情况,所以就产生了万国码(unicode)
万国码就是兼容了万国的字符,所有字符都全部使用2bytes 起步储存。
utf 家族 (针对万国码的优化版本) 其中最常用的是utf -8
英文采用1 bytes , 其他统一采用3 bytes
其中在如今计算机上,内存使用常unicode ,硬盘使用utf8
- 字符编码的实操
如何避免乱码问题:
- 保证存的时候不乱:在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式
- 保证取的时候不乱:在由硬盘读入内存时,必须采用与写入硬盘时相同的编码格式
编码和解码:
- 编码就是用人类的字符使用自定编码转换为计算机所能存储的二进制
- 解码就是用二进制按照指定编码转换为人类字符
解释器层面:
python2默认的编码是ASCII码
1.文件头 coding:utf8
2.定义字符串 需要在字符串的前面加u
python3默认的编码是utf8码
文本文件
- 文件操作简介
-
文件操作的含义
通过编写代码的方式自动操作对文件的读写 -
什么是文件
打开文件是从硬盘中加载数据到内存
写文件后的保存是将内存中的数据加载到硬盘
文件就是操作系统让用户操作计算机的快捷方式之一 -
如何使用代码操作文件
使用 open(文件路径,读写模式,字符编码)
方式1:
f = open()
f.close()
方式2:
with open() as 变量名:
"""子代码运行结束之后自动调用close()方法"""
- 针对文件路径需要注意 可能存在特殊含义(字母与撬棍的组合)
在字符串的前面加字母r即可取消特殊含义
今日作业
- 1.统计列表中每个数据值出现的次数并组织成字典战士
eg: l1 = ['jason','jason','kevin','oscar']
结果:{'jason':2,'kevin':1,'oscar':1}
真实数据
l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin'
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
set = set(l1)
l2 = {}
for item in set:
l2.update({item:l1.count(item)})
print(l2)
- 2.编写员工管理系统
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
提示:用户数据有编号、姓名、年龄、岗位、薪资
数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
info = []
flag = True
while flag:
print("""
---------员工信息系统----------
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
6.退出员工系统
-----------------------------
""")
choice = input('请输入你的选择(功能1-6)>>>:').strip()
if choice == '1':
print('请添加员工信息')
id = input('请输入员工编号').strip()
name = input('请输入用户名:').strip()
paw = input('请输入密码:').strip()
post = input('请输入你的岗位:').strip()
pay = input('请输入你的薪资:').strip()
if id in info:
print('该用户以存在')
else:
new_info = {'job_number': id, 'username': name, 'password': paw, 'post': post,
'salary': pay}
info.append(new_info)
print(f'用户职工编号{id}添加成功')
elif choice == '2':
print('请输入需要修改员工的职工号')
num = input('输入员工职工号:')
for i in info:
if i['job_number'] == num:
money = input('请输入改动后的薪资').strip()
i['salary'] = money
print(f'员工职工编号{id},员工{name}的薪资已修改')
elif choice == '3':
print('----以下可查看员工,请输入职工号查看员工信息----')
num = input('请输入员工的职工号:')
for i in info:
if i['job_number'] == num:
print(f"""
-----------------该员工基本信息--------------
{i['job_number'], i['username'], i['post'], i['salary']}
----------------------------------------
""")
elif choice == '4':
for i in info:
print(f"""
-------------------员工明细--------------------
username:{i['job_number'], i['username'], i['post'], i['salary']}
---------------------------------------------
""")
elif choice == '5':
print('-----删除员工数据-------')
num = input('输入职工的职工号:').strip()
find_flag = False
for i in info:
if i['job_number'] == num:
find_flag = True
info.remove(i)
if find_flag:
print('已删除')
else:
print('不存在')
elif choice == '6':
print('即将退出程序')
flag = False # 退出关键字
else:
print('请输入正确的数字')