Python 数据类型
前言
Python 的数据类型有以下几种,数值类型这里就不再介绍了,本章主要介绍 List、Tuple、Dictionary、Set。
列表 List
List 是一种有序的集合,可以随时添加和删除其中的元素。
创建
定义 List 只需要将元素用 [ ]
包含进来即可,元素之间用 ,
分割。
1 |
classmates = ['Michael', 'Bob', 'Tracy'] |
---|
由于Python是动态语言,所以 List 中包含的元素并不要求都必须是同一种数据类型,我们完全可以在 List 中包含各种数据:
1 |
L = ['Michael', 100, True] |
---|
访问
List 可以通过索引来获取指定元素。索引从 0 开始。
123456 |
# coding=utf-8classmates = ['Michael', 'Bob', 'Tracy']i = 0while i < len(classmates): print("索引为 %d 的元素为:%s"%(i,classmates[i])) i+=1 |
---|
添加元素
使用 append()
和 insert()
方法都可以将元素添加进去,一个是添加到 List 的末尾,一个是插入到指定位置。
12345678 |
# coding=utf-8A = ["A", "B", "C"]A.append("D") # 向末尾添加一个元素 Dprint AA.insert(0, "A") # 向第 0 个位置插入一个元素 Aprint A |
---|
删除元素
使用 pop()
方法可以将 List 中的元素删除。
12345678 |
# coding=utf-8A = ["A", "B", "C", "D"]A.pop() # 删除末尾的一个元素print AA.pop(0) # 删除索引为 0 的元素print A |
---|
元组 Tuple
Tuple 是另一种有序的列表,中文翻译为“ 元组 ”。Tuple 和 List 非常类似,但是,Tuple一旦创建完毕,就不能修改了。
创建
创建tuple和创建list唯一不同之处是用 ( )
替代了 [ ]
。
1 |
t = ('Adam', 'Lisa', 'Bart') |
---|
现在,这个 t 就不能改变了,tuple没有 append()
方法,也没有 insert()
和 pop()
方法。
获取 tuple 元素的方式和 list 是一模一样的,也是使用索引来获取元素的。
tuple 创建时也可以省略 [ ]
:t = 1, 2, 3
,这样也是定义一个 tuple。
虽然 Tuple 的是不可变的,但我们可以用特殊的方法来创建一个 “可变” 的 Tuple。
123456789 |
L = ['A', 'B']T = ['a', 'b', L]print TL[0] = 'X'L[1] = 'Y'print T |
---|
运行结果:
['a', 'b', ['A', 'B']]
['a', 'b', ['X', 'Y']]
不是说 Tuple 一旦定义后就不可变了吗?怎么现在又变了?
别急,我们先看看定义的时候 Tuple 包含的 3 个元素:
当我们把 List 的元素 ‘A’ 和 ‘B’ 修改为 ‘X’ 和 ‘Y’ 后,Tuple 变为:
表面上看,Tuple 的元素确实变了,但其实变的不是 Tuple 的元素,而是 List 的元素。
Tuple 一开始指向的 List 并没有改成别的 List,所以,Tuple所谓的“不变”是说,Tuple的每个元素,指向永远不变。即指向 ‘a’,就不能改成指向 ‘b’,指向一个 List,就不能改成指向其他对象,但指向的这个 List 本身是可变的!
字典 Dict
创建
用 List 和 Tuple 可以用来表示顺序集合,例如,班里同学的名称:
1 |
L = ['Adam', 'Lisa', 'Bart'] |
---|
或者考试的成绩列表:
1 |
L = [95, 85, 59] |
---|
但是,要根据名字找到对应的成绩,就没办法表示了。所以就用到了 Dict,中文叫做字典:
12345 |
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59} |
---|
花括号 { }
表示这是一个 Dict,然后按照 key: value,
写出来即可。最后一个 key: value
的逗号可以省略。
访问
可以简单地使用 d[key]
的形式来查找对应的 value:
12345678 |
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59}print d['Adam']print d['Lisa']print d['Bart'] |
---|
注意:通过 key
访问 Dict 的 value
,只要 key 存在,Dict 就返回对应的 Value。如果 key 不存在,会直接报错:KeyError
。
为了避免 KeyError 发生,有两个办法:
- 使用 in 操作符来判断 key 是否存在,
'Paul' in d
,’Paul’ 不存在,则返回 False,存在返回 True。 - 使用 Dict 本身提供的一个 get 方法,
d.get("Paul")
,在 Key 不存在的时候,返回None
。
更新
添加
和 修改
在这里归类为更新。
1234567 |
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59}print d{'Lisa': 85, 'Adam': 95, 'Bart': 59} |
---|
添加一条信息:
1 |
d['Paul'] = 72 |
---|
在看看 dict 的内容:
12 |
print d{'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 59} |
---|
如果 key 已经存在,则赋值会用新的 value 替换掉原来的 value,也就是修改元素了:
12345678910 |
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59}print d# result:{'Lisa': 85, 'Adam': 95, 'Bart': 59}d['Lisa'] = 90print d# result:{'Lisa': 90, 'Adam': 95, 'Bart': 59} |
---|
删除
1234567891011121314 |
# coding=utf-8d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59}print dd.pop('Lisa') # 删除给定键对应的值print dd.popitem() #随机删除字典内容print dd.clear() # 清空字典内容print d |
---|
运行结果:
{'Lisa': 85, 'Adam': 95, 'Bart': 59}
{'Adam': 95, 'Bart': 59}
{'Bart': 59}
{}
遍历
1234567891011121314 |
# coding=utf-8d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59}for key in d: print key, ':', d[key]print("---------")for key,val in d.items(): print key, ':', val |
---|
特点
- 查找速度快,无论 Dict 有多少个元素,查找速度都是一样的,但是占用空间大。
- 由于 Dcit 是按照 key 查找,所以,在一个 Dict 中,key 不能重复。
- Dict 存储的
key-value
是没有顺序的。 - Dict 中作为 key 的元素必须是不可变的。Python 的基本数据类型如字符串、整数、浮点数都是不可变的,都可以作为 key,但是 list 是可变的,就不能作为 key。
集合 Set
创建
有时候,我们只想要保证元素不重复,但是用 Dict 的键值对形式又没必要,所以就有了 Set。
创建 Set 的方式是调用 set()
并传入一个 List,List 的元素将作为 Set 的元素:
123 |
s = set(['A', 'B', 'C', 'C'])print s# result : set(['A', 'C', 'B']) |
---|
由此可以看出 Set 是无序的,且不允许重复,传入的重复元素会被自动去除。
添加
添加元素时,使用 set 的 add()
方法:
1234 |
s = set([1, 2, 3])s.add(4)print s# result : set([1, 2, 3, 4]) |
---|
如果添加的元素已经存在于set中,add()
不会报错,但是不会加进去了:
删除
删除 set 中的元素时,用 set 的 remove()
方法:
1234 |
s = set([1, 2, 3, 4])s.remove(4)print s# result : set([1, 2, 3]) |
---|
如果删除的元素不存在 set 中,remove()
会报错:
1234567 |
s = set([1, 2, 3])s.remove(4)## Error Message:Traceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 4 |
---|
所以 remove()
之前最好判断一下。
遍历
123 |
s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])for x in s: print x[0] + ':',x[1] |
---|
输出结果:
Lisa: 85
Adam: 95
Bart: 59
运算符
Python 很强大,关于一些特殊的数据类型还有运算符:
运算符 |
Python 表达式 |
结果 |
描述 |
支持的数据类型 |
---|---|---|---|---|
+ |
[1, 2] + [3, 4] |
[1, 2, 3, 4] |
合并 |
字符串、列表、元组 |
* |
‘Hi!’ * 4 |
[‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] |
复制 |
字符串、列表、元组 |
in |
3 in (1, 2, 3) |
True |
元素是否存在 |
字符串、列表、元组、字典、集合 |
not in |
4 not in (1, 2, 3) |
True |
元素是否不存在 |
字符串、列表、元组、字典 、集合 |
内置函数
Python 中还有很多内置的函数,这里我们介绍一些常用的关于基本数据类型的内置函数:
序号 |
方法 |
描述 |
---|---|---|
1 |
cmp(item1, item2) |
比较两个值 |
2 |
len(item) |
计算容器中元素个数 |
3 |
max(item) |
返回容器中元素最大值 |
4 |
min(item) |
返回容器中元素最小值 |
5 |
del(item) |
删除变量 |
其他
可变类型与不可变类型
可变类型,值可以改变:
- 列表 List
- 字典 Dict
不可变类型,值不可以改变:
- 数值类型 int, long, bool, float
- 字符串 str
- 元组 tuple
值传递还是引用传递?
关于 Pyhton 中函数传递参数的问题,Python 中有可变类型
和不可变类型
,在参数传递的时候分为两种情况:
- 对于不可变类型,调用自身的任意方法,并不会改变对象自身的内容,这些方法会创建新的对象并返回,保证了不可变对象本身是永远不可变的。
- 对于可变类型,调用自身的任意方法,会改变对象自身的内容。
我们可以用
id()
来判断两个变量是否为同一个值的引用。 我们可以将 id 值理解为那块内存的地址标示。 1 2 3 4 5 6 7 8 9 10 11>>> a = 1 >>> b = a >>> id(a) 13033816 >>> id(b) # 注意两个变量的id值相同 13033816 >>> a = 2 >>> id(a) # 注意a的id值已经变了 13033792 >>> id(b) # b的id值依旧 13033816
- .NET Core采用的全新配置系统[8]: 如何实现配置与源文件的同步
- 四个问答让你秒懂区块链原理及应用
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
- 【机器学习实战】第11章 使用 Apriori 算法进行关联分析
- 【Scikit-Learn 中文文档】概率校准 - 监督学习 - 用户指南 | ApacheCN
- ASP.NET MVC路由扩展:链接和URL的生成
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
- C+实现神经网络之贰—前向传播和反向传播
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求
- 2017奇葩机器人大盘点:一言不合让你变瞎
- 【机器学习实战】第14章 利用SVD简化数据
- 异步数据存储声明
- 区块链学堂——公有链、私有链、联盟链、侧链、互联链
- 人工智能将让我们更擅长辩论
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 71-STM32+ESP8266+AIR202基本控制篇-移植使用-移植微信小程序MQTT底层包到自己的工程项目
- 目标检测 | Anchor free之CornerNet网络深度解析
- 手把手教你 3 分钟搞定个人网站 http 免费升级到 https
- 设计模式(四):通过做蛋糕理解构建模式及Android中的变种
- 如何入门使用腾讯云物联网开发平台 IoT Explorer,开发一盏智慧城市的智能灯?
- 知道吗?容器镜像也可以延迟拉取!
- ansible超详细讲解,值得收藏
- 实战渗透 - 一个怎么够?我全都要!
- 详解 Numpy 中的视图和副本
- 详解 matplotlib 中的两种标注方法
- 混搭 TypeScript + GraphQL + DI + Decorator 风格写 Node.js 应用
- 彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!
- Kubernetes控制器--副本集ReplicaSet
- Awesome Kubernetes 系列:第一期
- Mongodb多键索引之数组文档