字典及内置方法剩余,集合及内置方法,字符编码

一.字典及内置方法剩余

类型转换

d1 = dict([['username','password'],('jason',123)])
print(d1)  # {'username': 'password', 'jason': 123}

操作方法

取值

字典默认暴露给外界的可操作的只有字典的key
字典是无序的,没有索引一说

不推荐方法如下
d = {'username': 'jason', 'password': 123}
# print(d['username'])  # 不推荐使用该方法
# print(d['xxx'])  # KeyError: 'xxx'
可使用get方法

键不存在会返回None,不会报错,还可以自定义返回值

d = {'username': 'jason', 'password': 123}
res = d.get('username')
print(res)  # jason
# res = d.get('xxx')
# print(res)  # None  键不存在会返回None 不会报错

# res = d.get('username', '你搞什么飞机 这个键不存在 去你妹啊')
# print(res)  # 键存在还是返回对应的值
# res = d.get('xxx', '你搞什么飞机 这个键不存在 去你妹啊')
# print(res)  # 键不存在 返回get方法里面第二个参数

字典新增键值对

d[‘key’] = ‘values’
update
setdefault

d = {'username': 'jason', 'password': 123}
# 方式1
# d['hobby'] = 'study'  # 字典的key不存在新增
# print(d)
# d['username'] = 'egon'
# print(d)  # 字典的key存在则修改
# 方式2
# d.update(username='jason')
# print(d)  # 特点同上
# 方式3
"""
键如果存在的情况下 那么不做修改 而是将对应的value取出
键如果不存在的情况下 那么就是新增
"""
# d.setdefault('xxx',123)
# print(d)  # 键不存在是新增
# res = d.setdefault('username',123)
# print(d)  # {'username': 'jason', 'password': 123}
# print(res)  # jason

快速构造字典

案例:

# res = {}.fromkeys(['k1','k2','k3'],[])
# # print(res)  # {'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的也不知道
"""

弹出:删除功能有返回值

d = {'username': 'jason', 'password': 123}
# res = d.pop('username')  # 将括号内指定的key对应的value弹出
# print(d,res)  # jason
# res1 = d.popitem()  # 将弹出的键值对组织成元组的形式返回出去
# print(d,res1)  # {'username': 'jason'} ('password', 123)

字典方法三剑客:获取键,值,键值对

d = {'username': 'jason', 'password': 123}
# print(d.keys())  # 获取字典所有的key
# print(d.values())  # 获取字典所有的value
# print(d.items())  # 获取字典所有的key和value组织成小元组
"""
可以直接只看里面的数据结构
dict_keys(['username', 'password'])
dict_values(['jason', 123])
dict_items([('username', 'jason'), ('password', 123)])
"""
# for key in d.keys():
#     print(key)
# for value in d.values():
#     print(value)
# for item in d.items():
#     print(item)
# for k, v in d.items():
#     print(k,v)

清空:

d = {'username': 'jason', 'password': 123}
d.clear()
print(d)

小贴士:class(可以读作双下class)

二.集合(set)

作用:

1.去重
2.关系运算(共同好友,共同关注,交叉并集)

集合主要就是以上2个功能,如果用不上这两个功能,没必要用集合

定义:

1.集合内的元素必须是不可变类型
2.元素与元素之间逗号隔开 不是键值对
3.集合内的元素也是无序的

s = {1,2,3,4,5,6,7,8}

如何定义空集合

s1 = {}
d1 = {}
print(type(s1),type(d1))  # <class 'dict'> <class 'dict'>
# 定义空集合一定要用set关键字
ss = set()
print(ss,type(ss))  # set() <class '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'}

去重

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)

关系运算

案例:

# 用户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的子集

三.字符编码

运行程序的步骤:

任何一个程序都是先存放与硬盘上的
要想运行起来 必须先由硬盘读取到内存
之后cpu去内存中取指然后执行

在运行的程序产生的数据最先都是存放与内存中的

计算机是基于电工作的,所以只能识别电信号

计算机内部存储数据用的都是0101010的二进制数据

文件的后缀名是干嘛的?

文件的后缀名仅仅是给人看的,因为对应计算机来说所有的数据都是0101的二进制

普通的文本编辑器和python解释器的工作流程

相同点:

1.任何的程序要想运行都是先从硬盘读取到内存
2.文本编辑器和python解释器都会从硬盘中读取你想要读取的文件内容

不同点:

3.文本编辑器将文件内容读取之后仅仅是展示给用户看,而我们的python解释器会识别语法并执行python代码

PS:字符编码研究的范围只针对文本文件,音频,视频这些不包含在内

字符编码的发展史:

一家独大:ascii

计算机起源于美国,美国人用英文交流,但是计算机只能识别二进制数据
为了能够让计算机识别人类能够读懂的字符,而产生了ASCII码表

人类字符    >>>>>       计算机二进制数据
# 中间的字符与数字的对应关系其实就是一张表

ASCII码表:只记录了英文和数字的对应关系
用8位(bit)来表示一个英文字符

1bytes = 8bit
1024bytes = 1KB
1024KB = 1MB
1024MB = 1GB

群雄割据:GBK,Shift_JIS,EUC_KR

中国人也用得起计算机
    	自己做一个汉字跟数字对应关系	GBK
        GBK表
        	汉字、英文 跟数字的对应
            1bytes来表示英文
            2bytes来表示汉字
            	如果出现了生僻字可能还需要用3bytes甚至跟多的bytes
        
    日本人也用得起计算机
    	自己做一个汉字跟数字对应关系	shift_JIS
        GBK表
        	日文、英文 跟数字的对应
            
    韩国人也用得起计算机
    	自己做一个汉字跟数字对应关系	Euc_kr
        Euc_kr表
        	韩文、英文 跟数字的对应

我们在输入中文字符的时候

  1. 内部基于GBK翻译成了对应的二进制数据,在内存
  2. 然后将基于GBK编码的二进制数据刷到硬盘,永久保存
  3. 将硬盘中基于GBK编码的二进制数据读取到内存之后按照GBK编码的对应关系翻译成对应的中文

天下一统:unicode

万国码:Unicode
兼容万国,并且跟之前所有国家的编码都有对应关系
1990年开始研究,1994年开始正式使用

所有的字符都是用2bytes来存储
英文用2bytes
中文也用2bytes

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值