Python中的数据类型
怎样理解高级计算机程序设计语言中的数据类型 ?
7.1 数据类型定义了数据的"类型"和"运算"
首先,数据类型定义了数据的"类型",它指的是数据在内存中的布局,包括数据元素所占的内存空间大小和存储模式,就像我们前面介绍过,整型和浮点型有各自的内存布局,这也适用于其他数据类型。我们定义数据类型时,原则是使数据所占的内存空间最小。比如,浮点数在Python中占用的内存空间通常为24位二进制数。
>>> import sys
>>> f=3.2
>>> print(sys.getsizeof(f))
24
其次,数据类型定义了可在数据上执行的"运算"。比如,对整型数我们可以进行加减乘除、乘方、求模、比较运算、布尔运算等运算;对列表我们可以进行添加元素、删除元素、插入元素、求列表长度、索引运算、切片、列表解析等运算。不同的数据类型,可以执行的运算不同。
7.2 基本数据类型和扩展数据类型
Python中的基本数据类型是内置的数据类型,对所有使用Python语言编写的程序都适用,而无需自行定义或导入其他开发者开发的模块。
Python中的基本数据类型包括: 数字( 整数、布尔类型、浮点数、复数 )、字符串、列表、元组、字典、集合。
扩展数据类型是开发人员在内置数据类型的基础上自定义的数据类型,通常通过面向对象程序设计方法中的"类"进行定义,类定义同时定义了该数据类型包含的数据元素和对该数据类型可执行的运算( 通过类的"方法"实现 )。扩展数据类型的定义一般放置在开发者开发的模块中,使用它们需要导入这些模块,否则无法使用这些类型。自定义数据类型是高级程序设计语言开发的魅力之一。通过提供自定义数据类型,为编写程序提供了无限的可能。
使用Python语言进行开发的另一个魅力在于它拥有大量的第三方模块( 类似于C函数库 )。很多时候,在Python下开发一个应用程序的任务只是找到一个合适的模块,然后按要求进行调用即可,开发效率非常高。因此,Python常用于应用程序的原型开发,即,首先编写一个Python版的应用程序,验证该设计是否能够实现,然后再用java、C++、C等语言实现这个应用程序,以提高程序的运行速度。另外,Python在金融分析和人工智能方面的应用也非常广泛,已成为在这两个领域中排名第一的程序设计语言,其主要原因就是可用模块多、代码简明易懂,开发效率高。
下面举个例子,我们可以导入Python第三方库中的汉字转拼音的一个模块,进行拼音的处理。
首先,安装这个库
# pip install pypinyin
然后,尝试如下代码:
>>> import pypinyin as py >>> py.lazy_pinyin("中国") ['zhong', 'guo'] >>> py.lazy_pinyin("中国", style=py.TONE) ['zhōng', 'guó']
可以看到,只需几行代码,就可以完成这项任务了。
7.3 基本数据类型的分类
对基本数据类型进行分类可按三种标准进行。
第一种分类方式是按照存储模型分。Python的数据类型有的能容纳一个值,有的能容纳多个值。能容纳一个值的数据类型,我们称之为原子类型 ( 一个值就是一个原子,它是一个整体 ),能容纳多个值的数据类型,我们称之为容器类型,因为它们像容器一样,容纳很多东西。数字( 整型、浮点型、布尔型、复数 )和字符串都是原子类型 ( 一个字符串是一个"独特"的值 ) 。列表、元组、字典、集合都是容器类型,容器类型中可以包含各种相同或不同的东西。
d=3 # 原子类型
f=3.2 # 原子类型
s="chinese people" # 原子类型
# "chinese people"是一个整体
l=[1,2,"china", (3, 4)] # 容器类型,列表
第二种分类方式是按照可变和不可变进行划分。数字、字符串、元组是不可变类型,你不能对数字、字符串进行修改,也不能修改元组中的元素值,每当你这样做的时候,你就创建了一个新的对象,使用id( )函数可以看到变量指向的地址发生了变化。列表、字典、集合是可变类型,你可以修改它们中容纳的元素数量和值,当你这样做的时候,使用id( )函数可以看到变量指向的地址仍然没有变化。
>>> f=3.2
>>> id(f)
140067454836000 # f指向的地址
>>> f=6.5
>>> id(f)
140067454835928 # f指向了新的地址,说明新建了一个对象,
# 原对象 ( 3.2 ) 占用的内存被系统回收了
>>> l=[1,2,3,4]
>>> id(l)
140067488954184 # l指向的地址
>>> l[3]=(3,5)
>>> l
[1,2,3,(3,5)] # 修改了l的值
>>> id(l)
140067488954184 # l指向的地址不变
第三种分类方式是按照访问模式进行划分。访问模式有三种: 直接存取、顺序访问、和按映射访问。其中,非容器类型都可直接访问;序列( 字符串、元组、列表 ) 可以顺序访问其中的元素;字典可以按映射( 键 )进行访问其中的的元素;集合不在上述分类中。
>>> f=3.2
>>> f2=f+2.0 # 直接访问f
s="chinese people"
s2=s[0]+s[-1] # 按下标访问s中的元素
d={"father": "whx", "mother": "yw", "son": "wyf"} # 字典
son=d["son"] # 按键访问字典中的元素son=="wyf“