- 人工智能开发语言:Python
- 潘风文 潘启儒
- 9618字
- 2020-08-28 05:52:05
3.3 基本数据类型
3.3.1 变量类型概述
Python中的变量为动态类型,在定义变量时无需指定变量类型。“动态”的意思是指一个变量可以在需要的时候,由开发者给予任何数据类型的值,Python的编译器会自动检测赋值的内容,以此来推断类型。如:
一个变量的当前值是最后一次被赋予的内容。
关于Python 中的变量,有下面几个特点需要了解。
① Python 中的变量不需要声明。每个变量在使用前都必须赋值,只有赋值后该变量才会被创建。
② 等号运算符(=)用来给变量赋值。等号(=)运算符左边是一个变量名,右边是存储在变量中的值。
③ 在 Python 中,变量的“类型”实际上是变量所指的内存中对象的类型。
Python 3.X中,变量有8个大类、12个基本类型,如表3-1所示。
表3-1 Python 3.X版本中变量的基本类型
3.3.2 Number数值类型
数值类型包括int(整数型)、float(浮点型)、bool(布尔型)、complex(复数型)四种基本数据类型。在Python中,一切皆是对象,即使最基本的数值类型也是对象。
3.3.2.1 int型
在Python中,整数类型变量可以通过直接赋值创建,也可以用构造函数int( )创建。如:
第一种方式简单明了,建议使用;对于使用构造函数创建的方式,可选参数 base 表示第一个参数值所属进制,默认为10,表示输入值为十进制数。若要直接给变量赋值2进制、八进制、十六进制数,按照下面的规则实现:
① 输入二进制时,以0b开头。例var=0b11,则表示十进制的3。
② 输入八进制时,以0o开头。例var=0o11,则表示十进制的9。
③ 输入十六进制时,以0x开头。例var=0x11,则表示十进制的17。
另外,Python提供了三个内置函数bin()、oct()、hex(),用以输出2进制、八进制、十六进制数;这三个函数的输出类型都是字符串型。如:
int型变量还有几个特有的函数(方法),简单介绍一下。
1)bit_length()
这个函数返回一个二进制整数的位数(不包括符号位和前导位0)。如:
2)int.from_bytes(bytes, byteorder, signed=False)
这个函数将bytes(字节串)类型的变量转为十进制整数(bytes类型是Python3.X特有的数据类型,我们将在后面介绍)。参数bytes表示bytes对象;参数byteorder确定bytes的字节顺序。如果参数byteorder为big,则低位字节位于字节数组的开头;如果为little,则低位字节位于字节数组的末尾;参数signed指示是否考虑符号位(正负),默认是不考虑符号位,如果signed=true,则转换为一个负数。例:
以上面代码的第六行为例分析一下,'\x'表示十六进制数,高低位标志是'big',因此'\xfc'是高位,'\x00'是低位,'\xfc'写成二进制数为:11111100,'\x00'的二进制数为00000000,所以这个字节串的二进制数应该是11111100 0000 0000,又因为signed=True,所以要考虑符号位,而最高位是1,因此这个二进制数是负数,取其补码(最高位不变,其余各位取反加1),可以得到1000010000000000,写成十进制,就是-1024。
3)int.to_bytes(length, byteorder, signed=False)
这个函数的功能是把十进制整数转换为bytes类型的变量。其中参数length指定十进制整型数用多少个字节表示。如果整数不能用给定的字节数表示,则会引发overlowerror错误;参数byteorder和signed见函数from_bytes()的描述。如:
3.3.2.2 float型
在Python中,浮点型变量的创建方式同整数型变量。如:
使用构造函数创建时,参数可以是整数型、浮点型,也可以是字符串型。
另外,使用 float( ) 构造器还可以定义无穷大(Infinity 或inf)和负无穷大。如:
float型变量也有几个特有的函数(方法),简单介绍如下。
1)as_integer_ratio()
返回一对整数,这对整数的商正好是这个浮点数,其中分母为正。如果对无穷大或非数值类型变量进行操作,会引发一个OverflowError异常错误。例如:
2)float.is_integer()
这个函数的功能是:如果float变量具有有限的整数值,则返回True;否则返回False。例如:
3)float.hex()以及float.fromhex(str)
函数float.hex()以十六进制字符串形式表示一个十进制浮点数。对于有限值的浮点数,这种表达方式将始终包括前导符0x和尾随p以及一个指数值(指数值是十进制)
函数float.fromhex(str)的功能与函数hex()正好相反,将一个以十六进制字符串形式表示的浮点数转换为十进制格式,例如设十六进制字符串是0x3.a4p5,则实际的十进制浮点数是(3 + 10/16 + 4/256)×25=116.5。举例如下。
3.3.2.3 bool 型
布尔型是 int型的子类,只有两个值:True和False,其中False等同于0,True等同于1。其创建方式除了直接赋值,还可以用构造函数bool()创建。例:
可以看到,用构造函数bool()创建时,只要参数为空或0,则变量值为False,否则不管参数为何种类型的值,皆为True。
3.3.2.4 complex 型
complex用来表示复数。同其他类型一样,创建复数变量也有两种方式。
① 变量直接赋值,复数形式为a+bj。
② 使用构造函数complex()创建,形式为:complex(real[, image]),其中real是实数部分,image是虚数部分,如果real参数以字符串形式给出,则第二个参数必须省略。实例如下:
注意上面实例中的最后一行,“+”号前后不能有空格,否则出错。
3.3.3 String字符串
Python中的字符串是Unicode字符序列,在编码上实现了统一性。Python的字符串是一种可迭代的数据类型(可通过迭代器访问)。
需要注意的是,Python的字符串是不可改变对象,如果改变一个字符串的元素,需要新建一个字符串。也即改变某个字符串变量,相当于把原来的值复制一份后再改变,变量指向改变后的新地址。
3.3.3.1 创建字符变量
Python中的字符串用单引号或双引号括起来(分别成对使用,不能混用)。同其他类型数据一样,字符串变量也是一种对象,所以也可以使用字符串构造函数str()来创建。实例如下:
Python 使用反斜杠(\)转义特殊字符,见表3-2。
表3-2 Python字符串中的转义字符表
例如,下面的代码在var1变量中有一个换行转义符。
3.3.3.2 字符变量运算
字符串实际上是字符数组,对字符串中字符的访问是通过方括号中的下标来进行的。需要注意的是下标的索引值从0开始,而-1表示字符串末尾的开始位置,如图3-1所示。
图3-1 字符串索引示意图
字符串访问语句格式:
变量[下标]:获取一个字符;
变量[头下标:尾下标]:获取一段字符,结果不包括尾下标索引位置的字符。
请看下面的实例:
除了访问字符串内容外,字符串变量还有很多其他运算,比如字符串连接、字符串重复等,见表3-3。其中实例变量var1="Hello",var2="Python"。
表3-3 Python字符串变量的运算
3.3.3.3 常用字符串操作函数
Python的一切变量皆为对象,所以字符串操作函数实际上就是字符串类的功能函数,这些函数均可以通过字符串变量直接调用,常用字符串操作函数见表3-4。
表3-4 常用字符串操作函数列表
还有几个和字符串相关的函数,但这几个函数不是字符串对象独有的,而是内嵌的全局函数和bytes对象的函数(bytes类型会在后面讲述)。
① len(str) :返回字符串长度,是以“字符”统计,一个汉字只算一个字符。
② max(str) :返回字符串 str 中最大的字母。
③ min(str) :返回字符串 str 中最小的字母。
④ bytes.decode(encoding="utf-8", errors="strict"):以指定的编码格式解码bytes对象,返回对应的字符串。默认编码为 utf-8。errors参数用来指定不同错误的处理方案,默认为 strict,即当编码出现错误时引起一个UnicodeError。Errors的其他可取值有ignore、replace、xmlcharrefreplace、backslashreplace等。这里之所以要介绍bytes.decode()函数,是因为Python3 中str对象没有decode方法,所以可使用 bytes 对象的 decode() 方法来解码,而这个 bytes 对象可以由字符串对象的encode() 来编码,这在编码转换时能够派上用场。
另外,len()、min()、max()函数同样也适用于后面要讲述的列表、集合等对象。
3.3.3.4 字符串的格式化
字符串格式化是以后经常用到的功能。格式良好的字符串输出可以更好地展示计算结果,有效地表达结果的含义,提高用户对结果信息的使用效率。所以Python对字符串的格式化非常重视,专门制定了一系列的语法规则来方便开发者高效使用,开发出完美的信息输出。
Python中对字符串的格式化输出方式有两种:
① format()函数格式化方式;
② %格式化方式。
目前最新版的Pyton推荐使用format()函数的形式,因为它有逐渐取代%格式化方式的趋势,所以我们主要讲述format()函数的使用方式。
在一个字符串变量中,大括号{}是有特殊含义的,大括号内被称为可替代域,也称为占位符,大括号外的文字称为字面文本(literal text),会被原样输出。占位符的内容会按照format()函数指定的格式和内容被替换,与其他内容一起输出。
由于大括号有特殊作用,如果需要在字面文本中包括大括号,应通过双大括号来转义输出,否则在使用format()函数时会引发异常。
下面是占位符(可替代域)部分的语法规则:
占位符可以由三部分组成,分别是字段名称(field_name)部分、转换(conversion)部分、格式规则(format_spec)部分,这三部分通过感叹号(!)和冒号(:)进行区分。这三部分都是可选的,但左右大括号是不能省略的。
1)字段名称(field_name)
字段名称(field_name)可以是一个数字,也可以是一个字符关键字。如果是一个数字,则其代表一个位置参数,对应着format()参数的位置;如果是一个字符关键字,则说明是一个命名参数,对应着format()函数中的命名关键字。更进一步,如果字段名称(field_name)是数字,并且占位符按照0、1、2...顺序排列,它们是可以省略的,foramt()函数会自动按照这个顺序对应。另外,占位符内字符关键字不需要单(双)引号来包围,所以不能使用数字作为字符关键字。
2)转换部分(conversion)
转换(conversion)部分表示是否对替换字段名称(field_name)的内容进行强制转换。目前支持三种强制转换,分别是"!s"、"!r"、"!a"。其中"!s"代表进行str()转换,即把内容作为str()的输入参数,其结果作为替换内容;"!r"代表进行repr()函数转换,即把内容传给repr()函数,以repr()函数的结果作为替换内容;"!a"代表进行asci()函数转换,即把内容传给ascii()函数,以ascii() 函数的结果作为替换内容。
str()是字符串类型的构造函数,前面已经讲过,这里简单介绍一下repr()和ascii()这两个函数。和print()一样,repr()和ascii()是两个内置函数,也就是说开发者可以直接使用,无需引入额外的模块。repr()函数调用对象内置的__repr__()函数,返回一个标准的字符串表示的对象描述,转化为供解释器读取的形式。ascii()函数和repr()基本一致,其区别在于ascii()会把非ASCII字符转换为ASCII格式(以\x, \u 或 \U表示 )。
3)格式规则(format_spec)
格式规则(format_spec)部分包含的语法规定了替换内容的展现形式,如宽度、对齐方式、前后填充、数字精度等。
格式规则由多个片段组成,包括填充字符(fill)、对齐方式(align)、正负号(sign)、显示宽度(width)、分组选项(grouping_option)、显示精度(precision)以及显示类型(type)等七部分。
填充字符(fill)部分可以为任何字符,注意只能是一个字符(可以为汉字),并且不要使用大括号作填充字符。这个部分必须和对齐方式(align)一起使用。
对齐方式(align)包括左对齐、右对齐、中间对齐等方式,表3-5给出了详细的说明。
表3-5 字符串格式化对齐方式
正负号(sign)部分只对数值型内容有效,用来显示数值的正负性质。因为只对数值内容有效,所以如果设置了这个选项,就不能再使用上面提到的“转换部分”了。可以设置的选项见表3-6。可以设置的正负号选项见表3-6。
表3-6 字符串格式化正负号选项
“#”选项只对integer、float、complex和Decimal类型有效。对于整数,当输出二进制、八进制或十六进制时,此选项在输出值前添加前缀“0b”、“0o”或“0x”;对于浮点数、复数和十进制数,输出结果会始终包含小数点字符,即使后面没有数字也是如此。
显示宽度(width)是一个十进制的整型数,用来定义显示内容的最小宽度;如果没有设置,显示宽度由显示的内容决定。
如果没有设置对齐方式(align),在显示宽度前添加了“0”字符,相当于填充字符(fill)设置为“0”,同时对齐方式(align)设置为“=”。
分组选项(grouping_option)用来对数据进行分组,包含两个可选项,分别是逗号“,”、下划线“_”,见表3-7。
表3-7 字符串格式化分组选项
显示精度(precision)也是一个十进制的整型数,必须在“.”号之后,对于以“f”或“F”显示的浮点数,指定在小数点字符后显示多少精度位;对于以“g”或“G”显示的浮点数,指定在小数点字符前、后共显示多少精度位;对非数值类型的内容,设置了最大显示宽度,也就是说只显示内容的前几位,会截断后面的内容。注意:这个选项不能用在整型数据上,否则会提示错误。
显示类型(type)部分指定替换内容如何显示,对于不同的数据类型,有不同的选项。对于字符串类型的内容,显示类型选项见表3-8。
表3-8 字符串格式化显示字符串类型的选项
对于整数类型的内容,显示类型选项见表3-9。
表3-9 字符串格式化显示整数类型的选项
对于浮点数或小数类型的内容,显示类型选项见表3-10。
表3-10 字符串格式化显示浮点数类型的选项
表3-10中的选项除了n之外,也都适合整型数值的内容。
如果格式规则(format_spec)部分省略,则结果与调用str()函数一样。
注意:在占位符中的字段名称(field_name)、转换(conversion)、格式规则(format_spec)三部分之间不能有空格,并且左大括号之后、右大括号之前也不能有空格。
下面我们举例说明以上格式化规则的使用:
输出结果如下:
字符串格式的规范非常多,上面讲述的是基本的规定,掌握了这些语法,可以满足开发者的大部分需求。如果读者需要更深入地了解详细的语法规则,可参考专门讲述这方面的书籍。
字符串格式化的另外一种形式——%格式化的语法规则和上面非常类似,在大多数情况下,format()规则使用“{}”和“:”替代了%格式化中的“%”。如:'%03.2f'等同于'{:03.2f}'。详细的语法规则这里不再重复说明。
3.3.4 Byte字节序列
前面讲述的字符串类型变量包含的是字符序列,在实际编程中,很多场景下(例如对文件进行二进制存储、网络传输、数据库存储等)需要采用字节序列类型数据。Python中有bytes和bytearray两种字节序列类型,两种类型的数据对象都是由0到255的整数或ASCII字符组成。可以说bytes是bytearray的只读版本。
3.3.4.1 创建字节序列变量
作为Python中的一种对象,Python中的字节序列变量用单引号或双引号括起来,并在引号前面加以b或B。字节序列变量的创建方式有两种,分别是:
① 以b或B开始,直接赋值,这种方式生成的对象是bytes类型,不是bytearray类型。
② 使用构造函数 bytes()或者bytearray()创建。
下面是bytes类型的构造函数。
● bytes():创建一个空的bytes对象。
● bytes(iterable_of_ints):参数iterable_of_ints代表整数可迭代对象,包括元组、列表等,其整数元素不能超过255。
● bytes(string, encoding[, errors]):以字符串变量创建bytes对象,bytes按照encoding指定的值进行转换、编码。
● bytes(bytes_or_buffer):以一个bytes变量或内存值创建新的bytes对象。
● bytes(int):创建指定长度的bytes对象,并且以“\0”初始化每个元素。
可通过以下代码进行理解:
输出结果为:
bytearray对象通过bytearray()构造函数创建,形式同bytes()。
在讲述字符串变量的时候,我们提到以r或R开头的原始字符序列(所有字符按字面本义使用)。同样,r或R也可以用在bytes类型上(必须和b或B成对使用,顺序不分前后),以构成bytes类型变量前缀(bytesprefix):
bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR"
例如:
输出结果为:
从这个例子可以看出,r/R对字节序列类型变量的作用和对字符串变量的作用是一样的。
3.3.4.2 字节变量运算
对bytes和bytearray类型的字节序列变量的访问是通过下标进行的,下标的索引值从0 开始,而-1表示末尾开始位置,如图3-2所示。
图3-2 字节序列变量索引示意图
访问字节序列片段格式为:
● 变量[下标]:表示获取一个字节。
● 变量[头下标:尾下标]:表示获取一段字节序列,结果不包括尾下标索引位置的字节。
请看下面的实例:
除了访问字节序列片段外,字节序列变量还有很多其他运算,见表3-11,表中设实例变量var1 = b"Hello",var2 = b"Python"。
表3-11 字节序列操作符运算
3.3.4.3 常用字节序列操作函数
由于bytes类型和字符串类型一样,属于不可变的变量类型,所以两者的操作函数几乎一模一样。而bytearray类型变量是可以修改的一种数组,所以bytearray类型要比bytes类型多一些增删方面的函数。表3-12列出了常用字节序列操作函数。
表3-12 常用字节序列操作函数
3.3.5 Tuple元组
元组是一种不可变数据类型,可通过迭代器访问。
3.3.5.1 创建元组变量
tuple元组使用小括号把各种元素包括起来,元组变量一旦建立,其中的元素就不能修改了。元组变量也是一种对象,所以创建元组变量的方式也有两种:
① 使用圆括号直接赋值;
② 使用元组构造函数tuple()创建。
举例如下:
这段程序的输出结果为:
要创建一个空元组(没有任何元素),可以通过圆括号直接赋值实现,也可以通过无参构造函数 tuple()实现。
定义只有一个元素的元组,这个元素后面一定要有一个逗号,这是因为在Python中,圆括号()既可以表示tuple元组,又可以表示数学中的圆括号运算符,为了避免产生歧义,这个唯一元素后面必须加一个逗号。
元组变量中的元素类型可以不同,可同时包含整数、浮点数、字符串、列表、集合等等,即构成一个“复合型”元组变量,如下面的语句:
tpVar = (1, 2, 3, 'string', ['name', 'sex'], ('Changer', 'man'), 7-9j)
“复合型”元组变量中的某些特定元素是可以改变的,如列表,可以改变列表中所包含的内容,从而间接“改变”了元组变量。
3.3.5.2 元组变量的操作
元组实际上是一个元素的序列,对元组元素的访问是通过方括号指定其下标(索引号)或下标范围来完成的,索引号从0开始,用-1表示末尾元素的索引号,如图3-3所示。
图3-3 元组变量索引示意图
获取元组元素或元素片段的格式如下:
● 变量[下标]:获取一个元素;
● 变量[头下标:尾下标]:获取一段元素。注意结果不包括尾下标索引位置的元素。
例:
输出结果为:
使用加号“+”可进行两个元组的连接组合,如:
输出结果为:
另外,如果要复制元组元素,可使用“*”操作符。例如:
输出结果为:
3.3.5.3 常用元组操作函数
元组的操作函数比较少,常用的见表3-13。
表3-13 常用元组操作函数
下面几个函数是内嵌的全局函数:
① len(tuple) :返回元组变量元素的个数,即元组变量的长度。
② max(tuple) :返回元组变量中元素的最大值。
③ min(tuple) :返回元组变量中元素的最小值。
3.3.6 List列表
List列表和元组一样,也是一种可迭代的序列数据类型(可通过迭代器访问)。与元组不一样的地方是列表中元素的内容可以变化,元素的个数也可以变化,所以列表有很多操作函数。
3.3.6.1 创建列表变量
列表中的元素可以是数字、字符串、嵌套列表、元组等。列表元素列在方括号之间。用逗号分隔开。
创建列表变量的方式也有两种:通过方括号[]直接赋值创建或使用列表构造函数list()创建。
例:
这段程序的输出结果为:
可以看出,除了方括号和圆括号的区别,建立列表变量和元组变量的方式是一样的。但定义只有一个元素的列表时,这个元素后面的逗号不是必需的,这点和元组变量不同。
3.3.6.2 列表变量的操作
列表元素的访问方法与元组一样,只是通过方括号指定其下标或下标范围来进行的,见图3-4。
图3-4 列表变量索引示意图
例如:
输出结果为:
列表内容是可以改变的,修改方式是直接对指定下标的元素赋予新的数据,新数据的类型与原来数据类型可以不同。例如:
输出结果为:
可使用加号“+”实现两个列表的组合,如:
输出结果为:
元素复制同样使用“*”操作符,例如:
输出结果为:
3.3.6.3 列表常用操作函数
表3-14展示了列表常用操作函数。
表3-14 列表常用操作函数
下面几个函数是内嵌的全局函数,对列表对象通用:
① len(list) :返回列表变量元素的个数,即列表的长度。
② max(list) :返回列表变量中元素最大值。
③ min(list) :返回列表变量中元素最小值。
3.3.7 Set集合
在Python中,集合是一个无序且无重复元素的对象,集合中的元素可以是不同的类型,并且可以增加、删除某个元素;集合的元素必须是不可变数据类型,因此像列表list、字典dict等类型不能作为集合的元素。
3.3.7.1 创建集合变量
集合变量也是一种对象,创建方式如下:
① 使用"{value1,value2,...}"方式直接赋值,注意大括号内不能为空。
② 使用集合构造函数set()。
注意:创建一个空集合必须用set(),而不是{ },因为{ }是用来创建一个空字典的,字典也是一种数据类型,后面会讲到。
请看下面实例:
输出结果如下:
需要强调几点:
① 集合中的元素是无序的,如果运行上面的程序多次,会发现一个集合变量的元素输出顺序是变化的;
② 空集合变量只能通过无参构造函数来创建;
③ 如果把一个字符串对象提供给构造函数,则构造函数首先会以字符为单位把字符串分解、去重,然后以每个字符作为集合的元素。
3.3.7.2 集合变量的操作
由于集合变量中的元素是无序的,所以不能像其他数据类型那样通过索引访问。访问集合中的某个元素实际上就是判断这个元素是否在这个集合中。Python是通过in操作符来判断的,如:
输出结果如下:
3.3.7.3 常用集合操作
1)集合的增删
可以通过add函数为一个集合增加一个元素,并自动去重。add函数会把输入的参数当做一个整体来看待;Add函数的参数必须是可散列的(hashable),即必须唯一且固定不变,不可修改,因此整型(integer)、字符串(string)和元组(tuple)可以作为它的参数,而列表类、集合类等对象不能作为它的参数,否则会出现“TypeError: unhashable type”。
可以通过update函数为一个集合添加多个元素,update函数会把输入参数分解为最小元素,去重后添加到集合变量中。update函数可以有多个参数,每个参数必须是可迭代的对象,如元组、列表、字符串、集合等。
下面我们通过实例来说明:
输出结果如下:
通过discard()或remove()函数可以去除一个元素。这两个函数的唯一区别是:如果去除的元素不存在,discard()会保持不变,不会返回任何异常,而remove()会引发一个KeyError。
另外,也可以通过pop()函数去除一个元素,并返回此元素。不过由于集合变量是无序的,所有通过pop()函数返回的元素完全是随机的。
2)集合的运算
(1)集合的并集(Union)
两个集合变量的并集如图3-5所示。
图3-5 集合变量的并集
在Pyton中,使用操作符“|”或者union()函数进行集合的并集运算。如:
输出结果如下:
(2)集合的交集(Intersection)
图3-6展示了两个集合变量的交集。
图3-6 集合变量的交集
在Pyton中,用操作符“&”或intersection()函数进行两个集合的交集运算。如:
输出结果如下:
(3)集合的差集(Difference)
图3-7展示了两个集合变量的差集。
图3-7 集合变量的差集
Pyton中使用操作符“-”或者difference ()函数进行集合变量的差集运算。如:
输出结果如下:
(4)集合的对称差集(Symmetric Difference)
图3-8展示了两个集合变量的对称差集。
图3-8 集合变量的对称差集
对称差集的结果是在两个集合的并集元素中去掉两个集合的交集元素,即(setA|setB) – (setA&setB)。在Pyton中使用操作符“^”或者symmetric_difference ()函数进行集合变量的对称差集运算。如:
输出结果如下:
3.3.7.4 常用集合操作函数
表3-15列举了常用的集合操作函数。
表3-15 常用的集合操作函数
另外还有一种集合:frozenset,除了不能增加、删除元素外,其他功能和set类似,这里不再详述。
3.3.8 Dictionary字典
字典是一种可变容器类型,可以存储任意类型的对象。字典类型变量使用键值对的方式来存储元素项,非常类似于C/C++、Java等语言中的map类型。
字典是一种无序容器,所以无法通过下标来访问其中的元素,但可以通过键值快速访问。在一个键值对元素中,值(value)可以是任何数据类型,且允许重复。但是键(key)只能是不可变的数据类型(字符串、数值类型或者元组),并且不能重复;每个键值对中,键与值之间用冒号连在一起,键值对之间用逗号分隔。当使用元组做键时,元组中只能包含字符串和数字,如果元组直接或间接包含了可变对象,就不能当做键。
3.3.8.1 创建字典变量
创建字典变量的方式也有两种,分别是:
① 使用"{key1:value1, key2:value2, ...}"方式直接赋值;
② 使用字典构造函数dict()创建。
请看下面实例:
输出结果为:
如果在给一个字典变量赋值时出现了相同的键(key),Python会自动去重(不会引发异常),只保留最后出现的键;键名是大小写敏感的。如:
输出结果为:
3.3.8.2 字典变量的操作
1)根据键名(key)访问键值(value)
有两种方式:直接通过[key]方式访问或通过字典的get()函数访问,这两种方式的不同之处在于:如果输入的键名不存在,get()函数会返回“None”,而[key]方式会引起一个KeyError异常错误。例:
输出结果为:
2)修改字典内容
修改字典内容可以通过赋值操作符“=”来实现。如果键已经存在,则更新相应的键值;如果键不存在,则添加这个键值。如:
输出结果为:
3)删除字典元素
删除字典变量中的某个键值对,可以使用字典对象提供的pop()函数,或使用Python命令del。
若要清空字典变量内容,可使用字典对象的clear()函数,或用Python命令del,注意del会删除字典变量本身,使其不再存在。如:
输出结果为:
需要注意的是:使用pop()函数和del命令时,如果指定的键key不存在,则会引起KeyError错误。
3.3.8.3 常用字典操作函数
表3-16列出了常用字典操作函数。
表3-16 常用字典操作函数
3.3.9 Range整数序列
range是一种不可变数据类型,是一种等间隔整数序列,经常用于循环语句中,可通过迭代器访问。Range对象可以通过list()函数转换为列表对象。
相对于列表list、元组tuple类型来说,range类型的优点是无论一个range变量包含多少个元素,它占用内存的大小始终不变,因为它仅仅保存了开始值、结束值以及步长。
3.3.9.1 创建range变量
在Python中,range是一个类,创建range变量的方式是使用range构造函数,有两种构造函数:
range()函数的参数必须是整数类型或者可以实现__index__()函数操作的类型。
各参数含义如下:
start:开始值,正负均可;如果没指定,默认为0。
stop:终止值,正负均可;这是一个必须指定的参数;序列里不含此值。
step:步长值,正负均可,如果没指定,默认为1。不能为0,否则会引发ValueError异常。
如:
这段程序的输出结果为:
3.3.9.2 常用range操作函数
range变量的元素也是通过用方括号指定下标的方式来获取,下标的索引值从 0 开始,而-1表示末尾的开始位置,如图3-9所示。
图3-9 range变量的元素索引示意图
获取变量中元素的格式如下:
① 变量[下标]:获取一个元素。
② 变量[头下标:尾下标]:获取一段元素,结果不包括尾下标索引位置的元素
请看下面的实例:
输出结果为:
3.3.9.3 常用range操作函数
常用range操作函数见表3-17。
表3-17 常用range操作函数
下面几个全局函数同样适用于range对象:
① len(range) :返回range变量元素的个数;
② max(range) :返回range变量中最大元素;
③ min(range) :返回range变量中最小元素。