ICode9

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

字符编码

2022-06-28 20:04:04  阅读:141  来源: 互联网

标签:编码 字符 员工 dict emp print id


      今日内容

  • 垃圾回收机制
  • 字符编码
  • 关于文件的一些操作
  • 作业

垃圾回收机制

1.什么是垃圾回收机制

垃圾回收机制是python解释器自带的一种机制 它专门用来回收不用的变量值所占用的内存空间

2.为什么要有垃圾回收机制

程序运行过程中会想内存申请大量的内存空间来存储变量值 而有些变量值不用时不及时处理会超出内存溢出 

导致程序崩盘 python自带了一种机制来管理这些不需要的变量值

3.垃圾回收机制的发展史

3.1引用计数

当我们定义一个变量时 数据值是会绑定到这个变量名 这个时候数据值就会有一个引用计数 数据值被绑定几次引用计数就是几个

当引用计数为零的时候 垃圾回收机制就会把这些引用计数为零的数据值回收

eg:

name = 'tony'  # 'tony'引用计数就为1
name1 = name   # 'tony'引用计数就会加一变为2
del name1  # 'tony'引用计数就会减1变为1

当一个数据值引用计数不为0时 就不会有影响
但是当引用计数为0时 该数据值就会被垃圾回收机制回收
就不会占用着内存
不过引用计数会出现一个bug>>>循环引用
循环引用会一直标记着这个数据值使这个数据一直有引用计数让垃圾回收机制回收不了

3.2标记清除

循环引用:

l1 = [1, 2, 3]  # 引用计数加一  1
l2 = [7, 8, 9]  # 引用计数加一  1
l1.append(l2)  # 引用计数加一  2
l2.append(l1)  # 引用计数加一  2
del l1  # 引用计数减一  1
del l2  # 引用计数减一  1
'''
现在l1和l2已被删除 我们已经不需要它们的数据值了
但是现在它们的数据值还在互相调用对方的数据值 使它们的引用计数一直还是1
使垃圾回收机制回收不了
'''

专门针对这个循环引用

内存会将程序中产生的所有数据值全部都检查一遍
然后将这些循环引用给标记上 然后一次性清除

3.3分代回收

标记清除每隔一段时间就会将所有数据检查一遍 这样就会太浪费资源了
为了减轻垃圾回收机制的资源损耗 开发了三个管理
越往下检测的频率越低

字符编码

1.字符编码的简介

首先要了解只有文本文件才有字符编码的概念

计算机在工作中只认识高低电平>>>1和0

可以把1和0组成许多的二进制数来表达不同的意思

计算机不认识我们人类的语言,所以我们人类定义了一个人类字符与数字的转换关系

而这些转换关系不能随便定义 所以就出现类字符编码表

2.字符编码的发展史

2.1一家独大

因为计算机是美国发明的,所以最初的字符编码只用于让计算机能够读懂英文即可 不能够支持中文和其他语言

美国发明的字符编码表叫ASCII表

一个英文字符用1bytes表示 1bytes等于8bit 8bit可以表示256个字符 而所有的英文字符只有127个 足够表示英文

 

2.2群雄割据

'''
因为ASCII表只能表示英文不能够表示中文

所以我们中国的科学家们就发明了我们自己的字符编码 能够识别中文与英文

叫做GBK 内部存储中文用2bytes存储(生僻字用更多的字节)英文还是用1bytes表示
'''

其他的国家也定义了他们国家的字符编码表比如韩国>>>euc_kr  日本>>>shift_jis

但是这个阶段会非常容易出现乱码

2.3天下一统

 因为出现了很多字符编码,当我只用gbk编写一个文本文件然后用euc_kr打开时会识别不出来,就是会出现乱码

这时候就出现了万国码:能够兼容所有国家的字符 

万国码内部统一用2bytes存储字符

这样它占用内存的空间就会变大,浪费空间,传输数据变慢

为了解决上述的问题就出现了utf家族

utf-8是现在比较流行的编码 它内部是按1bytes存储英文其他字符按3bytes存储

 3.字符编码的应用

只有字符串能够参与编码与解码 其他数据类型只能先转换为字符串才能够参与编码解码

3.1 如何解决乱码

当初用什么编码就用什么解码

3.2 编码与解码

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

  编码其实就是把人类能够读懂的字符按指定编码装换成计算机能够读懂的字符

# encode
# encode可以把人类能够读懂的字符按指定的编码转化为二进制数
s = 'jason 说我们是第一'
res = s.encode('utf8')
print(res)  # b'jason \xe8\xaf\xb4\xe6\x88\x91\xe4\xbb\xac\xe6\x98\xaf\xe7\xac\xac\xe4\xb8\x80'
'''在python中bytes的类型数据可以看成是二进制数'''

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

  解码其实就是把计算机能够读懂的字符按指定的编码解码成人类能够读懂的字符

s = 'jason 说我们是第一'
# 编码
res = s.encode('utf8')
print(res)  # b'jason \xe8\xaf\xb4\xe6\x88\x91\xe4\xbb\xac\xe6\x98\xaf\xe7\xac\xac\xe4\xb8\x80'
'''在python中bytes的类型数据可以看成是二进制数'''
# 解码
# decode能够把计算机能欧读懂的字符按指定的字符解码成人类能够读懂的字符
res1 = res.decode('utf8')
print(res1)  # jason 说我们是第一
'''当你用某个字符编码时就要用同样的字符编码解码  要不然会报错'''

3.3 解释器层面

python2默认编码是ASCII码  python3默认utf8

而我们想要在python2中编写一些中文的文本信息的话我们需要在最上方写上文件头才行
1.文件头
# coding:utf8

2.定义字符串
需要在字符串的前面加u

文件操作

1.一般我们操作文件都是通过鼠标来操作文件 但是我们可以通过代码的方式也可以操作文件

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

3.代码操作文件

# 关键字
open
# 语法结构
open(文件路径,读写模式,字符编码)
# 当我们打开一个文件必然还需要关闭文件
所以我们还需要在open下面加上close()
eg:
f = open()
f.close()
# 其实close()写不写都行但是如果不写万一文件打开过多很容易把电脑变卡
# 所以有了另一个写法
with open(文件路径,读写模式,字符编码) as f:
        子代码
# 子代码运行完之后会自动调用close()   as是关键字  f是变量名

作业

1.统计列表中每个数据值出现的次数并组织成字典战士

# 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']
# 方式一
dict_l = {}
for i in l1:
    dict_l[i] = l1.count(i)
print(dict_l)

# 方式二
dict_l = {}
for i in l1:
    dict_l.setdefault(i, l1.count(i))
print(dict_l)


# 方式三
dict_l = {}
for i in l1:
    if i in dict_l:
        dict_l[i] += 1
    else:
        dict_l[i] = 1
print(dict_l)

2.编写员工管理系统

# 2.编写员工管理系统
#     1.添加员工信息
#     2.修改员工薪资
#     3.查看指定员工
#     4.查看所有员工
#     5.删除员工数据
#      提示:用户数据有编号、姓名、年龄、岗位、薪资
#     数据格式采用字典:思考如何精准定位具体数据>>>:用户编号的作用
# 1.创建一个空字典
user_data_dict = {}
# 2.循环打印功能
while True:
    print('*********************')
    print("""
    1.添加员工信息
    2.修改员工薪资
    3.查看指定员工
    4.查看所有员工
    5.删除员工数据
    """)
    print('*********************')
    # 3.输入功能编号
    choice = input('请输入功能编号>>>:').strip()
    # 4.不能输入空格
    if len(choice) == 0:
        print('请输入正确功能编号')
        continue
    # 5.不能输入其他字符
    if not choice.isdigit():
        print('请输入数字')
        continue
    # 6.判断用户的选择
    if choice == '1':
        # 添加员工信息
        # 1.获取员工信息
        emp_id = input('请输入员工编号>>>:').strip()
        # 2.判断员工编号是否已存在
        if emp_id in user_data_dict:
            print('员工编号已存在,无法添加')
            continue
        emp_name = input('请输入员工姓名>>>:').strip()
        emp_age = input('请输入员工年龄>>>:').strip()
        emp_post = input('请输入员工岗位>>>:').strip()
        emp_salary = input('请输入员工薪资>>>:').strip()
        # 3.创建一个小字典
        data_dict = {'emp_id': emp_id, 'emp_name': emp_name, 'emp_age': emp_age, 'emp_post': emp_post,
                     'emp_salary': emp_salary}
        # 4.存入到大字典
        user_data_dict[emp_id] = data_dict
        # 5.提示信息
        print(f'员工{emp_name}添加成功')
    elif choice == '2':
        # 修改员工薪资
        # 输入修改员工的编号
        target_id = input('请输入员工编号>>>:').strip()
        # 不能输入空格
        if len(target_id) == 0:
            print('请输入正确功能编号')
            continue
        # 不能输入其他字符
        if not target_id.isdigit():
            print('请输入数字')
            continue
        # 判断员工编号是否存在
        if target_id not in user_data_dict:
            print('员工编号不存在,无法修改')
            continue
        # 提取改员工的字典
        user_dict = user_data_dict[target_id]
        # 获取新的薪资
        new_salary = input('请输入该员工新的薪资>>>:').strip()
        # 修改该员工的薪资
        user_dict['emp_salary'] = new_salary
        # 修改大字典
        user_data_dict[target_id] = user_dict
        # 提示信息
        print(f'员工编号{target_id}的薪资已修改为{new_salary}')
    elif choice == '3':
        # 查看指定员工
        # 输入员工编号
        target_id = input('请输入员工编号>>>:').strip()
        # 不能输入空格
        if len(target_id) == 0:
            print('请输入正确功能编号')
            continue
        # 不能输入其他字符
        if not target_id.isdigit():
            print('请输入数字')
            continue
        # 判断员工编号是否存在
        if target_id not in user_data_dict:
            print('员工编号不存在,无法查看')
            continue
        # 提取改员工的字典
        user_dict = user_data_dict[target_id]
        # 可以for循环也可以解压赋值
        emp_id, emp_name, emp_age, emp_post, emp_salary = user_dict.values()
        print('staff info'.center(30, '*'))
        print(f"""
           员工编号:{emp_id}
           员工姓名:{emp_name}
           员工年龄:{emp_age}
           员工岗位:{emp_post}
           员工薪资:{emp_salary}
                   """)
        print('end'.center(30, '*'))

    elif choice == '4':
        # 查看所有员工
        # print(user_data_dict)
        print(user_data_dict)
        if len(user_data_dict) == 0:
            print('没有员工信息')
        else:
            # for i in user_data_dict.values():
            #     staff,d,a,c,e = tuple(i.values())
            #     print(staff,d,a,c,e)
            # user_data_dict >>> {'1': {'emp_id': '1', 'emp_name': 'jason', 'emp_age': '18', 'emp_post': "python'", 'emp_salary': '99999'}}
            for staff in user_data_dict.values():
                emp_id, emp_name, emp_age, emp_post, emp_salary = tuple(staff.values())
                print('staff info'.center(30, '*'))
                print(f"""
        员工编号:{emp_id}
        员工姓名:{emp_name}
        员工年龄:{emp_age}
        员工岗位:{emp_post}
        员工薪资:{emp_salary}
                """)
                print('end'.center(30, '*'))
    elif choice == '5':
        # 删除员工数据
        # 输入员工编号
        delete_id = input('请输入员工编号>>>:').strip()
        # 不能输入空格
        if len(delete_id) == 0:
            print('请输入正确功能编号')
            continue
        # 不能输入其他字符
        if not delete_id.isdigit():
            print('请输入数字')
            continue
        # 判断员工编号是否存在
        if delete_id not in user_data_dict:
            print('员工编号不存在,无法删除')
            continue
        # 删除
        res = user_data_dict.pop(delete_id)
        print(f'员工编号{delete_id}已删除', res)
    else:
        print('该编号不存在,请输入正确的编号')

 

标签:编码,字符,员工,dict,emp,print,id
来源: https://www.cnblogs.com/stephenwzh/p/16420840.html

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

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

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

ICode9版权所有