关于Python 数据类型与运算符有哪些是你不知道的?

摘要:

Python数据类型和运算。

1.Python数据类型

Python中一切皆对象。对象是Python对数据的抽象。Python程序中所有数据都是由对象或者对象之间的关系表示的(代码也由对象来表示)。

每个对象都有:

1、标识(id)

2、类型(type)

3、值(value)

对象的标识在创建以后不会改变,对象标识(id)可以使用id()函数得到(一个整数标识)。可以使用 is 操作符可以比较两个对象的标识(id),来判断两个变量是否绑定到同一个对象。

对象的类型决定对象所支持的操作,例如:可求长度吗?,求最大值?,能做累加?等等。也定义了该类对象的可能值。使用type()函数可以获得对象的类型。在Python中类型也是对象。和对象标识一样,对象的类型也是不能改变的。

有些对象的值可以改变。可以改变值的对象称为“可变对象”,一旦创建后其值不能改变的对象称为“不可变对象”。

有种情况:一个不可变的容器对象内部包含了一个可变对象的引用,当可变对象的值被改变后,不可变容器对象的值会随着可变对象的值而变化。但是容器仍然被认为是不可变的(因为容器包含的对象集合不能被改变)。

图:元组是不可变对象

a是列表,可变对象;b是元组不可变对象,b元组内包含对列表a的引用。当a列表中的值被修改后,元组b引用也会跟着改变。

一个对象的可变性是由它的类型决定的,如:数字,字符串,元组是不可变的;列表,字典是可变的。

对象不需要显示的销毁,当它们不可访问时,它们可被解释器自动回收。回收可能有延迟,这主要取决于垃圾回收实现的机制。Cpython目前使用引用计数方案,具体请参考GC模块文档。有些对象包含“外部”资源的引用,如:打开文件和窗口,这类对象考虑到当释放对象时,垃圾回收不一定发生,所以这类对象提供了显示的方法释放资源,通常时提供一个close()方法(函数)。对于这类对象建议(必须)程序显示的关闭这类对象。

对于不可变类型,计算新值的操作实际上可以返回具有相同类型和值的任何现有对象的引用,而对于可变对象则不允许这样做。例如,在a = 1之后,b=1,a和b可以根据值的实现而引用同一个对象,也可以不引用同一个对象,但在c = [];d=[]之后,c和d保证引用两个不同的、唯一的、新创建的空列表。(注意,c = d = []会将相同的对象分配给C和d)

Python中有内建数据类型,也有自定义类型。Python语言升级也可能增加数据类型,如:有理数,有效存储整数数组等,通常会通过标准库实现这些类型。

接下来将分类介绍几种内建数据类型。

2.Python主要内建类型

1、None

空或无,该类型具有单个值,有一个具有此值的单个对象。这个对象通过内建的名字None访问。用于表示在不存在的值,比如:函数返回值。它的布尔值是False。

2、NotImplemented

未实现。此类型就有单个值,有一个具有此值的单个对象。通过内建的名字:NotImplemented访问。如果数值方法和“富”比较方法不能对所提供的操作数实施操作将返回此值。它的布尔值是True。

3、Ellipsis

此类型具有单个值,有一个具有此值的单个对象。这个对象通过字面值...或内建名字Ellipsis访问。它的布尔值是True。

4、数值类型

数值类型由常数数字构成,或则由算术操作符和内建算术函数作为结果返回。数值对象是不可变的,一旦创建它门的值将永远不会改变。Python数字与数学数字密切相关,但受计算机中数字表示的限制。

数值类型分类有:整数,浮点数,复数。

图:数值类型

整数:

表示来自整数的数学集合(正和负)的元素,有两种类型的整数:

整型(int)

有正负,没有小数的所有整数,表示的数值范围没有限制,只受限于可用的(虚拟内存)内存。对于以移位和掩码为目的的运算,长整数采用二进制的形式,负数用二进制补码形式表示。

图:int类型

布尔型(bool)

只有两个值,True(真)和False(假),由两个布尔对象表示。布尔类型是普通整数类型的子类型。布尔值的行为几乎在所有的环境中都分别类似0和1,True对应1,False对应0。一个特里是用str转换布尔对象为字符串对象时,False转换成“False”,True转换成“True”。

图:bool类型

浮点数(float):

表示机器级双精度浮点数。接受的范围受底层的机器体系结构(和C或者Java的实现)控制,你需要做溢出处理。Python不支持单精度浮点数,使用单精度浮点数的原因通常是节省处理器和内存的使用,但是这相比Python中对象使用的开销是微不足道的,因此没有必要支持两种浮点数使语言变的复杂。

图:float类型

复数(complex)

表示作为一对机器级双精度浮点数的复数。复数z的实部和虚部可以通过只读属性z.real和z.imag获得。

图:complex类型

5、Sequences(序列)

表示由非负数索引的有限有序集。内建的函数len()返回序列的元素个数。当序列的长度为n时,索引集包含数字0,1,...,n -1。序列a的第i个元素通过a[i]来选择。

序列也支持切片:a[i:j]选择索引k满足i

某些序列还支持带有第三个“步长”参数的“扩展切片”:a[i:j:k] 选择a 中所有索引为x的 的元素,x = i + n*k, n >= 0 且i

序列根据它们的可变性区分:不可变序列,可变序列。

以下类型是不可变序列:

字符串

字符串是由表示Unicode码点的值组成的一个序列。在U+0000 - U+10FFFF范围内的所有码点都可以在字符串中表示。Python没有char类型;字符串中个每个码点通过长度为1的字符串对象表示。内建函数ord()将一个码点从字符串形式转换为范围在0 - 10FFFF之间的一个整数;chr()将0 - 10FFFF范围之间的一个整数转换为对应的长度为1的字符串对象。str.encode()可以用来使用给定的文本编码将str转换为bytes,bytes.decode()可以用来实现相反的操作。

字符串细节参考本号笔记《Python字符串笔记》

元组

元组的项目是任意的Python对象。两个或多个项的元组由逗号分隔的表达式列表形成。可以通过将逗号附加到表达式(表达式本身不创建元组,因为括号必须可用于表达式的分组)来形成一个项目('singleton')的元组。一个空的元组可以由空的一对括号形成。

元组细节参考本号笔记《学习Python元组,有哪些必须要掌握的内容?》

字节

字节对象是一个不可变的数组。元素是由范围在0

可变序列

可变序列在创建后可以更改。下标和切片表示法可以用于赋值和del(delete)语句的目标。

目前有两种内在的可变序列类型:

列表

列表的项目是任意的Python对象。列表是通过在方括号中放置逗号分隔的表达式列表而形成的。(注意,没有特殊情况需要形成长度为0或1的列表)

列表细节参考本号笔记《Python列表》

字节数组

bytearray对象是一个可变数组。它们由内建的bytearray()构造函数创建。除了可变(因此不可缓冲)之外,字节数组提供与不可变字节对象相同的接口和功能。

扩展模块array提供另外一个可变序列类型的例子,collections模块也是。

6、集合类型

表示无序的,有限的独特的,不可变的对象集合。因此,它们不能被任何下标索引。然而,它们可以迭代,内建函数len()返回集合中元素的个数。集合的常用用法是快速成员测试,从序列中去除重复,以及计算数学运算,例如交叉,共用体,差和对称差。

对于集合元素,相同的不变性规则适用于字典键。注意,数值类型遵循正常的数值比较规则:如果两个数字相等(例如,1和1.0),其中只有一个可以包含在集合中。

目前有两种内在集合类型:

集合(可变结合)

这些表示可变集。它们由内建函数set() 构造函数创建并可以在此之后通过几种方法修改,例如add()。

不可变集合

这些代表一个不可变的集合。它们由内建函数frozenset()构造函数创建。因为固定集合不可变且可以哈希,它可以作为另外一个集合的元素,或者作为字典的键。

集合细节参考本号笔记《Python 集合学习笔记》

7、映射

这些表示由任意索引集索引的有限对象集合。下标表示法a[k]从映射a中选择由k索引的元素;它可以用在表达式中并作为赋值或del语句的目标。内建函数len()返回映射中元素的个数。

目前有一种单一的固有映射类型:

词典

这些表示由几乎任意值索引的对象的有限集合。不能作为键接受的值的唯一类型是包含列表或字典或其他可变类型的值,它们通过值而不是对象标识进行比较,原因是字典的有效实现需要密钥的哈希值保持不变。用于键的数值类型遵循正常的数值比较规则:如果两个数字相等(例如,1和1.0),那么它们可以互换地使用来索引同一个字典条目。

字典是可变的;它们可以通过{...}表示法创建(参见字典的显示一节)。

扩展模块dbm.ndbm和dbm.gnu提供另外几种类型的映射,collections模块也是。

字典细节参考本号笔记《Python 字典 dict 学习笔记》

8、可调用类型(Callable类型)

是可以使用函数调用操作(参考调用一节)的类型,使用callable()函数来测试。

3.Python表达式与运算

Python表达式由数值和操作符(运算符)构成,所有表达式都是可以求值的,求得单一的值。如1+2,1和2是数值,+是操作符。单个数字也可以看作表达式,如1,2。

操作符(运算符):

正负号运算符

语法:

+ 表达式

- 表达式

算术运算符:

图:算术运算符

运算中 * 表示乘法,/ 表示除法,不同C语言等这里 / 是实数运算,3/2=1.5,%是求余数运算,不同于其他语言,求余操作可操作浮点数,如23%2.5=0.5,这个有点另类。//是地板除,向小取整。**表示幂运算。

运算符有优先级和结合序的问题。

关系运算:

图:关系运算

关系运算符:

图:关系运算符

位运算符

& 按位与,参与位与的两位都为1,则结果为1,否则为0

| 按位或,参与位或的两位有任何一个位1,则结果为1,否则结果为0

^ 按位异或,参与位异或的两位如果不同,则结果为1,否则结果为0

~ 按位取反,语法:~ 表达式,将表达式结果按位取反。

>> 右移,语法:表达式a >> 整数表达式b, 将表达式a的结果的二进制值向右移位b位。

布尔运算

分隔符:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180304A17K2F00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券