一、字典及内置方法
1.定义:在{}中,用逗号分隔,各个元素以key:value的形式储存key通常是字符串型
d = {'username':'jason', 'password':123}
d = dict(username='jason', age=18)
2.类型转换
d1 = dict([['username','password'],('jason',123)])
print(d1) # {'username': 'password', 'jason': 123}
3.操作方法
1.取值
'''
字典默认暴露给外界的可操作的只有字典的key
字典是无序的 根本没有索引一说
'''
d = {'username': 'yang', 'password': 123}
print(d['username']) # 不推荐使用该方法
print(d['age']) # KeyError: 'age',当直接取一个不存在的key 会报错
'''
1 get方法 以后字典取值,尽量用get方法
'''
res = d.get('username')
print(res) # jason
'''
None 键不存在会返回None 不会报错,因为没有在get中设置默认返回值,所以返回None
'''
d = {'k1':111,'k2':222,'k3':333}
res = d.get('k4','找一个存在的键啊,蠢蛋')
print(res) # 键不存在 返回get方法里面第二个参数
------------------------------------
找一个存在的键啊,蠢蛋
2.字典新增键值对
"""方式一:直利用key"""
d = {'username': 'yang', 'password': 123}
d['hobby'] = 'study' # 字典的key不存在新增
print(d)
d['username'] = 'egon'
print(d) # 字典的key存在则修改
----------------------------------------------
{'username': 'yang', 'password': 123, 'hobby': 'study'}
{'username': 'egon', 'password': 123, 'hobby': 'study'}
"""方式二,update,特点与方法一相同,存在key就修改,不存在就添加"""
d.update(hobby = 'study')
print(d)
d.update(username = 'egon')
print(d)
-------------------------------
{'username': 'yang', 'password': 123, 'hobby': 'study'}
{'username': 'egon', 'password': 123, 'hobby': 'study'}
"""方式3 setdefault
键如果存在的情况下 那么不做修改 而是将对应的value取出
键如果不存在的情况下 那么就是新增
"""
d.setdefault('xxx',123)
print(d) # 键不存在是新增
res = d.setdefault('username',123)
print(d) # {'username': 'jason', 'password': 123}
print(res) # jason
3.快速构造字典{}.fromkeys()
"""
day8中有提到此题的问题内容
面试题:
res = {}.fromkeys(['k1','k2','k3'],[])
res.get('k1').append(123)
print(res)的结果是?
A
{'k1': [123], 'k2': [], 'k3': []}
B
{'k1': [123], 'k2': [123], 'k3': [123]}
C
报错
D
我TMD的也不知道
"""
答案:B
4.弹出的两种方法
d = {'k1':1,'k2':2,'k3':3}
print(d.pop('k1'),d)
d = {'k1':1,'k2':2,'k3':3}
print(d.popitem(),d)
------------------------------
1 {'k2': 2, 'k3': 3}
('k3', 3) {'k1': 1, 'k2': 2}
5.字典方法三剑客
# 可以直接只看里面的数据结构
d = {'username': 'yang', 'password': 123}
print(d.keys()) # 获取字典所有的key
print(d.values()) # 获取字典所有的value
print(d.items()) # 获取字典所有的key和value组织成小元组
-------------------------------------
dict_keys(['username', 'password'])
dict_values(['yang', 123])
dict_items([('username', 'yang'), ('password', 123)])
d = {'username': 'yang', 'password': 123}
for key in d.keys():
print(key,end=' ')
print()
for value in d.values():
print(value,end=' ')
print()
for item in d.items():
print(item,end=' ') # item不解压赋值直接返回元组
print(type(item))
print()
for k, v in d.items():
print(k,v,end=' ')
---------------------------------------
username password
yang 123
('username', 'yang')
('password', 123)
username yang password 123
6.清空
d.clear()
print(d)
二、集合set
作用:
1.去重
集合内不可能出现相同的元素
2.关系运算
如:共同好友、共同关注...、交叉并集...
用集合就是用上面两个功能 如果都用不上 那么就不要用
1.定义
s = {1,2,3,4,5,6,7,8}
"""
1.集合内的元素必须是不可变类型
2.元素与元素之间逗号隔开 不是键值对
3.集合内的元素也是无序的
"""
# 如何定义空集合
s1 = {}
d1 = {}
print(type(s1),type(d1)) #
# 定义空集合一定要用set关键字
ss = set()
print(ss,type(ss)) # set()
类型转换
"""能够被for循环的数据类型都能够被转成集合"""
# s1 = set('egon is o DSB')
# print(s1)
# s2 = set([1,2,3,4,5,6,7,7,7,7,7])
# print(s2)
# s3 = set({'username':'jason','password':123})
# print(s3) # {'password', 'username'}
1.去重
s = {1,1,1,2,3,3,4,3,2,3,4,6,5,3,}
print(s) # 集合内如果有相同的元素会自动去重
# 去重练习题
l = [4,3,2,3,4,6,7,8,1,2,3]
# 要求1 对列表进行去重不需要保持原来的元素顺序
# 先转成集合
s = set(l)
# 再转成列表
l1 = list(s)
print(l1)
# 要求2 对列表去重之后需要保持原来的元素顺序
new_l = []
for i in l:
if i not in new_l:
new_l.append(i)
print(new_l)
2.关系运算
# 用户1的好友列表
friends1 = {'jason','tank','tony','jerry'}
# 用户2的好友列表
friends2 = {'jason','tony','owen','oscar'}
# 1 求两个用户的共同好友 交集
res = friends1 & friends2
print(res) # {'jason', 'tony'}
# 2 求两个用户所有的好友
res = friends1 | friends2
print(res) # {'jerry', 'jason', 'oscar', 'tony', 'tank', 'owen'}
# 3 求用户1独有的好友
res1 = friends1 - friends2
res2 = friends2 - friends1
print(res1,res2) # {'jerry', 'tank'} {'owen', 'oscar'}
# 4 求两个用户各自独有的好友 对称差集
res = friends1 ^ friends2
print(res) # {'owen', 'jerry', 'tank', 'oscar'}
# 5 子集 父集
s1 = {12,3,4,5,6}
s2 = {12,6}
print(s1 > s2) # s1是否是s2的父集
print(s2 < s1) # s2是否是s1的子集
总结:python基本数据类型
1.整型int
2.浮点型float
3.字符串str
4.列表list
5.字典dict
6.布尔值bool
7.元组tuple
8.集合set
三、字符编码
任何一个程序都是先存放与硬盘上的
要想运行起来 必须先由硬盘读取到内存
之后cpu去内存中取指然后执行
在运行的程序产生的数据最先都是存放与内存中的
计算机是基于电工作的,那么计算机只能识别电信号
计算机内部存储数据用的都是01010101的二进制数据
文件的后缀名是干嘛的?
文件的后缀名仅仅是给人看的 因为对应计算机来说所有的数据都是0101010的二进制
普通的文本编辑器和python解释器的工作流程
相同点
1.任何的程序要想运行都是先从硬盘读取到内存
2.文本编辑器和python解释器都会去硬盘中读取你想要读取的文件内容
不同点
3.文本编辑器将文件内容读取之后仅仅是展示给用户看
而我们的python解释器会识别语法并执行python代码
字符编码研究的范围只针对文本文件 音频、视频这些不包含在内
字符编码的发展史
1.一家独大
计算机起源于美国
美国人用英文交流 但是计算机只能识别二进制数据
为了能够让计算机识别人类能够读懂的字符,这里面肯定有一个
人类字符 >>> 计算机二进制数据
中间的字符与数字的对应关系其实就是一张表
ASCII码表
这张表只记录了英文和数字的对应关系
用8位(bit)来表示一个英文字符
2.群雄割据
当世界上其他国家都发展起来计算机行业时候,仅仅ASCII码表就不够用了,因为每个国家都需要有字节去对应自己国家的语言。
所以中国创造了GBK国标
GBK表:
汉字、英文 跟数字的对应
1bytes来表示英文
2bytes来表示汉字
如果出现了生僻字可能还需要用3bytes甚至跟多的bytes
我们在输入中文字符的时候
1.内部基于GBK翻译成了对应的二进制数据 在内存
2.然后将基于GBK编码的二进制数据刷到硬盘 永久保存
3.将硬盘中基于GBK编码的二进制数据读取到内存之后按照GBK编码的对应关系翻译成对应的中文
3.天下一统
万国码 unicode
兼容万国
并且跟之前所有国家的编码都有对应关系
1990开始研究的 1994年才开始正式使用
所有的字符都是用2bytes来存储
英文用2bytes
中文也用2bytes