数据类型内置方法及操作
今日内容
- 字典
- 元组
- 列表
- 字符编码理论
- 字符编码实操
字典
dict() 转换成字典的方式有点苛刻
dict([("name":111),("age":18)])
字典是按key取值
取值get()或者取值
字典
data_dict = {"name": "jason", "age": 18}
取值
方式一
print(data_dict["name"]) # jason
方式二
print(data_dict.get("name")) # jason
print(data_dict.get("phon", "嘿嘿 没有油")) # 嘿嘿 没有油
直接取值,如果字典里没有这个键就会直接报错, 而get方法取值如果没有会默认返回None,也可以自定义返回值
修改
data_dict = {"name": "jason", "age": 18}
data_dict["name"] = "tony"
print(data_dict) # {'name': 'tony', 'age': 18}
添加 直接写或者用 setdefault()
data_dict = {"name": "jason", "age": 18}
# 方式一
data_dict["phon"] = 123
print(data_dict) # {'name': 'jason', 'age': 18, 'phon': 123}
# 方式二
data_dict.setdefault("name", "tony") # 有则不做任何操作
print(data_dict) # {'name': 'jason', 'age': 18, 'phon': 123}
data_dict.setdefault("gender", "女") # 没有则添加
print(data_dict) # {'name': 'jason', 'age': 18, 'phon': 123, 'gender': '女'}
删除 pop()
# 方式一
data_dict = {"name": "jason", "age": 18}
del data_dict["name"]
# 方式二
data_dict.pop("name")
# 后进先出 弹出最后一个
res = data_dict.popitem()
print(data_dict)
print(res)
字典三剑客keys() 、values()、iitems()
data_dict = {"name": "jason", "age": 18}
print(data_dict.keys()) # dict_keys(['name', 'age'])
print(data_dict.values()) # dict_values(['jason', 18])
print(data_dict.items()) # dict_items([('name', 'jason'), ('age', 18)])
for k in data_dict.keys():
print(k) # name age
for v in data_dict.values():
print(v) # jason 18
for item in data_dict.items():
print(item) # ('name', 'jason') ('age', 18)
补充
data1_dict ={}.fromkeys(["name", "age"],[])
print(data1_dict) # {'name': [], 'age': []}
data1_dict["name"].append("123")
data1_dict["age"].append("222")
print(data1_dict) # {'name': ['123', '222'], 'age': ['123', '222']}
""" 应该是 name:111,age:2222
但是结果不是 因为他们指向的是同一个列表 又因为列表是可变类型
所以 他们到最后会指向最后的同一个列表
"""
元组
tuple()
只要可以被for循环的类型都已转换成元组类型
l1 = (11, 22, 33, 44)
# 索引取值
# 切片取值
# 统计元组内某个数据的个数
print(l1.count(11)) # 1
统计元组个数 len()
# 统计元组个数
l1 = (11, 22, 33, 44)
print(len(l1)) # 4
查看元组内的某个数据值的索引 index()
# 查看元组内某个数据值的索引
l1 = (11, 22, 33)
print(l1.index(11)) # 0
元组内只有一个数据的时候逗号不能少
元组内绑定的内存地址不能修改(注意区分可变和不可变类型)
元组不能新增或者删除数据
只要可以被for循环的都可以转换成元组
集合
-
类型转换
set()
集合内数据必须是不可变类型(整型 浮点型 字符串 元组)
集合内数据也是无序的 没有索引的概念
-
集合需要掌握的方法
去重
关系运算
ps:只有遇到上述的两种需求的时候才应该考虑使用集合
-
去重(集合去重后无法保留原数据的排列顺序)
s1 = {11, 22, 33, 11, 22, 33, 22, 33} l1 = {11, 22, 33, 44, 33, 22} s1 = set(s1) l1 = list(l1) print(s1) # {33, 11, 22} print(l1) # [33, 11, 44, 22] -
关系运算
-
两个集合的交集intersection() 或者 &
f1 = {"jason", "tony", "jerry", "oscar"} f2 = {"jack", "jason", "tom", "tony"} print(f1 & f2) # {'jason', 'tony'} -
补集(我有你没有)
f1 = {"jason", "tony", "jerry", "oscar"} f2 = {"jack", "jason", "tom", "tony"} print(f1 - f2) # {'oscar', 'jerry'} -
差集(去除公共部分)difference() 或者^
f1 = {"jason", "tony", "jerry", "oscar"} f2 = {"jack", "jason", "tom", "tony"} print(f1 ^ f2) # {'jack', 'jerry', 'tom', 'oscar'} -
合集(两个合在一起)union()或者 |
f1 = {"jason", "tony", "jerry", "oscar"} f2 = {"jack", "jason", "tom", "tony"} print(f1 | f2) # {'jack', 'jerry', 'tom', 'tony', 'oscar', 'jason'} -
父集和子集
f1 = {"jason", "tony", "jerry", "oscar"} f2 = {"jack", "jason", "tom", "tony"} print(f1 > f2) # False 判断f1是不是f2的父集 print(f2 < f1) # False 判断f2是不是f1的子集
-
字符编码理论
-
字符编码只针对文本数据
-
回忆计算机内部的存储数据的本质
-
既然计算机内部只认识二进制(01)为什么我们可以敲出人类各式各样的字符肯定存在一个数字跟字符的对应关系 存储该关系的地方称为>>>:字符编码本
-
字符编码史
4.1 一家独大
计算机是由美国人发明的 为了能够让计算机识别英文需要发明一个数字跟字母的对应关系
ASCLL码:记录了英文字母跟数字的对应关系
用8bit(1字节)来表示一个英文字符
4.2 群体割据
中国人 GBK码:记录了英文、中文与数字的对应对应 关系用至少16bit(2字节)来表示一个中 文字符很多生僻字还需要使用更多的字 节
日本人
shift_JIS码:记录了英文、日文与数字的 对应关系
韩国人
Euc_kr码:记录了英文、韩文和数字的对应 关系
每个国家的计算机使用的都是自己制定的编码本 不同的国家的文本数据无法直接交互 会出现“乱码”
4.3 天下一统
unicode万国码
兼容所有国家语言字符
起步就是两个字节来表示字符 utf系类:utf8 utf16...
专门用于优化unicode存储问题 英文还是采用一个字节 中文三个字节
字符编码实操
-
针对乱码不要慌 切换编码慢慢试即可
-
编码与解码
编码:将人类的字符按照指定的编码,编译成计算机能够读懂的数据
字符串.encode()
解码:将计算机能够读懂的数据按照指定的编码,解码成人能看懂的字符
bytes类型.decode()
-
python2与python3差异
python2默认的编码格式是ASCII
- 文件头
# encoding:utf8- 字符串前面加u
python3默认的编码格式是utf系列(unicode)

浙公网安备 33010602011771号