垃圾回收机制、字符编码及文件操作
垃圾回收机制、字符编码及文件操作
垃圾回收机制
在之前有提到过垃圾数据,垃圾数据就是数据值没有绑定名字却占用了内存地址。垃圾回收机制可以理解为回收内存,把不需要的内存清理,释放计算机的内存空间。
1、引用计数
当数据值绑定一个变量名时,代表它被引用了,每绑定一个变量名引用的次数加一。计算机会自动清除没有绑定变量名引用计数为0的数据值。
''' 引用计数有一坑,循环引用 '''
l1 = ['apple', ] # l1引用计数加一
l2 = ['banana', ] # l2引用计数加一
l1.append(l2) # l1引用计数加一,引用计数总共为2
l2.append(l1) # l2引用计数加一,引用计数总共为2
print(l1) # ['apple', ['banana', [...]]]
print(l2) # ['banana', ['apple', [...]]]
del l1 # l1引用计数减一,但是其实l1打印输出已不存在
del l2 # l2引用计数减一,但是其实l2打印输出已不存在
2、标记清除
计算机会将所有的数据值检查一遍,对于可能会产生循环引用的对象重点关注并检查引用计数,给引用计数为0做上标记,之后一次性清除。
3、分代回收
可将数据值分为几个阶段,第一阶段为不为频繁使用的数据值,第二阶段较为频繁使用的数据值,第三阶段为频繁的使用的数据值。计算机根据这些使用数据值的次数对各阶段清理的频率有所不同。越为频繁的数据值清理的次数较少。越有活力,活的越久。
字符编码
1、字符编码的简介
字符编码主要研究的是文本文件,文件编辑器读取文件内容时首先双击打开启动,将文件内容从硬盘读入内存,然后将读入的内存的内容显示到屏幕上。不同的应用程序对文本文件的处理是不一样的。
计算机内部存储数据的本质是二进制,因为计算机只认识数字0和1。在于计算机交互时,用的是我们能够读懂理解的语言。
使用计算机过程中,可以使用不用的语言与计算机交流,这就存在语言与数字之间的转换关系。转换关系是不能随便更改的,需要统一的标准就是字符编码。
2、字符编码发展史
1.一家独大
计算机是美国人发明的,由于计算机只认识0和1于是定义了字符编码,但是只记录了英文字符与数字之间的对应关系。
ASCII码,内部只记录英文字符和数字之间的对应关系。
2.群雄割据
之后越来越多的国家都使用计算机后,各个国家开发了属于自己国家的字符编码。
中国:GBK码,内部记录了中文字符、英文字符与数字之间的对应关系。2bytes起步存储中文,若是生僻字需要更多的字节,1bytes存储英文 。
韩国:Euc_kr码,内部记录了韩文字符、英文字符与数字之间的对应关系。
日本:shift_JTS码,内部记录了日文字符、英文字符与数字之间的对应关系。
3.一统天下
各个国家的字符编码不一样,在交流时会出现乱码的情况,那么就需要统一的标准使每个国家的语言都有与数字的对应关系,又能够彼此之间交互。
万国码:unicode,兼容各个国家的字符。原有的字符全部使用2bytes起步存储。
UTF家族,是针对unicode的优化版本,常用的是utf-8。英文1bytes存储,其它统一3bytes存储字符。
内存使用的是Unicode,硬盘使用utf8。
3、字符编码实操
1.解决乱码
解决乱码的措施是以什么编码存储的就以什么编码解码。相当于图片的只能以图片工具打开,是不能用文本文件打开。解铃还须系铃人。
2.编码与解码
编码:将人类可以读懂的字符按照指定的编码形式转换成计算机能够读懂的语言(数字)。简记:人类的字符转换成计算机的字符。关键字:encode.
解码:将计算机能够读懂的语言(数字)按照指定的编码形式转换成人类可以读懂的字符。简记:计算机的字符转换成人类的字符。关键字:decode。
'''在python中bytes类型的数据可以直接看成二进制数据'''
s1 = '每天都要努力一点,追赶他人。'
res = s1.encode('utf8') # 编码
print(res, type(res)) # 看不懂的一串字符 b'\xe6\xaf\...\x80\x82' <class 'bytes'>
res2 = res.decode('utf8') # 解码
print(res2, type(res2)) # 每天都要努力一点,追赶他人。 <class 'str'>
print(res.decode('utf8')) # 解码 每天都要努力一点,追赶他人。
3.解释器
python2:默认的编码是ASCII码。因为python2开发的时间比Unicode开发的时间早。
1.文件头
# coding:utf8
# -*- coding:utf8 -*- 好看,功能一样
2.字符串
u'数据值' u"数据值" u'''数据值''' u"""数据值"""
左引号的左边一定要写u,补救措施,没得办法。
文件操作
1、文件操作简介
1.文件操作
通过编写代码自动操作文件的读写,在自动化时代这是非常重要的,可批量操作文件。
2.文件是什么
双击文件图标从硬盘加载数据到内存中,写文件保存就是将内存中的数据刷到硬盘,文件是计算机让用户操作计算机硬盘的快捷方式之一。文件就是保存数据存放在硬盘中。
3.操作文件
1.打开文件
open(文件路径, 读写模式, 字符编码)
方式一:自己打开,自己关
变量名 = open()
变量名.close()
res = open('a.txt', 'r', encoding='utf8') # 打开文件并绑定一个名字
print(res.read())
res.close() # 手动关闭,避免占用内存
方式二:自己打开,自动关
with open() as 变量名:
子代码运行之后自动关闭文件
with open('a.txt', 'r', encoding='utf8') as res: # 打开文件绑定名字
print(res.read()) # 打印读出的文件内容,冒号换行后缩进
4.针对文件路劲,存在特殊含义字母
当打开计算机中的某个路径中的文件时,一定要注意斜杆与字母的组合,如\n是换行符。若想取消这些组合的特殊含义要在字符串前面加字母r,取消特殊含义。
with open('D:\StudyProject\n\b.txt', 'r', encoding='utf8') as res: # 打开文件绑定名字
print(res.read()) # 报错
with open(r'D:\StudyProject\n\b.txt', 'r', encoding='utf8') as res: # 打开文件绑定名字
print(res.read()) # 小鞠要努力啊
作业
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']
# 定义一个空集合
new_dict = {}
# 循环列表中的值
for i in l1:
# 判断列表中的值是否在空列表中
if i in new_dict:
new_dict[i] += 1 # 如果存在,数值加一,绑定新的值
else:
new_dict[i] = 1
print(new_dict)
2.编写员工管理系统
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
提示:用户数据有编号、姓名、年龄、岗位、薪资
数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
# 1.定义一个空字典模拟数据库
name_list ={}
while True:
# 2.提示用户有什么功能
print("""
1.添加用员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
""")
# 3.获取用户输入的指令
choice = input('请输入你的命令:').strip()
# 3.判断用户的指令
if choice == '1':
# 3.1获取用户输入的用户名
username = input('请输入添加的用户名:').strip()
# 3.2判断当前用户名是否存在
if username in name_list:
print('该员工已存在')
else:
# 3.3获取用户输入的工资
salary = input('请输入员工的工资:').strip()
number = input('请输入员工的编号:').strip()
age = input('请输入员工的年龄:').strip()
age = int(age)
post = input('请输入员工的岗位:').strip()
# 3.4转换成整型
salary = int(salary)
# 3.5将用户名和工资也键值对的形式添加到空字典,更新不存在的K值就是添加
name_list.update({'username': username})
name_list.update({'salary': salary})
name_list.update({'age': age})
name_list.update({'post': post})
print(f'用户名:{username}添加成功')
print(name_list)
# 4.获取用户的指令
elif choice == '2':
# 4.1获取用户输入的用户名
username = input('请输入要修改的员工姓名:').strip()
# 4.2判断用户名是否存在
if username not in name_list:
print('该用户不存在!')
else:
# 4.3获取用户输入的工资
salary = input('请输入修改员工的薪资为:')
salary = int(salary)
# 4.4将获取的工资更新
name_list.update({'salary': salary})
print('修改成功')
print(name_list)
# 5.获取用户的指令
elif choice == '3':
# 5.1获取用户输入的用户名
username = input('请输入要查看的员工姓名:').strip()
# 5.2判断用户名是否存在字典中
if username in name_list:
# 打印获取的员工的信息
print(f"""
---------------info--------------
username:{username}
salary:{salary}
---------------------------------
""")
else:
print('该用户不存在!')
# 6.获取用户的指令
elif choice == '4':
# 循环字典中的用户名,循环打印出
for username in name_list:
print(f"""
---------------info--------------
username:{username}
salary:{salary}
---------------------------------
""")
# 7.获取用户指令
elif choice == '5':
# 7.1获取用户输入的姓名
target_name = input('请输入你想要删除的姓名:').strip()
# 7。2判断用户名是否存在字典中
if target_name not in name_list:
print('不存在这个员工,无法删除')
continue
# 若用户名存在,删除K值,可删除整个键值对
name_list.pop(target_name)
print('删除成功')
# 8.若用户输入的指令不存在提示用户
else:
print('无法执行你的命令')

浙公网安备 33010602011771号