1.2 Python的基础数据类型及其使用
1.2.1 Python的变量类型和基础数据类型
1.2.1.1 Python的变量类型
变量是用来存储数据的。当声明一个变量时,Python 解释器会在创建变量的同时向计算机操作系统申请使用一个新的内存空间来存放该变量。为了充分利用内存空间,Python 解释器允许在这些被变量使用的内存空间存放不同的数据,因此变量可以指定为不同的数据类型,如整数、小数或字符等。
1)变量赋值
Python 语言在为变量赋值时无须声明类型。变量类型会被自动设置为所赋值的类型。在内存空间中创建的每一个变量都包括变量标识、名称和数据等信息。只有在为变量赋值时,变量才会被创建。赋值符是“=”,“=”左边是变量名,右边是存储在变量中的值。例如:
在上面的代码中,“100”“1000.0”“pork”分别被赋值给变量price、number和product_name,运行结果如图1.49所示。
图1.49 赋值示例代码的运行结果
第一次使用“=”(赋值符)为变量赋值也称为定义一个变量。此时,Python解释器会在内存中创建一个空间来存储被赋予的值,这意味着变量被创建了。例如,在下面的代码中,first_var和second_var在赋值的同时被创建了。
变量是带有类型属性的,在创建变量后可以通过下面的代码查看变量类型:
如果不再需要所创建的变量,则可以通过del语句删除单个或多个变量,例如:
如果需要同时删除多个变量,则可以使用“,”来隔开每个变量,例如:
删除变量可释放内存空间。
2)多个变量赋值
Python允许通过连等的方式为多个变量同时赋予同一个值,例如:
运行上面的代码后,Python解释器会在内存中创建一个整型数(值为1),并且通过赋值的方式将该整型数同时存储到a、b和c三个变量所在的内存空间。
除了可以为多个变量赋予同一个值,还可以同时为多个变量赋予不同的值,例如:
在上面的代码中,“=”左边是以逗号为间隔的多个变量,右边是要赋予的值,值的个数与变量的个数相同,这些值同样以逗号间隔。整型数1和浮点型数2.0分别分配给变量a和b,字符串“3-4”分配给变量c。
多个变量赋值的示例运行结果如图1.50所示。
图1.50 多个变量赋值的示例运行结果
1.2.1.2 Python的数据类型
为了更好地描述程序处理对象,在内存中存储的数据应该是包含多种类型的。例如,在存储某个人的相关数据时,他的年龄可以用数字来存储,他的名字可以用字符串来存储。Python 定义了一些数据类型,用于存储各种类型的数据,常见的数据类型包括 Numbers(数字)、String(字符串)、List(列表)、Tuple(元组)、Dictionary(字典)等。
1)数字类型
Python支持4种数字类型,不同数字类型的示例如表1.3所示。
表1.3 Python支持的4种数字类型示例
(1)整型数字类型(int):通常被称为整型或整数,可以是正整数或负整数,不包括小数点。
(2)长整型数字类型(long):大小不受限制的整数,最后是一个大写字母L。尽管长整型数字类型不区分大小写,但是建议使用大写“L”,以免与数字“1”混淆。
(3)浮点型数字类型(float):包含整数部分与小数部分,除了可以采用常见的十进制小数形式,还可以使用科学计数法的形式,如2e-2(表示2×10-2)。
(4)复数型数字类型(complex):由实数部分(实部)和虚数部分(虚部)构成,可以用a+bj或者complex(a,b)表示,其中复数的实部a和虚部b都属于浮点型数字类型。
Python语言中关于数学运算的函数是非常丰富的,这些函数基本上都集中在math模块和cmath 模块。math 模块提供了许多关于整数和浮点数的数学运算函数,其中也包含一些用于复数运算的函数。cmath 模块的函数和 math 模块的函数基本类似。两者的区别在于,cmath模块针对的对象主要是复数,用于复数的运算,而math模块主要是用于浮点数的运算函数。要使用math模块或cmath模块中的函数,就必须通过import将函数库导入程序。如果不清楚这两个模块包含哪些函数,则可以通过print语句查看其中所包含的函数名称。例如:
图1.51所示的代码可查看math模块包含的函数。在PyCharm中,由于在run模式下无法在输出时进行自动换行,因此要想在窗口中将math模块或cmath模块中的函数完整地显示出来,就需要使用for语句或者while语句进行分行显示。
图1.51 查看math模块包含的函数
通过循环语句分行查看cmath模块中的函数,如图1.52所示。
2)字符串类型
在Python语言中,字符串被定义为字符的集合,通常是由数字、字母、下画线组成的一串字符,这些字符被引号所包含,引号可以是单引号、双引号和三引号,一般采用双引号,例如:
Python 语言没有字符类型,单个字符也会被当成字符串,字符串经常被用于表示文本类型的数据。如果要访问字符串中的内容,则需要使用下标。在访问字符串时,通常有从头到尾和从尾到头两种方向,如图1.53所示。
图1.52 通过循环语句分行查看cmath模块中的函数
图1.53 访问字符串的两种方向
(1)从头到尾(即图1.53中的从左到右):下标从0开始,最大取值是字符串长度-1。
(2)从尾到头(即图1.53中的从右到左):下标从-1开始,最小取值是字符串长度×(-1)。
如果要从字符串中截取一段子字符串,则可以通过切片的方式,利用“[头下标:尾下标]”来截取相应的子字符串,头下标从0开始计算,尾下标可以是正数或负数。此外,头下标或尾下标还可以为空,表示从头开始截取或截取到末尾。切片语法格式如下:
需要注意的是,切片方式时遵循的是左闭右开的原则,即截取的子字符串包含头下标对应的字符,不包含尾下标对应的字符。也就是说,截取的字符串从头下标对应的字符开始,到尾下标对应的字符之前的那个字符为止。例如:
当采用切片方式截取一段子字符串时,Python 解释器会同时创建一个新的对象存放截取的子字符串,并将新建的对象返回给程序使用。此时,可以直接打印输出或者用于变量赋值。采用切片方式截取子字符串的示例如图1.54所示。
图1.54 采用切片方式截取子字符串的示例
图1.54中,根据下标索引访问得到的第一个值为s[1]的值,即“b”,而根据下标最大值索引访问得到的最后一个值并非尾下标的取值s[5],而是s[5]的前一个下标s[4]的值,即“e”。
不同下标索引得到的值如图1.55所示。
图1.55 不同下标索引得到的值
通过切片方式截取字符串的类似操作还有:
通过切片方式截取字符串的类似操作的运行结果如图1.56所示。
图1.56 通过切片方式截取字符串的类似操作的运行结果
3)列表类型
列表是Python语言中最常见的一种内置数据类型,另外一种内置数据类型是元组。列表是Python特有的一种数据类型,可以存储不同类型的数据,支持数字、布尔值、字符串,甚至还可以包含元组、列表(嵌套)和字典。列表可以看成一种复合数据类型,其创建方式很简单,只要用方括号“[]”把数据项包括即可,“[]”中的数据项需要用逗号分隔,例如:
列表的访问方式和字符串的访问方式类似,通过“[头下标:尾下标]”的方式可以截取列表中对应位置的数据项。同样与字符串的索引值类似,列表从头到尾(从左到右)的第一个数据项的下标值默认为0,从尾到头(从右到左)的第一个数据项的下标值默认为-1。在截取列表中的数据项时,下标可以为空,表示从头取或取到尾。列表截取示例如图1.57所示。
图1.57 列表截取示例
在对列表进行操作时,加号“+”是列表连接运算符,星号“*”是列表重复运算符,例如:
注意:在上述代码中,只有“print(mylist_1[0])”可以输出列表中的所有数据项,其他输出语句的结果均为列表的部分数据项。此外,“print(mylist_1*2)”相当于先创建新列表变量mylist_3,然后令mylist_3=mylist_1*2,最后输出列表mylist_3的所有数据项。“print(mylist_1+mylist_2)”的工作方式与“print(mylist_1*2)”类似,也是先创建新列表变量再输出数据项。
列表操作的示例运行结果如图1.58所示。
图1.58 列表操作的示例运行结果
(1)更新列表。通过 append()方法可在列表中添加新数据项,新添加的数据项位于列表的末尾,例如:
添加新数据项的运行结果如图1.59所示。
图1.59 添加新数据项的运行结果
使用等号“=”可以修改列表中的数据项,例如:
修改列表中数据项的运行结果如图1.60所示。
图1.60 修改列表中数据项的运行结果
(2)删除列表中的数据项。通过 del 语句或者 remove()方法可删除列表中的数据项,del语句用于删除指定下标的数据项,remove()方法可以删除指定内容的列表数据项。此外,del语句还可以删除整个列表。利用del语句删除单个数据项的示例如下:
利用del语句删除单个数据项的运行结果如图1.61所示。
图1.61 利用del语句删除单个数据项的运行结果
利用remove()方法删除单个数据项的示例如下:
利用remove()方法删除单个数据项的运行结果如图1.62所示。
图1.62 利用remove()方法删除单个数据项的运行结果
4)元组类型
元组是一种类似于列表的数据类型。元组的表示方法和数据项的访问方式都与列表十分类似。列表使用方括号“[]”包含数据项,元组则使用圆括号“()”包含数据项;两者都使用下标索引的方式访问数据项,不同之处在于元组的数据项不能被修改。元组的创建方式很简单,只要用方括号“()”把数据项包括起来即可,其中数据项需要用“,”分隔,例如:
元组访问的示例运行结果如图1.63所示。
从上面的叙述可以看出,元组的操作与列表类似。如果不指定下标输出,如“print(tuple[0])”,那么将会输出元组的所有数据项;“print(mytuple_1*2)”相当于先创建了一个新元组变量mytuple_3,再令“mytuple_3=mytuple_1*2”,最后输出mytuple_3的所有数据项。“print(mytuple_1+mytuple_2)”的工作方式与“print(mytuple_1*2)”类似,也是先生成新元组变量再输出数据项。
图1.63 元组访问的示例运行结果
需要注意的是,元组是不允许更新的,而列表允许更新,例如:
在更新元组时会提示错误信息,如图1.64所示。在运行代码时会产生类型错误的提示,错误原因为元组不支持赋值指派。
图1.64 在更新元组时的错误信息
5)字典类型
字典是Python语言中除列表外最灵活的一种内置数据类型。从数据的逻辑组织来看,列表是一种基于顺序存储结构的数据容器,字典则是一种无序的数据存储容器,但这两种数据类型不但都可以存储多个数据项,而且还可以快速定位到某个数据项。字典和列表的区别是:字典中的数据项是通过键-值对进行存取的,列表是通过下标进行存取的。字典用大括号“{}”包括数据项,这些数据项都是由键(key)及其对应的值(value)组成的,并且数据项之间用逗号“,”分隔,例如:
字典访问的示例运行结果如图1.65所示。
图1.65 字典访问的示例运行结果
上面的字典访问示例定义了一个包含数据项的字典 mydict_2,字典中的每个数据项都是由键和值组成的,键和值之间用“:”分隔,如键name对应的值为张三,表示为“‘name’:‘张三’”。如果字典中存在多个数据项,则用“,”隔开这些数据项。如果需要输出键所对应的值,则可以通过“print(dict[key])”来实现,如“print(mydict_1[‘one’])”就可以输出字典mydict_1中键“one”所对应的值。此外,如果要往字典中添加新数据项,则可以通过为键赋值的方式来实现,如“mydict_1[‘one’]=“i like linux””就可以在字典mydict_1中增加一个键“one”,这个键所对应的值为“i like linux”。需要注意的是,如果mydict_1已经存在键“one”,则会修改键的值。
(1)新增和修改字典中的数据项。新增或修改字典中的数据项的方法是增加新的键-值对或修改已有的键-值对,例如:
新增和修改字典中的数据项的示例运行结果如图1.66所示。
在上面的示例中,如果需要修改字典中键所对应的值,则可以通过赋值的方式完成。例如,要将张三的年龄修改为18,则通过“mydict_1[‘Age’]=18”即可。如果字典中不存在键“work”,则“mydict_1[‘work’]=“student””就会在字典mydict_1中添加一个新数据项“work:student”。
图1.66 新增和修改字典中的数据项的示例运行结果
(2)删除字典中的数据项。删除字典中的数据项操作包括删除某个数据项和清空整个字典,前者使用del语句,后者使用clear()方法,例如:
删除字典中的数据项的示例运行结果如图1.67所示。
图1.67 删除字典中的数据项的示例运行结果
在上面的示例中,不能在“del mydict_1”输出字典 mydict_1 中的内容,即“print(mydict_1)”会引发程序运行异常。在“del mydict_1”后,字典mydict_1连同其对应的内存空间会被Python解释器删除,不再存在。
(3)字典的键的特性。键-值对中的值是没有任何约束的,既可以是标准的数据类型对象,如数字、布尔、列表等,也可以是用户定义的数据类型,如枚举等。键-值对中键的使用是有要求的,在字典中不允许同一个键出现两次,若同一个键被赋值两次,则后一个值会被记住,例如:
同一个键被赋值两次的运行结果如图1.68所示。
在上面的示例中,字典mydict_1重复出现了键Name,此时字典mydict_1会自动进行去重处理,保留最后一次的赋值结果。
图1.68 同一个键被赋值两次的运行结果
字典的键必须是不可变的,因此只可以用数字、字符串或元组充当键。列表的长度是可变的,不允许用于键的定义。例如:
字典中的键的定义示例运行结果如图1.69所示。
图1.69 字典中的键的定义示例运行结果
在上面的示例中,由于[‘Name’]是一个列表变量,所以无法进行Hash处理,从而引发了定义过程的类型错误异常。