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删除,返回被删除的value
print(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 in dic.keys():
print(key)
print(dic.values()) # dict_values([123, 'sylar', 18, '科⽐']) ⼀样. 也当
list来⽤
for value in dic.values():
print(value)
print(dic.items()) # dict_items([('id', 123), ('name', 'sylar'), ('age',18), ('ok', '科⽐')]) 这个东⻄也是list. 只不过list中装的是tuple
for 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 = 10
n1 = 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)) # li = [1,2,3]
print(id(li)) # #字符串
a = 'alex'
b = 'alex'
print(a is b) #True
#数字
n = 10
n1 = 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 = -6
n1 = -6
print(n is n1) #False n = -5
n1 = -5
print(n is n1) #True n = 257
n1 = 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'))
注意: 用什么进行编码就要什么进行解码 不然后会懵逼!
python基础(8):基本数据类型三(dict)、is和==、编码和解码的更多相关文章
- python基础知识(七)---数据类型补充、"雷区"、编码
数据类型补充."雷区".编码 1.数据类型补充 str: #字符串数据类型补充 s1=str(123) #常用于类型转换 print(s1) #capitalize()首字母大写 ...
- Python基础语法和数据类型最全总结
摘要:总结了Python最全基础语法和数据类型总结,一文带你学会Python. 本文分享自华为云社区<Python最全基础语法和数据类型总结>,原文作者:北山啦 . 人生苦短,我用Pyth ...
- Python基础(2) - 动态数据类型
Python是一门强类型语言,单定义变量时不需要制定类型. C#这样定义变量: ; VB这样定义变量: Python不需要制定类型,给变量赋什么类型的值,它就是什么类型.(穿神马就是神马?) > ...
- python基础(9):基本数据类型四(set集合)、基础数据类型补充、深浅拷贝
1. 基础数据类型补充 li = ["李嘉诚", "麻花藤", "⻩海峰", "刘嘉玲"] s = "_&qu ...
- python基础知识之数据类型
一.与用户的交互 古时候,我们去银行取钱,需要有一个银行业务员等着我们把自己的账号密码输入给他, 然后他去进行验证,成功后,我们再将取款金额输入/告诉他 骄傲的现代人,会为客户提供一台ATM机(就是一 ...
- python基础二(基本数据类型)
python的基本数据类型:数字.字符串.列表.元祖.字典.集合 一.基本数据类型 1.1 数字int 数字主要是用来计算用的,使用方法并不多. # bit_length() 当十进制用二进制表示的时 ...
- python基础之可变数据类型与不可变数据类型
一.什么可变数据类型和不可变数据类型 可变数据类型:value值改变,id值不变:不可变数据类型:value值改变,id值也随之改变. 二.如何确定一种数据类型是可变的还是不可变的 根据可变数据类型与 ...
- 二.Python基础语法和数据类型
Python第二节 基础语法和数据类型 Python编码 python3默认情况下源码文件以UTF-8编码, 字符串均为unicode字符串.同时也可以通过# -*- coding: cp-1252 ...
- python基础-较复杂数据类型预览
1.初识列表 列表就是队列: 列表是一种有序的,且内容可重复的数据类型: 用list代表列表,也可以用list()定义一个列表,同时定义列表可以直接使用 [ ]: python中列表是 ...
随机推荐
- 【linux知识】文件存储结构及物理设备命名(FHS)
FHS是文件系统层次化标准(Filesystem Hierarchy Standard). 一切从根目录 " / " 开始. Linux中常见目录及对应内容: 路径分为:绝对路径( ...
- PHP 管理树莓派
同学给过我一块树莓派,那会儿觉得挺新鲜的.但是每次使用都需要远程桌面或者 ssh 进行登录,比较麻烦.后来为了方便管理,在树莓派上安装部署了 LAMP 环境,然后写了一个简单的 PHP 页面,代码如下 ...
- Web安全测试学习笔记 - DVWA+PHP环境搭建
DVWA(Damn Vulnerable Web Application),是一个用PHP编写的,作为Web安全测试练习平台的合法环境(毕竟咱不能为了练习就随便找个网站去攻击...),也就是俗称的靶场 ...
- 5种智能指针指向数组的方法| 5 methods for c++ shared_ptr point to an array
本文首发于个人博客https://kezunlin.me/post/b82753fc/,欢迎阅读最新内容! 5 methods for c++ shared_ptr point to an array ...
- Spring Cloud Gateway、并发编程等等
2019年 JUC线程池服务ExecutorService接口实现源码分析 Github Page:http://www.throwable.club/2019/07/27/java-concurre ...
- 设计院老师良心汇总:值得牢记的15个CAD基础技巧,能帮大忙
哈喽!你们的CAD魔鬼(老师)来喽! 良心CAD技巧汇总,设计院师傅精心汇总,值得你牢记的15个CAD基础技巧,满满的都是干货,日常最常见的问题以及解决方法这里都汇总给你,给你高效的绘图体验,关键时刻 ...
- 通过C#代码调用Dynamics 365 Web API执行批量操作
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Jackson version is too old 2.xx
我使用的是IDEA,很简单. 切换到project,如果下面的module版本是2.65,上面的jackson.core.xx小于2.65就会报old,如果高于2.65就会报不兼容. 所以调整成相同的 ...
- Linux下使用 github+hexo 搭建个人博客03-hexo配置优化
上两张文章,我们说了 hexo 部署.主题的切换.博文的创建.MarkDown 简单使用和 hexo 部署到 GitHub Pages. 也说了我们会使用 next 主题做为我们后期博客的使用和维护. ...
- java8-13-默认方法 静态方法 重复注解 类型注解
java8增加默认方法 静态方法 重复注解 类型注解 1.默认方法 default修饰 为什么要有这个特性? 当修改接口时候,需要修改全部实现该接口的类.为了解决这个问题,所以引进默认方法 ...