ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-06-28 19:03:42  阅读:185  来源: 互联网

标签:编码 dict1 字符 回收 垃圾 print 引用


垃圾回收机制

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有