其他分享
首页 > 其他分享> > 垃圾回收机制、字符编码、文件操作简

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

作者:互联网

垃圾回收机制

垃圾回收机制是用来回收不可用的变量值所占用的内存空间,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