数据类型的内置方法之字典相关操作、元组的相关操作、集合相关操作及字符编码理论、字符编码实操等

作业详解

1.基于字符串充当数据库完成用户登录(基础练习)
   data_source = 'jason|123'  # 一个用户数据
   获取用户用户名和密码 将上述数据拆分校验用户信息是否正确

	 # 定义用户真实数据
    data_source = 'jason|123'
    # 1.获取用户名和密码
    username = input('username>>>:').strip()
    password = input('password>>>>:').strip()
    # 2.切割字符串 获取真实用户名和密码
    real_name, real_pwd = data_source.split('|')
    # 3.校验用户名和密码是否正确
    if username == real_name and password == real_pwd:
        print('登录成功')
    else:
        print('用户名或密码错误')


2.基于列表充当数据库完成用户登录(拔高练习)  # 多个用户数据
   data_source = ['jason|123', 'kevin|321','oscar|222']
	data_source = ['jason|123', 'kevin|321', 'oscar|222']
    # 1.先获取用户输入的用户名和密码
    username = input('username>>>:').strip()
    password = input('password>>>>:').strip()
    # 2.循环获取列表中每一个真实数据
    for data in data_source:  # 'jason|123'   'kevin|321'
        real_name, real_pwd = data.split('|')  # jason  123
        if username == real_name and password == real_pwd:
            print('登录成功')
            break
    else:
        print('用户名或密码错误')

    data_source = ['jason|123', 'kevin|321', 'oscar|222']
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    user_data = f'{username}|{password}'  # username + '|' + password
    if user_data in data_source:
        print('登录成功')
    else:
        print('用户名或密码错误')

3.利用列表编写一个员工姓名管理系统
    输入1执行添加用户名功能
    输入2执行查看所有用户名功能
    输入3执行删除指定用户名功能
    '''分析 用户输入的不同 可以执行不同的代码'''
    ps: 思考如何让程序循环起来并且可以根据不同指令执行不同操作
    提示: 循环结构 + 分支结构
 		  # 1.先定义一个专门存储用户名的列表
        data_list = []
        # 2.添加循环结构
        while True:
            # 3.先打印项目功能 供用户选择
            print("""
            1.添加用户
            2.查看用户
            3.删除用户    
            """)
            # 4.获取用户想要执行的功能编号
            choice_num = input('请输入您想要执行的功能编号>>>:').strip()
            # 5.根据不同的功能编号执行不同的分支代码
            if choice_num == '1':
                # 6.获取用户输入的用户名
                username = input('请输入您的用户名>>>:').strip()
                # 7.判断当前用户名是否已存在
                if username in data_list:
                    print('用户名已存在')
                else:
                    # 8.列表添加用户名
                    data_list.append(username)
                    print(f'用户名{username}添加成功')
            elif choice_num == '2':
                # 9.循环打印每一个用户数据
                for name in data_list:
                    print(
                    f"""
                    ------------user info---------
                    用户名:{name}
                    ------------------------------
                    """)
            elif choice_num == '3':
                # 10.获取用户想要删除的用户名
                delete_username = input('请输入您想要删除的用户名>>>:').strip()
                # 11.先判断用户名是否存在
                if delete_username in data_list:
                    data_list.remove(delete_username)
                    print(f'用户名{delete_username}删除成功')
                else:
                    print('你个傻帽 用户名不存在 删毛线啊!!!')
            else:
                print('很抱歉 暂时没有您想要执行的功能编号')

字典相关操作

  • 类型转换
dict() 字典的转换一般不使用关键字 而是自己动手转
  • 字典的操作方法
user_dict = {
    'username':'jason',
    'password':'123',
    'hobby': ['read', 'music', 'run']
}
# 1.按k取值(不推荐使用)
print(user_dict['username'])  # jason
print(user_dict['phone'])      # k不存在会直接报错
# 2.按内置方法get取值(推荐使用)
print(user_dict.get('username'))  # jason
print(user_dict.get('age'))       # None
print(user_dict.get('username','没有'))   # jason   键存在的情况下获取对应的值
print(user_dict.get('phone', '没有'))     # 没有   键不存在默认返回None 可以通过第二个参数自定义
#  3.修改值数据
print(id(user_dict))   # 2496773313344
user_dict['username'] = 'tony'
print(id(user_dict))  # 2496773313344
print(user_dict)      # {'username': 'tony', 'password': '123', 'hobby': ['read', 'music', 'run']}
# 4.新增键值对
user_dict['age'] = 18    # 键不存在则新增键值对
print(user_dict)         # {'username': 'jason', 'password': '123', 'hobby': ['read', 'music', 'run'], 'age': 18}
# 5.删除数据
del  user_dict['username']
print(user_dict)         # {'password': '123', 'hobby': ['read', 'music', 'run'], 'age': 18}
res = user_dict.pop('password')
print(user_dict)        # 'hobby': ['read', 'music', 'run'], 'age': 18}
print(res)             # 123
# 6.统计字典中键值对的个数
print(len(user_dict))  # 3
# 7.字典三剑客
print(user_dict.keys())   # dict_keys(['username', 'password', 'hobby'])  一次性获取字典所有的键
print(user_dict.values()) # dict_values(['jason', '123', ['read', 'music', 'run']])  一次性获取字典所有的值
print(user_dict.items())  # dict_items([('username', 'jason'), ('password', '123'), ('hobby', ['read', 'music', 'run'])]) 一次性获取字典的键值对数据

for i in user_dict.items():
    k, v = i
    print(k, v)
# 8. 补充说明
print(dict.fromkeys(['name', 'pwd', 'hobby'], 123))  # 快速生成值相同的字典 {'name': 123, 'pwd': 123, 'hobby': 123}
res = dict.fromkeys(['name', 'pwd', 'hobby'], [])
print(res)       # {'name': [], 'pwd': [], 'hobby': []}
res['name'].append('jason')
res['pwd'].append(123)
res['hobby'].append('study')
print(res)  # {'name': ['jason', 123, 'study'], 'pwd': ['jason', 123, 'study'], 'hobby': ['jason', 123, 'study']}
'''
当第二个公共值是可变类型的时候 一定要注意 通过任何一个键修改都会影响所有

'''
res = user_dict.setdefault('username', 'tony')
print(user_dict,res)

res = user_dict.setdefault('age', 123)
print(user_dict, res)

元组的相关操作

  • 类型转换
tuple()  ps:支持for循环的数据类型都可以转成元组
  • 元组的操作方法
t1 = (11, 22, 33, 44, 55, 66)
# 1.索引取值
# 2.切片操作
# 3.间隔、方向
# 4.统计元组内数据值的个数
print(len(t1))   # 6
# 5.统计元组内数据值出现的次数
print(t1.count(11))   # 1
# 6.统计元组内指定数据值的索引值
print(t1.index(22))   # 1
# 7.元组内如果只有一个数据值那么逗号不能少
# 8.元组内索引绑定的内存地址不能被修改(注意区分 可变与不可变)
# 9.元组不能新增或删除数据

集合相关操作

  • 类型转换
类型转换: set() 集合内数据必须是不可变类型(整型 浮点型 字符串 元组)
         集合内数据是无序的 没有索引的概念
  • 集合需要掌握的方法
    只有遇到去重和关系运算这两种需求的时候才应该考虑使用集合
去重  
s1 = {11, 22, 11, 22, 22, 11, 222, 11, 22, 33, 22}
l1 = [11, 22, 33, 22, 11, 22, 33, 22, 11, 22, 33, 22]
s1 = set(l1)
l1 = list(s1)
print(l1)
关系运算
&    共同的部分
-    独有的部分
|    全部的部分(和)
^    独有部分的和
群体之间做差异化校验
eg: 两个微信账户之间 有不同的好友 有相同的好友
f1 = {'jason', 'tony', 'jerry', 'oscar'}  # 用户1的好友列表
f2 = {'jack', 'jason', 'tom', 'tony'}  # 用户2的好友列表
# 1.求两个人的共同好友
print(f1 & f2)     # {'jason', 'tony'}
# 2.求用户1独有的好友
print(f1 - f2)  # {'jerry', 'oscar'}
# 3.求两个人所有的好友
print(f1 | f2)  # {'jason', 'jack', 'tom', 'tony', 'oscar', 'jerry'}
# 4.求两个人各自独有的好友
print(f1 ^ f2)  # {'oscar', 'tom', 'jack', 'jerry'}
# 5.父集 子集
print(f1 > f2)
 print(f1 < f2)

字符编码理论

该知识点理论特别多 但是结论很少 代码使用也很短
1.字符编码只针对文本数据
2.回忆计算机内部存储数据的本质
3.既然计算机内部只认识01 为什么我们却可以敲出人类各式各样的字符
	肯定存在一个数字跟字符的对应关系 存储该关系的地方称为>>>:字符编码本
4.字符编码发展史
	4.1.一家独大
    	计算机是由美国人发明的 为了能够让计算机识别英文
    	需要发明一个数字跟英文字母的对应关系
		ASCII码:记录了英文字母跟数字的对应关系
        	用8bit(1字节)来表示一个英文字符

 	4.2.群雄割据
    	中国人
        GBK码:记录了英文、中文与数字的对应关系
       	 	用至少16bit(2字节)来表示一个中文字符
            	很多生僻字还需要使用更多的字节
           英文还是用8bit(1字节)来表示
       日本人
    	  shift_JIS码:记录了英文、日文与数字的对应关系
    	韩国人
         Euc_kr码:记录了英文、韩文与数字的对应关系
  		"""
  		每个国家的计算机使用的都是自己定制的编码本
  			不同国家的文本数据无法直接交互 会出现"乱码"
  		"""
  	4.3.天下一统
    	unicode万国码
        	 兼容所有国家语言字符
  			  起步就是两个字节来表示字符
  		utf系列:utf8 utf16 ...
            专门用于优化unocide存储问题
            英文还是采用一个字节 中文三个字节

字符编码实操

1.针对乱码不要慌 切换编码慢慢试即可
2.编码与解码
编码:将人类的字符按照指定的编码编码成计算机能够读懂的数据
        字符串.encode()
关键字:encode
解码:将计算机能够读懂的数据按照指定的编码解码成人能够读懂
        bytes类型数据.decode()
关键字:decode
3.python2与python3差异
python2默认的编码是ASCII:
		1.文件头
        	# encoding:utf8
    	        2.字符串前面加u
        	u'你好啊'
 	python3默认的编码是utf系列(unicode)

作业:

1.优化员工管理系统
  拔高: 是否可以换成字典或者数据的嵌套使用完成更加完善的员工管理而不是简简单单的一个用户名(能写就写不会没有关系)
  员工的信息有:用户名 年龄 岗位 薪资...
  员工管理系统:注册、查看(单个员工、所有员工)、修改薪资、删除员工
# 2.定义一个存储所有员工信息的字典
# user_data_dict = {}  # {'编号':用户字典, '编号':用户字典}
'''
数据存储的方式1
{
    'jason':[18, 'teacher', 10],
    'kevin':[28, 'sale', 90]
}
数据存储的方式2
{
    'jason':{'age':18, 'job':'teacher', 'salary':8000},
    'kevin':{'age':28, 'job':'sale', 'salary':9000}
}
数据存储的方式3
{
    '1':{'name':'jason','age':18, 'job':'teacher', 'salary':8000},
    '2':{'name':'kevin','age':28, 'job':'sale', 'salary':9000},
    '3':{'name':'jason','age':18, 'job':'teacher', 'salary':8000},
}
'''
# 1.先搭建系统骨架
# while True:
#     print("""
#     1.创建员工信息
#     2.查看单个员工
#     3.查看所有员工
#     4.修改员工薪资
     5.删除员工信息
#     """)
#     choice = input('请选择您想要执行的功能编号>>>:').strip()
#     if choice == '1':
#         while True:
#             # 1.获取员工编号
#             emp_id = input('请输入该员工的员工编号(q)>>>:').strip()
#             if emp_id == 'q':
#                 break
#             # 判断编号是否是纯数字
#             if not emp_id.isdigit():
#                 print('员工编号必须是纯数字')
#                 continue
#             # 2.判断员工编号是否已存在
#             if emp_id in user_data_dict:
#                 print('员工编号已存在 请重新录入')
#                 continue
#             # 3.获取员工详细信息
#             username = input('请输入员工姓名>>>:').strip()
#             age = input('请输入员工年龄>>>:').strip()
#             job = input('请输入员工岗位>>>:').strip()
#             salary = input('请输入员工薪资>>>:').strip()
#             # 4.构建一个临时的小字典
#             temp_dict = {}
#             # 5.添加员工信息键值对
#             temp_dict['emp_id'] = emp_id
#             temp_dict['name'] = username
#             temp_dict['age'] = age
#             temp_dict['job'] = job
#             temp_dict['salary'] = salary
#             # 6.添加到大字典中
#             user_data_dict[emp_id] = temp_dict
#             print(f'员工{username}添加成功')
#     elif choice == '2':
#         while True:
#             # 1.先获取员工编号
#             target_id = input('请输入您想要查看的员工编号(q)>>>:').strip()
#             if target_id == 'q':
#                 break
#             # 2.判断员工编号是否不存在
#             if target_id not in user_data_dict:
#                 print('员工编号不存在 无法查看')
#                 continue
#             # 3.根据员工编号获取员工字典数据
#             user_dict = user_data_dict.get(target_id)
#             # 4.格式化输出
#             print(f"""
#             --------------info of emp-------------------
#             编号:{user_dict.get('emp_id')}
#             姓名:{user_dict.get('name')}
#             年龄:{user_dict.get('age')}
#             岗位:{user_dict.get('job')}
#             薪资:{user_dict.get('salary')}
#             --------------------------------------------
#             """)
#     elif choice == '3':
#         for user_dict in user_data_dict.values():
#             print(f"""
#             --------------info of emp-------------------
#             编号:{user_dict.get('emp_id')}
#             姓名:{user_dict.get('name')}
#             年龄:{user_dict.get('age')}
#             岗位:{user_dict.get('job')}
#             薪资:{user_dict.get('salary')}
#             --------------------------------------------
#             """)
#     elif choice == '4':
#         while True:
#             # 1.先获取想要修改的员工编号
#             target_id = input('请输入您想要修改的员工编号(q)>>>:').strip()
#             if target_id == 'q':
#                 break
#             if target_id not in user_data_dict:
#                 print('员工编号不存在')
#                 continue
#             # 2.获取新的薪资
#             new_salary = input('请输入该员工的新薪资待遇>>>:').strip()
#             if not new_salary.isdigit():
#                 print('薪资只能是纯数字')
#                 continue
#             # 3.获取员工字典
#             user_dict = user_data_dict.get(target_id)  # {'salary':123}
#             # 4.修改字典中的薪资
#             user_dict['salary'] = new_salary  # {'salary': 321}
#             # 5.修改大字典
#             user_data_dict[target_id] = user_dict
#             print(user_data_dict.get(target_id))
#     elif choice == '5':
#         while True:
#             # 1.先获取想要修改的员工编号
#             target_id = input('请输入您想要删除的员工编号(q)>>>:').strip()
#             if target_id == 'q':
#                 break
#             if target_id not in user_data_dict:
#                 print('员工编号不存在')
#                 continue
#             # 2.字典删除键值对
#             user_data_dict.pop(target_id)
#     else:
#         print('抱歉 暂无该功能编号!!!')
# 2.去重下列列表并保留数据值原来的顺序
# 	eg: [1,2,3,2,1] 去重之后 [1,2,3]
# l1 = [2, 3, 2, 1, 2, 3, 2, 3, 4, 3, 4, 3, 2, 3, 5, 6, 5]
# 不考虑顺序的情况下 去重
# s1 = set(l1)
# l2 = list(s1)
# print(l2)
# 考虑顺序
# new_list = []
# for i in l1:
#     if i not in new_list:
#         new_list.append(i)
# print(new_list)
# 3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
#   pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
#   linuxs={'kermit','tony','gangdan'}
#   1. 求出即报名python又报名linux课程的学员名字集合
#   2. 求出所有报名的学生名字集合
#   3. 求出只报名python课程的学员名字
#   4. 求出没有同时这两门课程的学员名字集合

# pythons = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
# linuxs = {'kermit', 'tony', 'gangdan'}
# print(pythons & linuxs)
# print(pythons | linuxs)
# print(pythons - linuxs)
# print(pythons ^ linuxs)
# 4.统计列表中每个数据值出现的次数并组织成字典展示
# 	eg: l1 = ['jason','jason','kevin','oscar']
#       结果:{'jason':2,'kevin':1,'oscar':1}
# 	真实数据
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
# 1.先定义结果集空字典
data_dict = {}
# 2.循环列表中每一个数据值
for name in l1:  # 'jason'  'kevin'
    # 3.判断当前数据值是否在字典的k中
    if name not in data_dict:  # {'jason':1}
        data_dict[name] = 1
    else:
        data_dict[name] += 1
        # data_dict[name] = data_dict.get(name) + 1
print(data_dict)
posted @ 2022-09-30 18:10  wwwxxx123  阅读(50)  评论(0编辑  收藏  举报