python基础7 垃圾回收与字符编码

514 阅读6分钟

垃圾回收机制

  • 对于垃圾回收机制,我们需要掌握三点:

1.引用计数

# 1.我们创建一个变量名,给这个变量名进行赋值。
# 2.此时由于变量名只绑定了一个数据值,所以此刻数据值的引用计数就为1
age = 21
# 3.我们依照刚才步骤,再次创建一个新变量名,给其赋值给原变量名。
# 4.此刻新旧变量名都与数据值21进行了绑定。所以此刻数据值引用计数就为2
age = 21
age1 = age 
# 5.当我们删除新变量名后,数据名与新变量名断开绑定。
# 6.此刻数据值又只被原来的变量名绑定。引用计数就为1
age = 21
age1 = age   
del age1
  • 对循环引用,使用引用计数处理会使其留有垃圾数据。不推荐对其使用。

2.标记清除

  • 将所有数据值筛查一遍,找到其中的循环引用,标记后直接删除,这就是标记清除。
# 1.定义两个变量
item = ['tom', ]
item1 = ['juzi', ]
# 2.在变量中添加数值
item.append(item1)   # item里面被新添加了数据值,所以引用计数为2
item1.append(item)   # item1里面被新添加了数据值,所以引用计数为2
# 3.标记变量名,删除与列表的绑定关系
del item             # 列表引用计数减一
del item1            # 列表引用计数减一

3.分代回收

  • 分三代管理,每代会将使用次数多的数据值给下一代,所以越往下检查的频率越低。
  • 目的是为了减轻垃圾回收机制的资源损耗。

字符编码的简介,发展,实操

简介

  • 1.只有文本文件才有字符编码的概念
  • 2.计算机内部存取数据的本质是二进制
  • 3.计算机与人类文字之间存在一个转换关系。所以我们才能敲出来汉语等语言。
  • 4.转换关系应该有统一的标准,所以字符编码表记录了人类的字符与数字的对应关系.

发展

  • 主要分为三个阶段

1.一国独大

  • 1.计算机创造的初期,美国佬为了识别英文字符,就编写了ASCII码。当时的计算机只能识别英文。1bytes来存储字符

2.遍地开花

  • 2.后面计算机传到各个国家之后,由各个国家制订编写了属于自己国家的编码。比如中国的GBK码,2bytes甚至更多来存储中文,1bytes存储英文

3.一统天下

  • 3.为了统一编码,万国码(unicode)就出来了,它能够兼容兼容各个国家的字符。由于是2bytes起步存储。对于英文存储会是文件变大很多,最后通过优化采用了utf家族(utf8)
  • ps:内存使用unicode 硬盘使用utf8

实操

  • 1.怎么解决乱码 什么形式编码存的就以什么形式编码解码
  • 2.编码与解码 编码(人类的字符>>计算机的字符)

解码(计算机的字符>>人类的字符)

  • 3.解释器层面 python2默认的编码是ASCII码 由于python2发布的时间,utf编码还没出来。所以无法直接对字符串编码。

为了补救:

1.文件头
    # coding:utf8
2.定义字符串
   需要在字符串的前面加u

python3默认的编码是utf8码

文件操作简介

文件操作

  • 通过编写代码自动操作文件读写

文件是什么

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

如何通过代码操作文件

open(文件路径,读写模式,字符编码)
方式1:
    f = open()
    f.close()
方式2:
    with open() as 变量名:
***子代码运行结束之后自动调用close()方法

特别注意

  • 针对文件的路径,当字母与\结合时,需要在字符串前面添加字母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']
l = dict()          # 定义一个空字典l
for i in l1:        
    if i in l:      # 判断元素在空字典l内
        l[i] += 1   # 每次循环让字典内次数自增1
    else:           # 元素不在空字典l内
        l[i] = 1    
print(l)

输出结果: image.png

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

自己的梳理的一些逻辑不知道对不对。


定义一个列表

1.输入正确命令进入指定模块
    
添加模块:
    1.判断员工姓名在不在列表
         1.不在列表可以添加,添加方式为字典

         2. 在列表提醒添加失败,该用户在列表内
   
 修改模块
    2.看员工在不在列表
         1.进入员工列表修改工资
         
         2.编码错误没有提示重新输入
    
查看指定员工
    3.输入员工编号姓名判断员工有没有
          1.有的话打开
  
          2.没有的话提示重新输入
   
查看所有员工
     4.打印所有列表
   
删除员工数据  
     5.输入员工编号,判断在不在里面
            1.在里面删除
     
            2.不在里面提示重新输入:
2.输入错误命令提示重新输入

没做出来,这个只是大致框架。是我太菜了,在努力了,在努力了。

l =[{'编号': '1', '姓名': 'jason', '年龄': '27', '薪资': 50000, '岗位': '金牌讲师'}]
l1 = []
while True:
    text= input("""
输入1增加员工信息
输入2修改员工薪资
输入3查看指定员工
输入4查看所有员工
输入5删除员工数据
请选择你要进行的操作:""" )
    if text == '1':
        shur = input('请输入添加的员工信息:').strip()
        if shur in l:
            print('添加失败,员工已存在')
        else:
            l1 = l.append(shur)
            print(l)
            print('添加成功')
    elif text == '2':
        shur = input('请输入修改的员工信息:').strip()
        if shur in l:
            l[0]['岗位'] = 20000
            print(l)
        else:
            print('员工信息输入不正确')
    elif text == '3':
        shur = ('请输入需要查看的员工编码').strip()
        if shur in l:
            print(l1)
        print()
    elif text == '4':
        print(l)
    elif text == '5':
        shur = input('请输入员工编码:').strip()
        if shur not in l:
            print('无该员工信息,请重新输入')
            continue
        else:
            del l[0]
    else:
        print('无效的指令,请重新输入')