数据类型
在python这门语言中,数据类型分为两种。 内置的和自定义的。
内置的包括数字、字符串、布尔、列表、元组、字典、Bytes、集合这些常用的以及一些不太常用的数据类型。 而自定义的,一般以类的形式,根据需要组合以上内置类型成为独特的数据类型。
数据类型是Python语言非常重要的部分(哪部分不重要?),尤其是不同数据类型所支持的原生操作,更是重中 之重,需要熟练的背在脑海里。很多时候,写大型项目时,不需要你多复杂的技巧,只需要用这些数据操作方法 就可以。
原因之一,更好的分配管理内存,节省不必要的开支。如果没有数据类型的区别,那么所有的对象都必须按体积最 大的对象所必须大小的房子分配空间,也就是内存空间,这样的浪费太严重了。
有了数据类型,计算机就可以根 据类型预定义的空间需求分配大小,合理开支。内存节省精简了,还能提高读取速度和运行效率。
原因之二,方便统一管理,提供同样的API。这样,我们可以为同一数据类型,提供同样的操作,限制其它不允 许的行为。也易于查找错误,定位问题。
原因之三,区分数据类型,更贴切人类对自然事物的分类管理习惯。我们人类对事物都进行了各种分类,植物是 植物、动物是动物,书是书,笔是笔。分类了之后,我们很自然的知道书可以读,笔可以写。数据类型也一样, 让我们对抽象的数据有了可分辨的行为和自然的记忆。
- 数字
- 字符串
- 布尔
- 列表
- 元组
- 字典
- bytes
数字类型
数字类型是不可变类型。所谓的不可变类型,指的是类型的值一旦有不同了,那么它就是一个全新的对象。数字 1和2分别代表两个不同的对象,对变量重新赋值一个数字类型,会新建一个数字对象。
还是要强调一下Python的变量和数据类型的关系,变量只是对某个对象的引用或者说代号、名字、调用等等,变 量本身没有数据类型的概念 。只有1,[1,2],"hello"这一类对象才具有数据类型的概念。 Python 支持三种不同的数字类型,整数、浮点数和复数。
整数
通常被称为整型,数值为正或者负,不带小数点。python 3的整型可以当做Long类型使用,所以python 3 没有 python 2的Long类型。
表示数字的时候,有时我们还会用八进制或十六进制来表示:
十六进制用0x前缀和0-9,a-f表示,例如:0xff00
八进制用0o前缀和0-7表示,例如0o45
python的整数长度为16,32位,并且通常是连续分配内存空间的。
id(-2)
505205760
id(-1)
505205776
从上面的空间地址看,地址之间正好差16,32。
小整数对象池
python初始化的时候会自动建立一个小整数对象池,方便我们调用,避免后期重复生成!这是一个包含262个指 向整数对象的指针数组,范围是-5到256。也就是说比如整数10,即使我们在程序里没有创建它,其实在Python后台已经悄悄为我们创建了。
为什么要这样呢?我们都知道,在程序运行时,包括Python后台自己的运行环境中,会频繁使用这一范围内的整 数,如果每需要一个,你就创建一个,那么无疑会增加很多开销。创建一个一直存在,永不销毁,随用随拿的小 整数对象池,无疑是个比较实惠的做法。
id(-6)
10114720
id(-5)
496751568
id(255)
496755728
从id(-6)和id(257)的地址,我们能看出小整数对象池的范围,正好是-5到256。
除了小整数对象池,Python还有整数缓冲区的概念,也就是刚被删除的整数,不会被真正立刻删除回收,而是在 后台缓冲一段时间,等待下一次的可能调用。
a = 100
id(a)
503175776
del a # 删除变量a
b = 100
id(b) 503175776
a = 10;print(id(a));del a;b = 10;print(id(b)) # 在Python交互环境中不能实现。
上面,我给变量a赋值了整数100,看了一下它的内存地址。然后我把a删了,又创建个新变量b,依然赋值为 100,再次看下b的内存地址,和以前a存在的是一样的。
浮点数
浮点数也就是小数,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,一般用科学计数法表示,把 10用e替代,1.23x10^9就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等
复数(complex)
复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示,复数的实部a和虚部b都是浮点。
数字类型转换
在某些特定的情况下,我们需要对数字的类型进行转换。python为我们提供了内置的数据类型转换函数。
int(x) 将x转换为一个整数。如果x是一个浮点数,则截取小数部分
float(x) 将x转换成一个浮点数
complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。
complex(x, y): 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。
转换过程中如果出现无法转换的对象,则会抛出异常,比如int(“haha”)
数学计算
对于数学计算,除了前面提到过的简单的加减乘除等等,更多的科学计算需要导入 math 这个库,它包含了绝 大多数我们可能需要的科学计算函数,如下表:
布尔类型
对于错、0和1、正与反,都是传统意义上的布尔类型。
但在Python语言中,布尔类型只有两个值,True与False。请注意,是英文单词的对与错,并且首字母要大写, 不能其它花式变型。
布尔值通常用来判断条件是否成立。 例如:
a = 1
if a > 3:
print("a是一个大于3的数字")
else:
print("a不是一个大于3的数字")
Python内置的 bool() 函数可以用来测试一个表达式的布尔值结果。
这里需要注意的是,3 is “3” 为什么是False呢?一个是整数一个是字符串。is是运算符比较的是对象,当然是错误的。
>>> bool(1)
True
>>> bool(0)
False
>>> bool([])
False
>>> bool(())
False
>>> bool({})
False
>>> bool(-1)
True
>>> bool('')
False
>>> bool("False")
True
>>> bool("True")
True
>>> bool(0.0)
False
>>> bool(1.0)
True
>>> bool(-0.0)
False
0、0.0、-0.0、空字符串、空列表、空元组、空字典,这些都被判定为False。而-1、"False"也被判断 为True。 布尔类型可以进行and、or和not
布尔类型可以进行and、or和not运算
and运算是与运算,只有所有都为True,and运算的结果才是True:
>>> True and True
True
>>> True and False
False
>>> False and False
False
>>> 5 > 3 and 3 > 1
True
or运算是或运算,只要其中有一个为True,or运算结果就是True:
>>> True or True
True
>>> True or False
True
>>> False or False
False
>>> 5 > 3 or 1 > 3 True
not运算是非运算,它是单目运算符,把True变成False,False变成True:
>>> not True
False
>>> not False
True
>>> not 1 > 2
True
布尔类型还能做别的运算吗?
>>> True > False
True
>>> True < False
False
>>> True >=False
True
>>> True -1
0
>>> True + 1
2
>>> True *3
3
>>> False -1
-1
并且在做四则运算的时候,明显把True看做1,False看做0。
空值
空值不是布尔类型,严格的来说放在这里是不合适的,只不过和布尔关系比较紧密。
空值是Python里一个特殊的值,用None表示(首字母大写)。None不能理解为0,因为0是整数类型,而None 是一个特殊的值。None也不是布尔类型,而是NoneType。
>>> bool(None)
False
>>> type(None)
<class 'NoneType'>
列表
列表是Python中最基本也是最常用的数据结构之一。列表中的每个元素都被分配一个数字作为索引,用来表示该 元素在列表内所排在的位置。第一个元素的索引是0,第二个索引是1,依此类推。
Python的列表是一个有序可重复的元素集合,可嵌套、迭代、修改、分片、追加、删除,成员判断。 从数据结构角度看,Python的列表是一个可变长度的顺序存储结构,每一个位置存放的都是对象的指针。
对于这个列表 alist = [1, “a”, [11,22], {“k1”:”v1”}],其在内存内的存储方式是这样的:
创建方式
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。
['1',2,'hello'] # 列表
('1',2,'hello') # 元组
{'1',2,'hello'} # 集合
{'name':'juran','age':18}
for i in ['1',2,'hello']:
print(i)
# 通过查看源码来看创建的方法
l = list(['1',2,'hello'])
print(l)
l = [1, 2, 3]
l1 = [1, 'hello', 1.2]
print(l1)
-------------------------------------------------
list = [] # 定义空列表
list1 = ['physics', 1997, 2000]
list2 = [1, 2, 3]
list3 = ["a", "b", "c"]
访问列表内的元素
列表从0开始为它的每一个元素顺序创建下标索引,直到总长度减一 。要访问它的某个元素,以方括号加下标值 的方式即可。注意要确保索引不越界,一旦访问的 索引超过范围,会抛出异常。所以,一定要记得最后一个元素 的索引是len(list)-1。
>>> lis = ["a", "b", "c"]
>>> lis[0]
'a'
>>> lis[1]
'b'
>>> lis[2]
'c'
>>> lis[3]
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
lis[3]
IndexError: list index out of range
修改元素的值
直接对元素进行重新赋值。
>>> lis[0]
'a'
>>> lis[0] = "d"
>>> lis[0]
'd'
删除元素
使用del语句或者remove(),pop()方法删除指定的元素。
>>> lis = ["a", "b", "c"]
>>> del lis[0] # 根据索引删除
>>> lis
['b', 'c']
>>> lis.remove("b") # 直接根据值进行删除
>>> lis
['c']
>>> lis.pop() # 弹出最后一个
'c'
>>> lis
[]
l1 = [1, 'hello', 1]
l2 = l1.pop(1) # 根据索引来弹出 1为索引
print(l2)
列表的特殊操作
列表的常用函数
排序和反转
切片–也叫截取
切片指的是对序列进行截取,选取序列中的某一段。
切片的语法是:
list[start:end]
以冒号分割索引,start代表起点索引,end代表结束点索引。省略start表示以0开始,省略end表示到列表的结 尾。注意,区间是左闭右开的!
如果提供的是负整数下标,则从列表的最后开始往头部查找。例如-1表示最后一个元素,-3表示倒数第三个元 素。
切片过程中还可以设置步长,以第二个冒号分割,例如list[3:9:2],表示每隔多少距离取一个元素。
多维列表(嵌套列表)
a = [[1,2,3],[4,5,6],[7,8,9]]
a[0][1]
2
a = [[1,2,3],[4,5,6],{"k1":"v1"}]
a[2]["k1"]
v1
列表的遍历
列表有好几种遍历方式:
列表的内置方法
注意:其中的类似 append,insert, remove 等方法会修改列表本身,并且没有返回值(严格的说是返回 None)。
最后
人生苦短,Python当歌!!!
原创不易,严禁抄袭。