python对字典的编码和解码_python基础(8):基本数据类型三(dict)、is和==、编码和解码...

1. 字典

1.1 字典的介绍

字典(dict)是python中唯一的一个映射数据类型,它是以{}括起来的键值对组成。在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将key-value保存在这个地址中,这种算法被称为hash算法。所以,切记,在dict中存储的key-value中的key必须是可hash的。如果你搞不懂什么是可哈希,暂时可以这样记,可以改变的都是不可哈希的,那么可哈希就意味着不可变,这个是为了能准确的计算内存地址⽽规定的。

已知的可哈希(不可变)的数据类型: int,str,tuple,bool 不可哈希(可变)的数据类型: list,dict,set

语法 :

{key1: value1, key2: value2....}

注意: key必须是不可变(可哈希)的,value没有要求,可以保存任意类型的数据。

#合法

dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅

哥','美⼥'], (1, 2, 3):'麻花藤'}

print(dic[123])print(dic[True])print(dic['id'])print(dic['stu'])print(dic[(1, 2, 3)])#不合法#dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不能作为key#dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key

dic = {{1, 2, 3}: '呵呵呵'} #set是可变的, 不能作为key

dict保存的数据不是按照我们添加进去的顺序保存的,是按照hash表的顺序保存的,⽽hash表不是连续的,所以不能进⾏切片⼯作,它只能通过key来获取dict中的数据。

1.2 字典的增删改查和其他相关操作

1.2.1 增加

dic ={}

dic['name'] = '周润发' #如果dict中没有出现这个key, 就会新增⼀个key-value的组合进dict

dic['age'] = 18

print(dic)#如果dict中没有出现过这个key-value. 可以通过setdefault设置默认值

dic.setdefault('李嘉诚') #也可以往⾥⾯设置值.

dic.setdefault("李嘉诚", "房地产") #如果dict中已经存在了. 那么setdefault将不会

起作⽤print(dic)

1.2.2 删除

ret = dic.pop("jay") #通过key删除,返回被删除的valueprint(ret)del dic["jay"]print(dic)#随机删除.

ret =dic.popitem()#清空字典中的所有内容

dic.clear()

1.2.3 修改

dic = {"id": 123, "name": 'sylar', "age": 18}

dic1= {"id": 456, "name": "麻花藤", "ok": "wtf"}

dic.update(dic1)#把dic1中的内容更新到dic中. 如果key重名. 则修改替换. 如果不存在key, 则新增.print(dic)print(dic1)

1.2.4 查询

查询⼀般⽤key来查找具体的数据.

print(dic['name'])#print(dic['sylar']) # 报错

print(dic.get("ok"))print(dic.get("sylar")) #None

print(dic.get("sylar", "⽜B")) #⽜B

1.2.5 其他相关操作

dic = {"id": 123, "name": 'sylar', "age": 18, "ok": "科⽐"}print(dic.keys()) #dict_keys(['id', 'name', 'age', 'ok']) 不⽤管它是什么.当成list来⽤就⾏for key indic.keys():print(key)print(dic.values()) #dict_values([123, 'sylar', 18, '科⽐']) ⼀样. 也当

list来⽤for value indic.values():print(value)print(dic.items()) #dict_items([('id', 123), ('name', 'sylar'), ('age',18), ('ok', '科⽐')]) 这个东⻄也是list. 只不过list中装的是tuplefor key, value in dic.items(): #?? 这个是解构

print(key, value)#解构

a, b = 1, 2

print(a, b)

(c, d)= 3, 4

print(c, d)

e, f= [1, 2, 3] #解构的时候注意数量必须匹配

print(e, f)

1.3 字典的嵌套

#字典的嵌套

dic1 ={"name": "汪峰","age": 18,"wife": {"name": '章⼦怡',"age": 28},"children": ['第⼀个⽑孩⼦', '第⼆个⽑孩⼦'],"desc": '峰哥不会告我吧. 没关系. 我想上头条的'}print(dic1.get("wife").get("name"))print(dic1.get("children"))print(dic1.get("children")[1])

2. is和==

2.1 ==的作用

a = 'alex'b= 'alex'

print(a == b) #True

n= 10n1= 10

print(n == n1) #True

li1 = [1,2,3]

li2 = [1,2,3]

print(li1 == li2) True

从测试来看:

== 比较的是值

2.2 is的作用

id():获得内存地址

a = 'alex'

print(id(a)) #36942544 内存地址

n= 10

print(id(n)) #1408197120

li= [1,2,3]print(id(li)) #38922760

#字符串

a = 'alex'b= 'alex'

print(a is b) #True#数字

n = 10n1= 10

print(n is n1) #True

#列表

li =[1,2,3]

li2=[1,2,3]print(li is li2) #False#元组

tu =(1,2,3)

tu1=(1,2,3)print(tu is tu1) #False#字典

dic1 = {'name':'alex'}

dic= {'name':'alex'}print(dic1 is dic) #False

从测试来看:

is 比较的是内存地址

2.3 特殊情况-小数据池

2.3.1 数字小数据池的范围 -5 ~ 256

n = -6n1= -6

print(n is n1) #False

n= -5n1= -5

print(n is n1) #True

n= 257n1= 257 #在pycharm中会显示true,在终端中是false,因为pycharm会做出它认为是优化的方案,但是却打破了python的功能

print(n is n1) #True

2.3.2 字符串中如果有特殊字符他们的内存地址就不一样

a = 'alex@'a1 = 'alex@'print(a is a1) # Fales

2.3.3 字符串中单个*20以内他们的内存地址一样,单个*21以上内存地址不一致

a = 'a'*21b = 'a'*21print(a is b) #False

a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'b = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'print(a is b) #True

3. 编码和解码

3.1 几种编码

ASCII码:

不支持中文

支持英文、数字、符号

8位 一个字节

GBK码 国标:

支持 中文,英文,数字,符号

英文 16位 二个字节

中文 16位 二个字节

UNICODE万国码:

支持 中文,英文,数字,符号

英文 32 位 四个字节

中文 32位 四个字节

UTF-8:

长度可变的万国码 最少用8位

英文 8位 一个字节

中文 24位 三个字节

3.2 编码和解码操作

encode(编码方式) ---- 拿到明文编码后对应的字节

decode(编码方式) -----将编码后的字节解码成对应的明文

s = 'alex'print(s.encode('utf-8')) # 编码 encode('utf-8') utf-8 是指定要编码成什么样的编码类型print(s1.decode('utf-8')) #

s = '饿了's1 = s.encode('gbk') #b'饿了吗' #b'\xe9\xa5\xbf\xe4\xba\x86\xe5\x90\x97'print(s.encode('gbk')) #b'\xb6\xf6\xc1\xcb\xc2\xf0'print(s1)print(s1.decode('utf-8'))

注意: 用什么进行编码就要什么进行解码  不然后会懵逼!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值