- 垃圾回收机制(理论)
- 字符编码概述(理论)
- 字符编码相关操作
- 代码操作文件
1.引用计数python会自动帮你申请和释放内存空间
概念:
当数据值身上的引用计数不为0即变量绑定值为零时,表示该数据值还有用,不会被删除。
当数据值身上的引用计数为0则会被垃圾回收机制回收。
代码展示:
name = 'jason' # 数据值jason身上的引用计数就是1 name1 = name # 数据值jason身上的引用计数就是2 del name1 # 数据值jason身上的引用计数变为1
画图解释:
2.标记清除缺陷:
容易被循环引用
概念:
用于解决循环引用问题,将内存中陈序产生的所有数据值全部检查一遍,对于存在循环引用的数据值做标记,最后统一清除。
代码展示:
l1 = ['jason', ] l2 = ['kevin', ] l1.append(l2) # 引用计数为2 l2.append(l1) # 引用计数为2 del l1 # 解除变量名l1与列表的绑定关系 列表引用计数减一 del l2 # 解除变量名l1与列表的绑定关系 列表引用计数减一
画图解释:
3.分代回收缺陷:
标记清除每隔一段时间就需要将所有有数据重新排查一遍,资源消耗过大
概念:
为减轻垃圾回收机制的资源损耗,开发出三代管理:
初生代————青春代————老年代
画图解释
字符编码概述 1.字符编码简介越往下检测的频率越低,节省资源损耗!!!
2.字符编码发展史字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。
2.1.最开始为美国人发明的ASCII码,内部只记录了英文字符与数字的对应关系.
存储字符:1bytes
2.2.而后又有一些国家发明了适用于自己国家语言的编码表。
中国的GBK码:内部记录了中文字符、英文字符与数字的对应关系
2bytes起步存储中文(遇到生僻字使用更多字节)
1bytes存储英文
韩国的Euc_kr码:内部记录了韩文字符、英文字符与数字的对应关系
日本的shift_JIS码:内部记录了日文字符、英文字符与数字的对应关系
这也导致了各国计算机文本文件无法直接交互,出现乱码的情况!!!
字符编码相关操作 1.编码与解码2.3.为了解决乱码问题,先后出现了适用于各个语言的编码表
万国码(unicode):兼容万国字符
所有的字符全部使用2bytes起步存储
utf家族(针对unicode的优化版本)>>>:utf8
英文还是采用1bytes
其他统一采用3bytes
1.1:为什么要进行编码与解码?
举个例子,这里我们不妨将人类可以很容易理解的字符作为“明文”,将人类的明文加密成不易懂但是更易于存储和传输的消息字节作为“密文”。那么编码和解码的关系如下: 明文就是人类可以直接一眼就看得懂的字符,密文就是明。文被加密后一般人无法立马看懂的字节。
1.2:编码:
所以人类看的懂的字体符号简称字符,要想让机器看的懂并且按照我们的命令去执行,那就得先编码成机器看的懂的话,也就是编译成字节码,把字符编译成字节的过程叫做编码。
1.3 :解码:
机器看的懂的话,或者机器按人类的命令操作返回了一些结果,人类看不懂啊,也得进行一次解码,解码成人类看的明白的字体符号(字符),把字节转为人类看的懂的现实生活里面的字符过程就是解码。
| 名称 | 方式 | 作用 |
|---|---|---|
| 编码 | encode | 将人类能够读懂的字符编码成计算机能够直接读懂的字符 |
| 解码 | decode | 将计算机能够直接读懂的字符解码成人类能够读懂的字符 |
2.解决乱码问题1.4:代码展示
># 编码 encodes1 = '编码的实操' print(s1.encode('gbk')) """ 字符串前面如果加了字母b 表示该数据类型为 bytes类型 bytes类型可以看成是二进制 """ D:Python36python36.exe "E:/pythonProject/Day09/01 6.28预习.py" b'xb1xe0xc2xebxb5xc4xcaxb5xb2xd9' Process finished with exit code 0# 解码 decode
res =b'xb1xe0xc2xebxb5xc4xcaxb5xb2xd9' print(res.decode('gbk')) """ 基于网络传输数据 数据都必须是二进制格式 所以肯定涉及到编码与解码 """ D:Python36python36.exe "E:/pythonProject/Day09/01 6.28预习.py" 编码的实操 Process finished with exit code 0
3.python解释器层面如何处理乱码的情况?
出现乱码的原因主要是因为在进行编码和解码的过程中使用的编码表不同导致的
所以编码过程中要注意编码表的正确使用!!!
因为现阶段python解释器开发时间不同,所以导致对于编码问题的处理就有了不同的方法。(这也与编码表的发展有关)
| 版本 | 方法 |
|---|---|
| python2.x | 默认的编码是ASCII码1.必须在文件的开头告诉解释器使用指定的编码2.在使用python2解释器的环境下定义字符串习惯在前面加u |
| ython3.x | 解释器默认的编码是utf-8 |
2.如何操作文件?文件就是把一些数据存起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
文件其实是操作系统暴露给用户操作计算机硬盘的快捷方式之一!!!
2.2:打开文件、创建文件
# open(文件路径,读写模式,字符编码) W = open(‘a.txt’,’w’) #没有找到‘a.txt’文件,所以新建了‘a.txt’文件
作业提交 作业一:2.3关闭文件
方式一:f = open(“a.txt”,”w”) f.colse()#关闭这个文件方式二:
上述操作open完最后都需要执行close 而close这一行很任意被遗忘# with上下文管理(推荐使用) with open(r'a.txt', 'r', encoding='utf8') as f: # f = open() data = f.read() print(data)
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']
dict = {} # 定义一个空字典
for i in l1: # 循环取l1列表值
num1 = l1.count(i) # 利用.count关键字对列表内个数据值进行统计
dict[i] = num1 # 将统计值赋值给字典内K值i
print(dict)
作业二:
2.编写员工管理系统
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
提示:用户数据有编号、姓名、年龄、岗位、薪资
数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
# 作业二
user_dict = {'001':{'name':'jaosn','age':'19','job':'boos','salary':'50k'}}
while True: # 定义一个循环
# 添加一个用户提示功能
print("""
1.添加员工信息
2.修改员工薪资
3.查看指定员工
4.查看所有员工
5.删除员工数据
6.退出程序
""")
while True:
choice = input('please input your choice>>>:').strip() # 获取用户输入指令
if choice == '1':
user_id = input('please input your user_id>>>:').strip() # 获取用户编号
if user_id not in user_dict: # 判断输入用户编号是否存在
user_name =input('please input your user_name>>>:').strip()
user_age = input('please input worker age>>>:').strip()
user_job = input('please input worker job>>>:').strip()
user_salary = input('please input worker salary>>>:').strip()
new_dict = user_dict.fromkeys([user_id],{'name':user_name,'age':user_age,'job':user_job,'salary':user_salary}) # 添加字典数据值到新字典中
user_dict.update(new_dict) # 新字典赋值给原来的字典
print(f'员工:{user_id}添加成功')
continue
elif choice == '2':
user_id = input('please input your want to change id>>>:')
if user_id in user_dict:
user_dict[user_id]['salary'] = input('请输入您修改后的金额>>>:') # 修改字典中数据值
print('您已成功修改他的薪资')
else:
print('请重新输入!!!')
continue
elif choice == '3':
user_id = input('please input your worker id>>>:')
if user_id in user_dict: # 查看字典中某一数据值
print(f"""
=============info================================
id:{user_id},name:{user_dict[user_id]['name']},age:{user_dict[user_id]['age']},job:{user_dict[user_id]['job']},salary:{user_dict[user_id]['salary']}
=================================================
""")
continue
elif choice == '4':
for user_id in user_dict: # for循环查看字典中所有数据值
print(f"""
=============info=================================
id:{user_id},name:{user_dict[user_id]['name']},age:{user_dict[user_id]['age']},job:{user_dict[user_id]['job']},salary:{user_dict[user_id]['salary']}
==================================================
""")
continue
elif choice == '5':
target_user = input('please input your target_user>>>:').strip()
if target_user in user_dict: # 删除字典中某一数据值
user_dict.pop(target_user)
print(f'已删除用户{target_user}')
else:
print('请重新输入要删除的员工编号!!!')
continue
elif choice == '6':
break # 结束程序
else:
print('请输入正确的指令!!!')
break



