今日内容垃圾回收机制
-
语言介绍
python会自动帮我们清理那些没有被绑定的数据值(使用不了的),这样 更能释放内存的空间,保证电脑的性能。
-
机制有三个阶段
第一阶段
引用计数:
什么叫引用计数?就是统计那些数据值身上的绑定值是多少个;如果是0,那就为垃圾,相反,则继续保留。
eg:
name = 'jason' # 这里计数为1,因为只要name一个绑定值 name1 = name # 这里计数增加为2 del name1 # 这里删除了一个,计数减一为1
注意,这里有一个坑,叫循环引用
第二阶段
标记清除:
专门解决第一阶段的循环引用,将内存中产生的所有值都检查一遍,观察是否存在循环引用,如果有就做上标记,之后再一次清除。
eg:
l1 = ['jason'] l2 = ['kevin'] l1.append(l2) # 计数为2 l2.append(l1) # 计数为2 当我们解除绑定后,计数量都减一
第三阶段
分代回收
将标记起来的每隔一段时间检查一遍,然后将计数为一个清除掉,但是这样消耗的大
为了减轻垃圾回收机制的消耗,然后发明了三大管理来解决资源消耗的问题
越往下检查频率越低
就是通过二进制0,1组成的编码串,形成我们能够看的懂得东西,那么我们还需要属于自己得编码本
字符编码的发展史计算机是由美国人发明的,所以刚开始,只有属于英文的编码本,但是随着我们国家的强大,也可以用计算机了,然后我们也发明了属于自己的编码本。
字符编码的发展史一共分为三个阶段:
1.一家独大
计算机是由美国发明的,所以刚开始就只有英文的编码本(ASCII码);ASCII码里只有英文字母与字符的编码信息
用1bytes来存储字符
需要我们记住的:A-Z:65-90;a-z:97-122
2.群雄割据
随着时代的发展,我们国家和其他一些国家的快速发展,我们也可以用电脑了。但是电脑只有关于英文的翻译,却没有属于自己文字的编码本。所以我们就自己发明自己的编码本。
中国:GBK (里面存储中文)
至少用2bytes来存储字符
韩国:Euc_kr
字符编码实际操作3.天下一统
各用各的不能联立起来,别人的发给我,我翻译不了
于是发明了万国码
万国码(unicode):兼容万国字符;解决了不能兼容的问题
存储数据的话至少2bytes起步,但是英文还是一个。
utf是针对unicode的优化版本,主要是utf8
注意:内存用unicode,硬盘用utf8
只有字符串才能参与编码,其他类型需要先转换成字符串才可以编码
-
编码:(encode)
就是用我们的字符去让计算机看懂我们的意思
-
解码:(dencode)
相反,就是计算机的字符转换成我们能看懂的字符
注意:当出现乱码的时候,是用什么类型编的,就用什么类型解
基于网络传输的时候,数据必须是二进制
eg:
s1 = '加油干'
res1 = s1.encode('gbk')
print(res1) # 编码
res2 = res1.decode('Euc_kr')
print(res2) # 乱码
res3 = res1.decode('gbk')
print(res3) # 正常输出
- 解释器层面
python2解释器默认的编码是ASCII码
python3解释器默认的编码是utf8
当我们想使用python2进行操作的时候,我们需要在第一行加上
# coding:utf8
# -*- coding:utf8 -*- # 美化版本
而且,我们在写字符串的时候,还要在每个前面加一个u
文件操作简介-
什么是文件?
是操作系统提供给用户可以直接操作硬盘的快捷方法
-
代码操作文件流程
1.创建文件
2.打开文件
3.编辑文件
4.保存文件
5.关闭文件
- 结构
f.open() # 打开文件
f.close() # 关闭文件
推荐使用:
with open () as f:
pass
注意:
使用关键字打开文件,填写路径为了防止特殊符号,可以在前面加r
open(r'a.txt') # 相对路径 open(r'D:pythonday09a.txt') # 绝对路径 res = open(r'a.txt', 'r', encoding='utf8')
今日作业
- 作业一
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']
l2 = {} # 创建一个空字典,然后通过循环放数据值
for i in l1:
sum = l1.count(i) # 统计出现的次数
l2[i] = sum # 健在则为修改,健不在则为新增
print(l2)
输出结果:
{'jason': 2, 'kevin': 3, 'oscar': 1, 'tony': 1}
- 作业二
2.编写员工管理系统
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
提示:用户数据有编号、姓名、年龄、岗位、薪资
数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
代码:
l1 = {'001': {'name': 'jason', 'age': '25', 'post': '讲师', 'poy': '3w'},
'002': {'name': 'kevin', 'age': '28', 'post': '运营', 'poy': '2.5w'}
}
user_name = [
{'name': 'lzq', 'pwd': '123'},
{'name': 'gsy', 'pwd': '520'}
] # 创建的一个多管理人员表
while True:
print('''
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
''')
name = input('管理员是:').strip()
pwd = input('管理系统登录密码是:')
if {'name': name, 'pwd': pwd} in user_name: # 判断输入的name,pwd是否在user_name里
print('管理员验证成功!')
while True:
order = input('请输入你的指令:')
if order == '1':
i = input('请输入你需要添加员工的编号: ').strip()
if i in l1:
print('已经存在')
else:
name = input('请输入新增员工的姓名:')
age = input('请输入新增员工的年龄:')
post = input('请输入新增员工的职业:')
poy = input('请输入新增员工的薪资:')
l2 = l1.fromkeys([i], {'name': name, 'age': age, 'post': post, 'poy': poy}) # 根据fromkeys快速创建一个字典
l1.update(l2) # 然后再将创建好的更新到l1中
print(f'员工:{i}添加成功')
continue
elif order == '2':
i = input('请输入你要修改信息的员工编号:').strip()
if i in l1:
print(f'''
---------------------info----------------------
id:{i},username:{l1[i]['name']},age:{l1[i]['age']},post:{l1[i]['post']},poy:{l1[i]['poy']} # 根据字典按K取值,去输出
---------------------end-----------------------
''')
l1[i]['poy'] = input('请输入你修改后的金额:') # 健在则为修改
print('成功修改薪资!')
else:
print('查无此人')
continue
elif order == '3':
i = input('请输入你要查看的员工编号:').strip()
if i in l1:
print(f'''
---------------------info----------------------
id:{i},username:{l1[i]['name']},age:{l1[i]['age']},post:{l1[i]['post']},poy:{l1[i]['poy']} # 根据字典按K取值,去输出
---------------------end-----------------------
''')
else:
print('查无此人')
continue
elif order == '4':
for i in l1:
print(f'''
---------------------info----------------------
id:{i},username:{l1[i]['name']},age:{l1[i]['age']},post:{l1[i]['post']},poy:{l1[i]['poy']} # 根据字典按K取值,去输出
---------------------end-----------------------
''')
continue
elif order == '5':
i = input('请输入你要辞退的员工编号:').strip()
if i in l1:
l1.pop(i) # 通过直接删除编号,删除员工信息
print(f'{i}员工已被辞退')
else:
print('查无此人')
continue
else:
res = input('其他指令为退出,是否退出?(y/q)')
if res == 'y':
print('不小心输错了')
continue
else:
print('退出成功')
break
else:
print('你不是管理员,拒绝登录')
continue
break



