垃圾回收机制、字符编码、文件操作简
作者:互联网
垃圾回收机制
垃圾回收机制是用来回收不可用的变量值所占用的内存空间,python会自动申请和释放内存空间,主要通过引用计数、标记清除、分代回收来帮助释放内存空间
引用计数
当数据值身上的引用计数为0时,占用的内存地址就会被垃圾回收机制回收
当数据值身上的引用计数不为0时,表示数据值还有用,就不会被垃圾回收机制回收
eg:
name = 'nana' # 数据值nana身上的引用计数为1
name1 = name # 数据值nana身上的引用计数为2
del name1 # 数据值nana身上的引用计数为1
del name # 数据值nana身上的引用计数为0 此时会被垃圾回收机制回收
ps:循环引用中,引用计数不为0,所以不能够垃圾回收机制,得使用标记清除来解决
标记清除
用来解决循环引用的问题,将内存中程序产生的数据值全部检查一遍,如果存在循环引用,则打上标记,然后一次性清除
eg:循环引用
l1 =['nana',]
l2 = ['xiaoxiao',]
l1.append(l2) # 列表的引用计数为2
l2.append(l1) # 列表的引用计数为2
print(l1) # ['nana', ['xiaoxiao', [...]]]
print(l2) # ['xiaoxiao', ['nana', [...]]]
del l1 # 列表的引用计数变为1
del l2 # 列表的引用计数变为1
分代回收
在多次扫描的情况下,变量都没有被进行垃圾回收机制,那么会进行分代回收,垃圾回收机制的检测频率也会逐一降低
标记清除每隔一段时间就会就会将所有数据的引用计数遍历一次,使之资源内存消耗过大,为了减少垃圾回收机制的资源损耗 将其分为三代(新生代,青春代,老年代)管理
字符编码
字符编码简介
1.只有文本文件才有字符编码的概念
2.计算机内部存取数据的本质>>>:二进制(计算机只认识0、1)
3.为什么我们在使用计算机的时候可以随意敲出各国文字
存在一个人类字符与数字转换的关系
4.字符编码表:记录了人类的字符与数字的对应关系
字符编码发展史
第一阶段:一家独大(计算机只能识别英文)
1.计算机是由美国人发明的,美国人需要让计算机识别英文字符
2.一个英文字符对应 1bytes,英文的所有字符加起来不超过127个(2**7),美国人考虑到后续可能出现新的字符 所以加了一位以备不时之需(2**8=256)
3.ASCII码:记录了英文字符与数字对应的关系(一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字)
A-Z 65-90
a-z 97-122
4.此时的计算机只能识别英文,不能识别其他字符
第二阶段:群雄割据(各国计算机有各国的编码表,文本文件不能交互)
中国:开发了一套中文编码表--GBK码:内部记录了中文字符、英文字符与数字的对应关系
2bytes起步存储中文(生僻字使用更多字节)
1bytes存储英文
韩国:开发了一套韩文编码表--Euc_kr码:内部记录了韩文字符、英文字符与数字的对应关系
日本:开发了一套日文编码表--shift_JIS码:内部记录了日文字符、英文字符与数字的对应关系
ps:此时的各国计算机文本文件无法直接交互 会出现乱码的情况
第三阶段:天下统一(unicode出现,使之各国文本文件可以交互)
万国码(unicode):兼容各国字符 >>>所有字符全部使用 2bytes起步存储
utf家族(是unicode的优化版本) >>>utf8 :英文采用1 bytes ,其他统一采用 3bytes
ps:内存使用 unicode ; 硬盘使用 utf8
字符编码实操
1.只有字符串可以参加编码解码,其他数据类型得先转换为字符串才可以
2.解决乱码:用什么编码存的就用什么编码解
3.编码 str.encode()与 解码 str.decode()
编码:将人类的字符转换为计算机可识别的字符
解码:将计算机可识别的字符转换位人类的字符
4.实例
s1 = 'hello word ! 欢迎光临'
# 编码
res1 = s1.encode('utf8')
print(res1) # b'hello word ! \xe6\xac\xa2\xe8\xbf\x8e\xe5\x85\x89\xe4\xb8\xb4'
# 解码
res3 = res1.decode('gbk')
print(res3) # 乱码
res2 = res1.decode('utf8')
print(res2) # hello word ! 欢迎光临
5.python2与python3解释器层面
python2默认的编码是ASCII码
需要增添两个步骤:
1.文件头添加 '# coding:utf8'
2.定义字符串 需要在字符串前+'u' eg:u'字符串'
python3默认的编码就是utf8
文件操作的简介
1.文件操作:通过编写代码 自动对文件进行读写功能
2.文件:是操作系统暴露给用户操作计算机硬盘的快捷方式
过程:双击文件图标是从硬盘加载数据到内存,写入文件保存就是将内存中的数据弄到硬盘
3.文件操作:
方式1:open(文件路径,读写模式,字符编码)
f = open('a.txt','r',encoding='utf8')
data1 = print(f.read())
f.close()
方式2:
with open('a.txt','r',encoding='utf8') as f1:
print(f1.read()
4.针对文件路径需要注意:可能存在特殊含义(字母与撬棍组合) 在字符串的前面加字母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']
dic1 = {}
for i in l1:
num=l1.count(i)
dic1[i] = num
print(dic1)
2.编写员工管理系统
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
提示:用户数据有编号、姓名、年龄、岗位、薪资
数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
dict1 = {}
num = 0
while True:
print("""
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据 """)
choice = input('请输入你的指令:>>>').strip()
if choice =='1':
name = input("请输入你的姓名").strip()
age = input("请输入你的年龄").strip()
job = input("请输入你的岗位").strip()
salary = input("请输入你的薪资").strip()
dict2 = {'name':name,'age':age,'job':job,'salary':salary}
num += 1
dict1[num] = dict2
print(dict1)
elif choice == '2':
num1 = input("请输入想要修改的员工薪资的员工编号").strip()
num1 = int(num1)
if num1 in dict1:
salary1 = input("请输入想要修改的薪资额:").strip()
dict1[num1]['salary'] = salary1
print(dict1)
print("修改成功")
else:
print("没有这个员工")
elif choice == '3':
num2 = input("请输入想要查看的员工编号").strip()
num2 = int(num2)
if num2 in dict1:
print(dict1[num2])
else:
print("没有这个人")
elif choice == '4':
print(dict1)
elif choice == '5':
num3 = input("请输入想要删除的员工编号").strip()
num3 = int(num3)
if num3 in dict1:
del dict1[num3]
print("删除成功")
else:
print("没这个人")
else:
print("请输入正确的指令")
标签:编码,dict1,字符,回收,垃圾,print,引用 来源: https://www.cnblogs.com/luonacx/p/16420680.html