Python爬坑之基本数据类型
最近入了python的坑。因为本人是一名前端开发人员,所以本文就以一个前端的视角对比下JS和Python。本文是基于Python3进行说明
talk is cheap,show me the code.
先放一张图
Python3 中有六个标准的数据类型:
- Number 数字
- Str 字符串
- List 列表
- Tuple 元组
- Set 集合
- Dict 字典
其中:
- 不可变数据(3 个):
Number(数字)
、String(字符串)
、Tuple(元组)
- 可变数据(3 个):
List(列表)
、Dictionary(字典)
、Set(集合)
Number 数字
数字有四种类型 分别是:
1.整型(int)
2.浮点型 (float)
3.布尔类型(bool)
4.复数(complex)
-
整型和浮点型
在python3中的整型只有一种
int
, 浮点型也只有一种float
。
其他语言的整数:(short) (int) (long);
其他语言的浮点数:单精度(float) 双精度(double)
>>> type(1)
<class 'int'> # 整型
>>> type(1.0)
<class 'float'> # 浮点型
>>> type(1+1.0)
<class 'float'> # 浮点型
>>> type(-1)
<class 'int'> # 整型
>>> type(-1.0)
<class 'float'> # 浮点型
- 布尔型
有些人可能会奇怪,尤其是前端。因为在js
中数值型
和布尔型
是两个不同的类型。而在python
中布尔型
则是属于数值型
的。其实也不难理解,True
就是1
,False
就是0
嘛
python中的布尔值的首写字母一定是大写的
>>> type(False)
<class 'bool'> # bool类型
>>> type(True)
<class 'bool'> # bool类型
>>> int(True)
1 # 因为布尔类型是数字的子类型, 所以True可以转换为1
>>> int(False)
0
>>> bool(0.5) # 非0 非空的数值 都是bool真值
True
>>> bool(-1)
True
>>> bool(0) # 数值0 都是bool假值
False
>>> bool('') # 空str 都是bool假值
False
>>> bool([]) # 空列表 都是bool假值
False
>>> bool(()) # 空元祖 都是bool假值
False
>>> bool({}) # 空集合 都是bool假值
False
>>> bool(None) # 类型NoneType 都是bool假值
False
关于复数complex科学计算会用到,一般的运用很少。我这里只作了解。使用小写字母 j 来表示复数
>>> 35j
35j
Str 字符串
Python
中的字符串和JS
中的字符串除了操作方式之外几乎没有什么区别
字符串表示
-
单双引号配合
>>> "let's go baby!" # 单双引号区分 "let's go baby!" >>> 'let"s go baby~' 'let"s go baby~' >>> 'let\'s go baby.' # 转义(\)字符 "let's go baby."
-
三引号多行换行
>>> ''' python字符串换行 有点像markdown python字符串换行 有点像markdown python字符串换行 有点像markdown ''' '\npython字符串换行 有点像markdown\npython字符串换行 有点像markdown\npython字符串换行 有点像markdown\n' # 三引号自动换行 >>> print('反斜杠n的作用\n是回车\n测试') # 转义字符 \n 反斜杠n的作用 是回车 测试 >>>
-
转义字符
>>> print('hello \\n world') # 通过双反斜杠\\ 来转义\n hello \n world >>> print(r'hello \n world') # 通过前面加小写r 来来转义\n 加r之后变成原始字符串 hello \n world
字符串运算
>>> 'hello'+'world' # 简单字符串拼接
'helloworld'
>>> 'hello'*3 # 字符串相乘 注意:Python的字符串是可以相乘的 JS中除了数值型的字符串相乘是相应的数值乘法外,其余得到的结果全是NaN
'hellohellohello'
>>> 'helloworld'[0] # 通过下标获取字符串单个元素
'h'
>>> 'helloworld'[-1] # 从字符串的末尾开始数
'd'
字符串截取(切片)
>>> 'helloworld'[0:5] # 截取 从下标0开始向前数5位
'hello'
>>> 'helloworld'[0:-1] # 截取 从下标0开始向后数1位
'helloworl'
>>> 'helloworld'[5:] # 从向前数5个下标 自动截取到字符串的末尾
'world'
>>> 'helloworld'[-5:] # 从向后数5个下标 自动截取到字符串的末尾
'world'
>>> 'helloworld'[:-5] # 从下标0开始 向后数5位
'hello'
>>> 'helloworld'[:5] # 从下标0开始 向前数5位
'hello'
List 列表
基本可以理解为JS中的Array
>>> [1,2,3,4,5,6] # 逗号分隔开
[1, 2, 3, 4, 5, 6]
>>> type([1,2,3,4,5,6]) # list类型
<class 'list'>
>>> [1,'str',2,True,3,4,False,5,6] # 列表元素可以有多种类型
[1, 'str', 2, True, 3, 4, False, 5, 6]
>>>
列表的基本操作
-
访问 截取
>>> ['a', 'b', 'c', 'd'][1] # 访问列表中的某个元素 'b' >>> ['a', 'b', 'c', 'd'][0:2] # 截取列表 ['a', 'b'] >>> ['a', 'b', 'c', 'd'][-1:] # 反向截取列表 ['d']
-
列表的运算
>>> ['a', 'b', 'c', 'd']+['e','f'] # 类似于JS中的 [].concat() ['a', 'b', 'c', 'd', 'e', 'f'] >>> ['aaa'] * 2 # 列表的乘法 注意:JS中不支持数组的乘法哦 ['aaa', 'aaa']
-
判断列表中的元素是否存在
>>> 3 in [1,2,3] # 类似于JS中的arr.indexOf() True >>> 3 in [7,8,9] False >>> 3 not in [7,8,9] True
Tuple 元组
元组的定义和列表基本一致。但是主要有两个特点 1 元祖使用()小括号来表示
2 元祖不可变
>>> type((1,2,3)) # tuple元祖类型
<class 'tuple'>
>>> (1,2,3,4,5,6) # 逗号隔开
(1, 2, 3, 4, 5, 6)
>>> (1,True,'str',2) # 元素可以有多种类型
(1, True, 'str', 2)
>>> (1, 2, 3, 4, 5, 6)[0] # 通过下标访问元素
1
>>> (1, 2, 3, 4, 5, 6)[0:3] # 元祖截取
(1, 2, 3)
>>> (1,2,3)+(4,5,6) # 元祖相加 和list操作一样 类似JSON数组操作[].concat
(1, 2, 3, 4, 5, 6)
>>> (1,2,3)*2 # 元组乘法 同列表
(1, 2, 3, 1, 2, 3)
>>>
- 列表和元祖的区别
tuple 不可变,所以代码更安全。如果可能,能用 tuple 代替 list 就尽量用 tuple
Set 集合
特点
-
集合无序的 序列是有序的
>>> {1,2,3,4,5,6} # 用大括号来定义集合 {1, 2, 3, 4, 5, 6} >>> type({1,2,3,4,5,6}) # 集合是 set类型 <class 'set'> >>> {1,2,3,4,5,6}[0] # 会报错 因为集合是无序的 所以无法通过下标来访问集合中的元素
-
集合是不重复的 会自动过滤掉重复的元素
>>> {1,1,1,2,2,2,5,6,6,7,8,7,7,7} # 自动过滤重复元素 {1, 2, 5, 6, 7, 8}
集合的运算
-
差集 交集 并集
>>> type(set()) # set()用来定义一个空的集合 如果直接用{}来定义空集合,那么此时它的类型不是set 而是dict <class 'set'> >>> len({1,2,3}) # len() 求集合的长度 3 >>> 1 in {1,2,3} # 判断某个元素是否存在于集合中 True >>> 1 not in {1,2,3} # 判断某个元素是否不存在于集合中 False >>> {1,2,3,4,5,6} - {3,4} # 差集: 剔除两个集合中共有的元素 {1, 2, 5, 6} >>> {1,2,3,4,5,6} & {3,4,7} # 交集: 求两个集合中的共有的元素 {3, 4} >>> {1,2,3,4,5,6} | {3,4,7} # 并集: 求两个集合中所有的不重复的元素 {1, 2, 3, 4, 5, 6, 7}
Dict 字典
特点
1. key/value 形式 (类似于 JS 中对象的key/value)
2. 字典的 key 不能重复
3. 字典的 key 必须是不可变的类型 `int str tuple`
字典的相关操作
>>> {1:1,2:2,3:3} # key/value形式定义字典
{1: 1, 2: 2, 3: 3}
>>> type({1:1,2:2,3:3}) # dict类型
<class 'dict'>
>>> {(1,2,3):'元祖是不可变的',2:2,3:3} # 元祖是可以作为key的 因为元祖具有不可变的特性
{(1, 2, 3): '元祖是不可变的', 2: 2, 3: 3}
>>> {'name':'tiger', 'age':'25'}['name'] # 字典通过key去访问vlue 和JS中的对象基本一致
'tiger'
>>> {'name':'tiger', 'age':'25', 'name':'pig'} # 字典的key不能重复 key重复了虽然不会报错 但是后面的key会覆盖掉前面的key
{'age':'25', 'name':'pig'}
总结
此时,再回看一遍文章开头放的图 脑中对Python
基本数据结构就比较清晰了:
首先,我们把Python
的基本数据结构分为两类: 数字
和 组
。数字类型
又分为了整型
浮点型
布尔型
和复数型
,这些概念刚才也讲过了,相对简单,就不多赘述。主要说下组
的概念:
-
组
组类型
又可以分为序列
集合
和字典
。-
序列
- 特点: 序列是有序的,可以通过
下标
或者索引
去访问其中的元素,比如说列表
元祖
和字符串
它们都是序列,都可以通过索引
去访问其中的元素。但注意其中的字符串
和元祖
是不可变的。
- 特点: 序列是有序的,可以通过
-
集合
- 特点: 集合是无序且元素是不能重复的,所以不能通过
下标
或者索引
去访问其中的元素,当然也不能切片
- 特点: 集合是无序且元素是不能重复的,所以不能通过
-
字典
- 可以简单的将其理解为
JS
中的对象,可通过key
去访问其value
。其中key
必须是不可变的,比如数字
字符串
甚至元祖
都可以作为字典的key
,因为元祖
同样具有不可变性。
- 可以简单的将其理解为
-
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。