垃圾回收机制、字符编码解码和文件操作简述

垃圾回收机制

''' 在python中它会自动帮你申请和释放内存空间'''
# 1.引用计数
	当数据值身上的引用计数不为0的时候,说明有变量与它还在绑定,不会被删
	当数据值身上的引用计数为0的时候,在python中说明它为'垃圾',会被垃圾回收机制回收
	name1 = 'jason' # 数据值jason身上的引用计数就为1
	name2=name1  #数据值jason身上的引用计数就为2
	del name2  # 数据值jason身上的引用计数就为1
'''但是引用计数有一个无法解决的问题:循环引用'''
# 2.标记清零
	虽然引用计数无法解决'循环引用'这个问题,但是通过标记清零可以解决
	它主要是通过将内存中所有的数据值全部检查一遍,看是否有循环引用,如果有,搭上标记,然后检查完一次性删除
	# 循环引用
	l1 = ['jason']
	l2 = ['osan']
	l1.append(l2)  # 引用计数为2
	l2.append(l1)  # 引用几乎为2
	print(l1,l2)  # ['jason', ['osan', [...]]] ['osan', ['jason', [...]]]
	# 以上会造成内存泄露
	del l1  # 解除变量名l1与列表的关系,引用计数减1
	del l2  # 解除变量名l2与列表的关系,引用计数减1
3.分代回收
	因标记清除每隔一段时间就需要将整个数据排查一边,对资源消耗及占用过高
	为了对资源管理进行优化,开发了三代管理
	# 第一代:对象刚被创建时被放的代。每5分钟排查一次,经过一次次排查后,该数据值还有用就会被放入第二代
	# 第二代:在第二代中经常有用的数据值就会被放入第三代,每15分钟检查一次
	# 第三代:每45分钟检查一次

字符编码简介

1.只有文本文件才有字符编码的关系
2.计算机内部存取数据的本质>>>:二进制
	计算机其实只认识0和1
3.为什么我们在使用计算机的时候可以随意敲出各国文字
	肯定存在一个人类字符与数字的转换关系
4.转换关系不能随便更改  应该有统一的标准
	字符编码表:记录了人类的字符与数字的对应关系

字符编码发展史

'1.一家独大'
计算机是由美国人发明的  美国人需要让计算机识别英文字符
ps:英文所有的字符加起来不超过127个(2的7次方) 但是美国人考虑到后续可能出现新的字符,所以加了一位已备不时之需(2的八次方)
	ASCII码:内部只记录了英文字符与数字的对应关系
	# 1bytes来存储字符
	# A-Z  65-90
	# a-z   97-122
ps:此时的计算机只能识别英文   不能识别其他文字

'2.群雄割据'
中国
   需要让计算机识别中文  需要开发一套中文的编码表
   GBK码:内部记录了中文字符、英文字符与数字的对应关系
   2bytes起步存储中文(遇到生僻字使用更多字节)
   1bytes存储英文
韩国
  需要让计算机识别韩文  需要开发一套韩文的编码表
  euc_kr码:内部记录了韩文字符、英文字符与数字的对应关系
...
'3.天下一统'
万国码(unicode):兼容万国字符
   所有的字符全部使用2bytes起步存储
   # utf家族(针对unicode的优化版本)>>>:utf-8
   英文还是采用1btyes
   其他还是采用3bytes
ps:内存使用unicode  硬盘使用utf8

字符编码实操

"""只有字符串可以参加编码解码  其他数据类型需要先转换成字符串才可以"""
1.解决乱码的措施
    当初以什么编码存的就以什么编码解
	
2.编码与解码
    编码(人类的字符>>>计算机的字符)
        将人类的字符按照指定的编码转换成计算机可以识别的数字
        将计算机能够识别的数字按照指定的编码成换成人类可以读懂的字符
		s1 = '好好'
# 编码
res = s1.encode('utf8')
print(res)  # b'\xe5\xa5\xbd\xe5\xa5\xbd'
# 解码
res1 =res.decode('utf8')
print(res1)  # 好好

3.解释器层面
    python2默认的事编码ASCII码
        1.文件头: # coding:utf8
	2.定义字符串:需要在字符串的前面加u

文件操作简介

# 1.文件操作:通过编写代码自动操作文件读写

# 2.什么是文件:
    双击文件图标是从硬盘加载数据到内存
    写文件之后保存其实就是将内存中的数据刷到硬盘
    文件其实是操作系统暴露给用户操作计算机硬盘的快捷方式之一

# 3.如何代码操作文件
    open('文件路径','读写模式',字符编码)
    
    方式1:
        f  = open()
        f.close()
    方式2
	with open() as 变量名:
	子代码运行结束之后自动调用close()方法
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']
l1_dict = {}
count = 1
for i in l1:
        l1_dict[i] = l1.count(i)
print(l1_dict)


"""
2.编写员工管理系统
    1.添加员工信息
    2.修改员工薪资
    3.查看指定员工
    4.查看所有员工
    5.删除员工数据
	 提示:用户数据有编号、姓名、年龄、岗位、薪资
    数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
"""

def add_user():
            user_id = input('请输入用户编号:').strip()
            user_name = input('请输入用户姓名:').strip()
            user_age = input('请输入用户年龄:').strip()
            user_job = input('请输入用户岗位:').strip()
            user_salary = input('请输入用户工资:').strip()
            emp_user = {'uid':user_id,'uname':user_name,'uage':user_age,'ujob':user_job,'usalary':user_salary}
            if user_id not in user_info:
                user_info[user_id] = emp_user
                print(f"用户{emp_user['uname']}添加成功")
            else:
                print('用户已经存在')
def change_user():
            id_modify = input('请输入你要修改的员工编号:').strip()
            salary_modify = input('请输入要修改的薪资:').strip()
            if id_modify  in user_info:
                user_info[id_modify]['usalary']=salary_modify
                print(f"用户名{user_info[id_modify]['uname']}的薪资修改成功,修改后的薪资为{user_info[id_modify]['usalary']}")
            else:
                print('对不起,该用户不存在')
def chick_specified_user():
            id_specified = input('请输入你要查看的用户编号').strip()
            if id_specified not in user_info:
                print('对不起,该用户不存在')
            else:
                print(f"""-----------用户编号--{id_specified}--的个人信息-----------
            --------姓名:{user_info[id_specified]['uname']},年龄{user_info[id_specified]['uage']},岗位{user_info[id_specified]['ujob']},工资:{user_info[id_specified]['usalary']}-------""")
def chick_all_user():
            users_info = list(user_info.values())
            for i in users_info:
                print(f"""---------------用户{i['uid']}的个人信息如下-----------------
                  ---用户姓名:{i['uname']},年龄:{i['uage']},岗位:{i['ujob']},薪资:{i['usalary']}---
            -----------------------------------------------------""")
def del_user():
            id_del = input('请输入你要删除的用户编号').strip()
            if id_del in user_info:
                user_info.pop(id_del)
                print(f'用户{id_del}删除成功')
            else:
                print(f'用户{id_del}不在系统内')
user_info = {}
while True:
    print("""
        1.添加员工信息
        2.修改员工薪资
        3.查看指定员工
        4.查看所有员工
        5.删除员工数据
    """)
    choice = input('Please choice function of number>>>:')
    if choice == '1':
        add_user()
    elif choice == '2':
        change_user()
    elif choice == '3':
        chick_specified_user()
    elif choice == '4':
        chick_all_user()
    elif choice == '5':
        del_user()
    else:
        print('Pleace enter a number only 1 to 5')



posted @ 2022-06-28 16:45  荀飞  阅读(30)  评论(0编辑  收藏  举报