python学习Day12

Day 12

今日内容概要

  • 垃圾回收机制(理论)
  • 字符编码概述(理论)
  • 字符编码相关操作
  • 文件操作

今日内容详细

1.垃圾回收机制(理论)

   '能自动帮助管理程序运行中产生的垃圾数据'
''''python会自动帮你申请和释放内存空间
    别的编程语言需要自己申请或释放''''
策略1.引用计数
    当数据值身上的引用计数不为0表示该数据值还有用,不会删除
    当数据值身上的引用计数为0,则会被垃圾回收机制回收
  name = 'jason' #数据值jason身上的引用计数就是1
  name1 = name #数据值jason身上的引用计数就是2
  del name1 #数据值jason身上的引用计数变为1 
  #删除name1(就是解除绑定关系)
    '引用计数中有一个循环引用的问题
    
      #循环引用
    l1 = ['jason', ]
    l2 = ['kevin', ]
    l1.append(l2)  # 引用计数为2
    l2.append(l1)  # 引用计数为2
    del l1  # 解除变量名l1与列表的绑定关系 列表引用计数减一
    del l2  # 解除变量名l1与列表的绑定关系 列表引用计数减一
    
策略2.标记清除
    专门用来解决循环引用的问题,将内存中程序产生的所有数据值全检查一遍,对存在循环引用(两个数据值循环引用,没有变量名)的打上标记之后一次性清除
    #标记清除是每隔一段时间就把所有数据排查一遍资源消耗过大

策略3.分代回收
    #为了减轻垃圾回收机制的资源损耗,开发了三代管理,越往下检测频率越低用于节省资源
    类似于在学校,差学生每隔5分钟检查一下,中学生每隔15分钟检查一次,好学生每隔45分钟检查一次
    区分数据是看该数据值引用计数多与少来判断是否频繁在使用

2.字符编码概述(理论)

字符编码简介:

 #只有文本文件才有字符编码
 #计算机内部存储数据的本质是二进制,也就是计算机只认识0和1
 #我们打出的字为什么可以被计算机识别是因为中间有一个转换关系
 #转换关系不能随意更改,应有统一标准。字符编码表就是记录了人类的字符与数字的对应关系

字符编码发展阶段

一:一家独大
    由于计算机时美国发明的,所以一开始只有美国有字符编码,用来让计算机识别英文字符
    ASCII码:内部用来记录英文字符与数字的对应关系
      1字节bytes来存储字符
     A~Z 65~90
     a~z 97~122
二:群雄割据
   各国开始创建自己的字符编码
    中国:GBK码,记录中文、英文与数字的对应关系
          2字节存储字符  1字节存储英文
    韩国:Euc_kr码,记录韩文、英文与数字的对应关系
    日本:shift_JIS码,记录日文、英文与数字的对应关系
   ps:此时各国计算机文本文件无法直接交互数据,会出现乱码
三:天下一统
     万国码(unicode):兼容多个国家字符与数字的对应关系
         但是所有字符都是采用2字节起步存储
     后来utf家族发布了万国码的优化版>>>utf8
          英文1bytes   其他采用3bytes
   ps:目前内存使用unicode  硬盘使用utf8

3.字符编码相关操作

'''只有字符串可以参与编码解码,其他数据类型需要先转换成字符才可以'''
1.解决乱码的措施:
    当初以什么编码存的就用什么编码解
2.编码与解码
    编码:人类的字符>>计算机的字符
          将人类的字符按照指定的编码转换成计算机可识别的数字
    解码:计算机的字符>>人类的字符
          将计算机可识别的数字按照指定的编码转换成人类的字符
  
 编码的方法:(只有字符串可以使用这两种方法)
    (一):
      s1 = '张三aaaaa'
      res = s1.encode('utf8')#不做特殊说明时都用utf8
      print(res)# b'\xe5\xbc\xa0\xe4\xb8\x89aaaaa'
      '''
      b 就是bytes类型,在python中该类型可以直接当作二进制
      '''
    (二):
       '当要编码的内容都是纯英文或者数字时可以简写'
       print(b'hello my baby')#在字符前加b即可
 解码的方法:
      res1 = res.decode('utf8')
      print(res1)#张三aaaaa
        
3.解释器层面
  1)python2默认的编码是ASCII码
      如果想用python2使用utf8则需要:
       1.文件头(文件最上方)加一句
          # coding:utf8
       2.每一个字符串前加u
          print(u'你好你好')
   2)python3默认的编码是utf8码

4.文件操作

1.什么是文件操作?
    通过编写代码来自动操作文件的读写
2.什么是文件?
   #双击文件图标就是从硬盘加载数据到内存
   #写文件之后保存的就是将内存中的数据放到硬盘中
   文件就是操作系统暴漏给用户操作计算机硬盘的快捷方式之一 
3.如何用代码操作文件?
 方式一:
   open(文件路径,读写模式,字符编码)#字符编码一般写utf8
   eg:
    res = open('a.txt''r',encoding='utf8')
    print(res.read())#读取该文件的内容
    print(res.close())#关闭该文件
    
 方式二:(建议)
    with open() as 变量名:
        子代码运行结束后自动调用close()方法
    eg:
    with open('a.txt','r',encoding='utf8') as res1:
        print(res1.read())#好处在于自动调用close()方法
 4. 针对文件路径需要注意:
     可能存在特殊含义(字母与撬棍的组合)
	#在字符串的前面加字母 r 即可取消特殊含义
   eg:
    with open(r'D:\a.txt','r',encoding='utf8') as res1:

作业:

1.统计列表中每个数据值出现的次数并组织成字典
	eg: l1 = ['jason','jason','kevin','oscar']
      结果:{'jason':2,'kevin':1,'oscar':1}
        
————————————————————————————————————————————————————————————————
方式一:
l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin']
dict = {}
for i in l1:#i循环打印l1的值
    dict[i]=l1.count(i)#新增键值对(存在就修改,不存在就新增)=统计l1各个值出现的次数
print(dict)

————————————————————————————————————————————————————————————————       
方式二:        
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
#1.先产生一个空字典
data_dict={}
#2.统计出现的次数前需先取出所有数据值(用for循环)
for name in l1:
#3.判断当前数据值是否已经存在字典的k中,如果不存在就新增一个键值对,如果存在则让该键对应的值自增1
    if name not in data_dict:
        data_dict[name]=1#新增一个键值对
    else:
        data_dict[name]+=1#获取键对应的值并自增1
print(data_dict)        
2.编写员工管理系统
    1.添加员工信息
    2.修改员工薪资
    3.查看指定员工
    4.查看所有员工
    5.删除员工数据
	 提示:用户数据有编号、姓名、年龄、岗位、薪资
    数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
            
———————————————————————————————————————————————————————————————————————————

d1={}#创建一个字典1用来存储用户信息
num=0#创建一个变量名做为员工编号
while True:
    print('''     ------------
     1.添加员工信息
     2.修改员工薪资
     3.查看指定员工
     4.查看所有员工
     5.删除员工数据
     ------------''')
    zl=input('请输入您的指令:').strip()#获取用户指令
    if zl == '1':
        name = input('请输入员工姓名:').strip()
        age = input('请输入员工年龄:').strip()
        job = input('请输入员工岗位:').strip()
        salary = input('请输入员工薪资:').strip()
        num += 1 #编号自增1
        d2={'工号':num,'name':name,'age':age,'job':job,'salary':salary}#创建一个字典2
        d1[num]=d2 #字典1的K键为该员工编号,V值为字典2的员工详细信息
        print(f'员工{name}已添加成功')
        print(d1)
    elif zl == '2':
        num=input('请输入员工编号:').strip()
        if not num.isdigit():#判断如果用户输入不是纯数字
            print('编号必须是纯数字')
            continue#跳出返回上一步
        else:
            num = int(num)#将字符串改为int类型整数
        if num in d1:#判断员工编号是否在字典1中
            new_salary=input('请输入要修改的薪资:').strip()
            if new_salary.isdigit():#判断用户输入的薪资是否是纯数字
                d1[num]['salary']=new_salary#修改字典V值
                print('修改薪资成功')
            else:
                print('请输入正确薪资')
        else:
            print(f'员工编号{num}不存在')
    elif zl == '3':
        cknum=input('请输入您要查看的员工编号:').strip()
        if not cknum.isdigit():#判断用户输入员工编号是否是纯数字
            print('编号必须是纯数字')
            continue#跳出返回上一步
        else:
            cknum = int(cknum)#将字符串改为int类型
            # print(d1.get(cknum,'该员工信息不存在'))#字典取值 当k不存在时返回自己编辑的内容
            d2=d1.get(cknum)#根据员工编号获取用户字典
            print(f"""
    -------{d2.get('name')}个人资料-------
        编号:{d2.get('工号')}
        姓名:{d2.get('name')}
        年龄:{d2.get('age')}
        职业:{d2.get('job')}
        薪资:{d2.get('salary')}
    ------------------------
            """)
    elif zl == '4':
        d2=d1.values()#获取字典所有的V值
        for i in d2:#循环获取每一个员工字典
            print(f"""
    -------{i.get('name')}个人资料-------
        编号:{i.get('工号')}
        姓名:{i.get('name')}
        年龄:{i.get('age')}
        职业:{i.get('job')}
        薪资:{i.get('salary')}
    ------------------------             
            """)
    elif zl == '5':
        del_num=input('请输入您要删除的员工编号:').strip()
        if not del_num.isdigit():#判断如果用户输入不是纯数字
            print('编号必须是纯数字')
            continue#跳出返回上一步
        else:
            del_num = int(del_num)#将字符串改为int类型整数
        if del_num in d1:#如果要删除的编号在字典1中
            del d1[del_num]#删除该k键
            print(f'员工编号{del_num}信息已删除')
        else:
            print(f'员工编号{del_num}不存在')
    else:
        print('指令输入错误,请重新输入')
posted @   逢诱  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示