第3 章问题求解中的数据抽象 ———数据类型与基本运算 知不足,然后能自反也;知困,然后能自强也。 ———《礼记·学记》 3.1 问题求解中的数据抽象 3.1.1 数据和数据类型 前面提到,在程序设计语言中,现实世界中的信息需要用程序设计语言提供 的符号化手段进行表示,这种符号化表示称为数据。 数据的表示是对现实是世界问题的抽象。数据表示的选择,必须依据数据 所执行的操作来考虑,以便更方便、高效地处理数据。 为什么要将数据划分为各种数据类型? 客观世界是复杂的、多样的、多变的,因此数据也是复杂的、多样的、多变的, 而且不同的数据在存储、表示、运算上都有所不同。为此,程序需要对数据进行 分类,以便规范和简化数据的处理过程。 一般来说,高级程序设计语言均提供以下5种数据类型。 (1)整数。 (2)浮点数:取值可以带小数点的数字类型。 (3)布尔类型:取值为True和False。 (4)字符串类型:编程语言中表示文本的数据类型。 (5)组合类型:多种类型的组合,往往是在基本数据类型的基础上构造的 较复杂的数据类型。 在Python中的数据类型主要有数字类型、Bool(布尔)型、字符串类型、组合 大学计算机———Python 程序设计 类型。其中,组合类型包括序列类型(包括字符串、列表、元组)、映射类型(字典) 和集合类型。 一般高级语言中都提供类型判断函数。Python中使用type(x)函数进行类 型判断。格式: type(对象) 作用:返回对象的相应数据类型。 在Python解释器内部,所有数据类型都采用面向对象方式实现,封装为若 干个类。所以type()函数返回的是各个类的名称。<classi' nt'>代表整型, <classf'loat'>代表浮点型,<classs' tr'>代表字符串型,<classl'ist'>代表列 表类型,<classt' uple'>代表元组类型,<class'dict'>代表字典类型,<class s' et'>代表集合类型。例如: >>> type(10) <class 'int'> >>> type(4.5) <class 'float'> >>> type("结果") <class 'str'> >>> type([1,2,3,4,5]) <class 'list'> >>> type((1,2,3,4,5)) <class 'tuple'> >>> type({">=90":2,">=80":15,">=70":10,">=60":5}) <class 'dict'> >>> type({2,15,"ab"}) <class 'set'> 因为数据类型决定了合法的数据操作,不合法的操作将导致程序错误,因此 数据类型的重要作用是通过类型检查来发现程序中的错误。例如,如果将一位 学生的姓名乘以他的分数显然是没有意义的,可是计算机无法帮助我们发现这 种无意义的操作错误,这种错误只能在程序运行时才能暴露出来。但如果有了 类型的概念,编译器或解释器就能尽早发现程序中的这类错误,使得在程序运行 之前就有机会发现和修改错误。 此外,在程序设计语言中,每一种数据类型由两部分组成:全体合法的值和 对合法值执行的各种运算(即各种数据类型的运算操作)。 58 第3 章 问题求解中的数据抽象———数据…… 3.1.2 常量、对象、变量和动态类型化 一般程序设计语言使用常量、对象和变量三种基本的方式来引用数据。 1.常量 常量是在程序执行期间值不发生改变的量。在Python中,常量主要有两 种:直接常量和符号常量。 (1)直接常量。直接常量就是各种数据类型的常数值,如123、123.45、 True、False、a' bc'等。 (2)符号常量。符号常量是具有名字的常数,用名字代替永远不变的数值。 在一些模块中有时用到符号常量,如常用的math模块中的pi和e。 >>> from math import * >>> pi 3.141592653589793 >>> e 2.718281828459045 2.对象 在Python中,一切皆对象。数据、符号、函数等都是对象。Python中每一 个对象都有唯一的身份标识(id)、一种类型和一个值。 (1)对象的id是一个整数,一旦创建就不再改变,可以把它当作对象在内 存中的地址,使用id()函数可以获得对象的id标识。例如: >>> id(107) 1503203088 >>> id('abc') 243623031952 (2)对象的类型决定了对象支持的操作,也定义了对象的取值范围。对象 的类型也不能改变。前面介绍过,使用type()函数可以返回对象的类型。 (3)根据对象的值是否可以改变,分为可变对象和不可变对象。Python中 大部分对象是不可变对象,如数值对象、字符串、元组等。字典、列表等是可变 对象。 (4)可以使用del语句来删除单个或多个对象。del语句的语法格式如下: del var1[,var2[,var3[...,varN]]] 59 大学计算机———Python 程序设计 例如: del var_a, var_b 3.变量和动态类型化 变量是在程序运行过程中其值可以发生变化的量。变量具有名字、数据类 型和值等属性。 绝大多数编程语言对变量的使用都有严格的类型限制。而Python语言采 用的是另一种技术———动态类型化。Python使用动态类型化来实现语言的简 洁、灵活性和多态性。所谓Python的动态类型化,就是在程序运行的过程中自 动决定对象的类型。 在Python中,变量并不是某个固定内存单元的标识,Python的变量不需要 事先声明,可以直接使用赋值运算符“=”对其赋值,根据所赋的值来决定其数据 类型,也就是说,不需要预先定义变量的类型。 变量指向一个对象,从变量到对象的连接称为引用。例如: x=5 表示创建了一个整型对象5、变量x,并使变量x连接到对象5,也称变量x引用 了对象5或x是对象5的一个引用。这个引用是可以动态的。变量类型就是它 所引用的数据的类型。对变量的每一次赋值,都可以能改变变量的类型。 因为整数在程序中的使用非常广泛,为了优化速度,对于[-5,256]范围内 的整数,Python采取重用对象内存的办法。也就是说,此时Python采用的是基 于值的内存管理方式,如果为不同变量赋值相同值,则在内存中只有一份该值, 多个变量指向同一块内存地址。例如: >>> x=107 >>> y=107 >>> id(x) 1503203088 >>> id(y) 1503203088 [-5,256]范围以外的整数则不采用此内存管理方式。例如: >>> x=2222 >>> y=2222 >>> id(x) 60 第3 章 问题求解中的数据抽象———数据…… 632978868944 >>> id(y) 632982163696 3.2 常用数据类型:数字、布尔型和字符串 3.2.1 数字类型 数字类型用于存储数值。改变数字数据类型会分配一个新的对象。当指定 一个值时,数字对象就会被创建,例如: var1 = 1 var2 = 10 Python支持三种不同的数字类型:int(整数)、float(浮点数)和complex (复数)。 1.整数 在Python3.x中,不再区分整数和长整数。整数的取值范围受限于运行 Python程序的计算机内存大小。 整数类型有4种进制表示:十进制、二进制、八进制和十六进制,默认使用 十进制,其他进制需要增加前导符,如表3-1所示。 表3-1 整数类型的4种进制表示 进制前导符描 述 十进制无默认情况,例如,123、-125 二进制0b或0B 例如,0b11表示十进制的3 八进制0o或0O 例如,0o11表示十进制的9 十六进制0x或0X 例如,0x11表示十进制的17 2.浮点数 Python的浮点数就是数学中的小数,浮点数可以用一般的数学写法,如 1.23、3.14、-9.01等。而对于很大或很小的浮点数,就必须用科学计数法表示,把 10用e替代,把1.23×109写成1.23e9或12.3e8,把0.000012写成1.2e-5等。 在运算中,整数与浮点数运算的结果是浮点数,整数和浮点数在计算机内部 61 大学计算机———Python 程序设计 存储的方式是不同的,整数运算永远是精确的,而浮点数运算则可能会有四舍五 入的误差。 注意:Python要求所有浮点数必须带有小数部分,小数部分可以是0, 这种设计可以很好地区分浮点数和整数。 Python浮点数的数值范围和小数精度受不同计算机系统的限制,使用 Python变量sys.float_info可以查看所运行系统的浮点数的各项参数,依次为 最大值、基数为2时最大值的幂、基数为10时最大值的幂、最小值、基数为2时 最小值的幂、基数为10时最小值的幂、能准确计算的浮点数的最大个数、科学计 数法中系数的最大精度、计算机所能分辨的两个相邻浮点数的最小差值等。 例如: >>> import sys >>> sys.float_info sys.float_info(max= 1.7976931348623157e+ 308, max_exp= 1024, max_10_ exp=308, min= 2.2250738585072014e- 308, min_exp= - 1021, min_10_exp= -307, dig=15, mant_dig= 53, epsilon= 2.220446049250313e- 16, radix= 2, rounds=1) 3.复数 复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实 数部分,y是复数的虚数部分,这里的x和y都是实数。注意,虚数部分的字母j 大小写都可以,如5.6+3.1j与5.6+3.1J是等价的。 对于复数z,可以用z.real和z.imag分别获得它的实数部分和虚数部分。 例如: >>> a=1+2j >>> a.real 1.0 >>> a.imag 2.0 3.2.2 数字类型的运算 运算符是用来连接运算对象、进行各种运算的操作符号。Python解释器为 数字类型提供数值运算符、数值运算函数和数字类型转换函数等。 62 第3 章 问题求解中的数据抽象———数据…… 1.数值运算符 数值运算符如表3-2所示,其中“+”“-”运算符在单目运算(单个操作数) 中做取正号和负号运算,在双目运算(两个操作数)中做算术加减运算,其余都是 双目运算符。 表3-2 数值运算符与示例 数值运算符描述优先级示 例 ** 幂运算1 > > > 2**3 8> > > 27**(1/3) 3.0 ~ 按位取反(按操作数的二进制数 运算,1取反为0,0取反为1) 2 > > > ~5 -6 因为5的9位二进制为00000101, 按位取反为11111010,即-6 +、- 一元加号、一元减号3 +3的结果是3,-3的结果是-3 *、/、//、% 乘法、除法(默认进行浮点数运 算,输出也是浮点数)、整商、求 余数(模运算) 4 > > > 2*3 6> > > 10/2 5.0 > > > 10//3 3> > > 10%3 1 +、- 加法、减法5 > > > 10+3 13 > > > 10-3 7 < < 、> > 向左移位、向右移位6 > > > 3< <2 12 > > > 3> >2 0 & 按位与(将两个操作数按相同 位置的二进制位进行操作,两 者均是1时结果为1,否则为0) 7 > > > 2&3 2 ^ 按位异或(将两个操作数按相 同位置的二进制位进行操作, 不相同时结果为1,否则为0) 8 > > > 2^3 1 63 续表 大学计算机———Python 程序设计 数值运算符描述优先级示 例 | 按位或(将两个操作数按相同 位置的二进制位进行操作,只 要有一个为1结果即为1,否则 为0) 9 > > > 2|3 3 数字类型之间相互运算所生成的结果是“更宽”的数字类型,即整数<浮点 数<复数。基本规则如下。 (1)整数之间运算,如果数学意义上的结果是整数,结果是整数。 (2)整数之间运算,如果数学意义上的结果是小数,结果是浮点数。 (3)整数和浮点数混合运算,输出结果是浮点数。 (4)整数或浮点与复数运算,输出结果是复数。 例如: >>> 123+4.0 127.0 >>> 5.0-1+2j (4+2j) 表3-3列出了Python语言支持的赋值运算符。 表3-3 赋值运算符与示例 赋值运算符描 述示 例 = 简单的赋值运算符,把赋值号“=”右边的结 果赋值给左边的变量c=a+ b += 加法赋值操作符c+=a类似于c=c+a -= 减法赋值操作符c-=a类似于c=c-a *= 乘法赋值操作符c*=a类似于c=c*a /= 除法赋值操作符c/=a类似于c=c/a %= 取模赋值操作符c%=a类似于c=c%a **= 幂赋值运算符c**=a类似于c=c**a //= 整商赋值运算符c//=a类似于c=c//a 2.数值运算函数 在Python解释器提供了一些内置函数,其中数值运算函数如表3-4所示。 64 第3 章 问题求解中的数据抽象———数据…… 表3-4 常用的内置数值运算函数与示例 数值运算函数描 述示 例 abs(x) 求绝对值,参数可以是整型,也可以 是复数;若参数是复数,则返回复数 的模 > > > abs(-5) 5> > > abs(3+4j) 5.0 divmod 分别向下取整商和求余数 > > > divmod(10,3) (3,1) > > > divmod(-10,3) (-4,2) > > > divmod(-10.6,3) (-4.0,1.4000000000000004) pow(x,y[,z]) pow(x,y)返回x**y的值 pow(x,y,z)返回x**y%z的值 pow()函数将幂运算和模运算同时 进行,速度快,在加密解密算法和科 学计算中非常适用 > > > pow(2,4) 16 > > > pow(2,4,3) 1 round(x[,n]) 返回x的四舍五入值,如给出n值, 则表示舍入到小数点后的位数 > > > round(3.333) 3> > > round(3.333,2) 3.33 max(x1,x2,…,xn) 返回x1,x2,…,xn的最大值,参数 可以为序列 > > > max(1,2,3,4) 4> > > max((1,2,3),(2,3,4)) (2,3,4) min(x1,x2,…,xn) 返回x1,x2,…,xn的最小值,参数 可以为序列类型 > > > min(1,2,3,4) 1> > > min((1,2,3),(2,3,4)) (1,2,3) 注意:函数中的参数之间使用的是英文逗号,否则会出现语法错误。 例如,下例中第2个逗号为中文逗号,因而出现了错误信息。 >>> pow(2,4,3) SyntaxError: invalid character in identifier 3.数字类型转换函数 前面提到,在Python中,数字类型之间相互运算所生成的结果是“更宽”的 65 大学计算机———Python 程序设计 数据类型,即数值运算符可以隐式地把输出结果的数字类型进行转换。此外,也 可以通过内置的数字类型转换函数可以显式地进行转换,如表3-5所示。 表3-5 常用的内置数字类型转换函数与示例 数字类型转换函数描 述示 例 int(x[,base]) 把一个数字或字符串x转换成整 数(舍去小数部分),base为可选 参数,指定x 的进制,默认为十 进制 > > > int(3.9) 3> > > int("11",2) 3> > > int("11",8) 9> > > int("11",16) 17 float(x) 把一个数字或字符串x转换成浮 点数 > > > float(12) 12.0 > > > float("12") 12.0 注意:复数不能直接转换成其他数 字类型,可以通过.real和.imag将复 数的实部或虚部分别进行转换。 例如: > > > float((10+99j).imag) 99.0 complex(real [,imaginary]) 把字符串或数字转换为复数。如 果第一个参数(实数部分)为字符 串,则不需要指定第二个参数(虚 数部分) > > > complex("2+1j") (2+1j) > > > complex("2") (2+0j) > > > complex(2,1) (2+1j) 3.2.3 布尔类型 Python中的布尔类型用于逻辑运算,包含两个值:True(真)或False(假), 因为Python中布尔类型是整型的子类,所以True和False分别对应1和0。 例如: >>> True == 1 True 66 第3 章 问题求解中的数据抽象———数据…… >>> False == 0 True >>> True + False + 2 3 注意:Python指定,0(包括0.0、0j等)、空值(None)和空对象Null(空字 符串、空列表、空元组等)等价于False,任何非0、非空值和非空对象则等价于 True。 bool()函数用于将给定参数转换为布尔类型。例如: >>> False==0.0 True >>> False==0j True >>> bool(0) False >>> bool(1.5) True >>> print(bool(None)) False >>> print(bool([])) False >>> print(bool('')) False 3.2.4 字符串类型 序列类型是Python中常用的数据结构。Python的常用序列类型包括字符 串、列表、元组。这里请注意它们的使用特点: (1)序列类型具有双向索引的功能。 序列类型中的每个元素都分配一个数字———它的位置或索引,第一个索引 是0,第二个索引是1,以此类推;如果使用负数作为索引,则最后一个元素下标 为-1,倒数第二个元素下标为-2,以此类推。可以使用负数作为索引是 Python序列类型的一大特色。 (2)序列类型具有切片(截取序列中部分对象)的功能。 67 大学计算机———Python 程序设计 注意:格式: s1=s[起始位置m:结束位置n:[步长k]] 作用:将s中指定区间的元素复制到s1中,这里注意索引的区间范围是“左 闭右开”,即当步长为正数时,s[m:n:k]的对象范围是s[m]至s[n-k];步长为负 数时,按逆序获得对象,即s[m:n:-k]的对象范围是s[n]至s[n+1]。例如,s[1: 5:1]的对象范围是s[1]至s[4]。s[10:5:-2]的对象范围是s[10]至s[7]。 在后面字符串、列表、元组的切片操作中,将会举例说明。 1.字符编码 最早的字符串编码是美国标准信息交换码ASCII,仅对10个数字、26个大 写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII采用一个 字节来对字符进行编码,共定义128个字符。 随着信息技术的发展和信息交换的需要,各国的文字都需要进行编码,不同 的应用领域和场合对字符串编码的要求也略有不同,于是分别设计了不同的编 码格式,常见的主要有UTF-8、UTF-16、UTF-32、GB2312、GBK、CP936、 base64、CP437等。 Python3.x完全支持中文,使用Unicode编码格式。Unicode也称为统一 码、万国码、单一码,是计算机科学领域里的一项业界标准。Unicode为世界上 所有字符都分配了一个唯一的数字编号,这个编号范围从0x000000 到 0x10FFFF(十六进制),有110多万。每个字符的Unicode编号一般写成十六进 制,在前面加上U+。例如,“马”的Unicode是U+9A6C。Unicode编号怎么 对应到二进制表示呢? 有多种方案,主要有UTF-8、UTF-16、UTF-32,也就是 说,UTF-8、UTF-16、UTF-32都是Unicode的一种实现。 GB2312是我国制定的中文编码,使用一个字节表示英文字符,2个字节表 示中文;GBK是GB2312的扩充,CP936是微软公司在GBK 基础上开发的编码 方式。GB2312、GBK和CP936都是使用2个字节表示中文。不同编码格式之 间相差很大,采用不同的编码格式意味着不同的表示和存储形式,把同一字符存 入文件时,写入的内容可能会不同,在理解其内容时必须了解编码规则并进行正 确的解码。如果解码方法不正确就无法还原信息。 在Python3.x中,无论是一个数字、英文字母,还是一个汉字,都按一个字 符对待和处理。 2.Python字符串的界定符 字符串是Python中最常用的数据类型。可以使用引号(单引号、双引号和 三引号)来创建字符串。例如: 68 第3 章 问题求解中的数据抽象———数据…… >>> var1 = 'Hello World!' >>> print("var1: ", var1) var1: Hello World! (1)使用单引号作为界定符时,可以使用双引号作为字符串的一部分。 例如: >>> print('"x=:"') "x=:" (2)使用双引号作为界定符时,可以使用单引号作为字符串的一部分。 例如: >>> print("'x=:'") 'x=:' (3)使用三引号作为界定符时,可以使用单引号或双引号作为字符串的一 部分,还可以换行。例如: >>> print('''"python"''') "python" >>> print('''hello python''') hello python 3.Python转义字符 当需要在字符中使用特殊字符时,Python用反斜杠(\)转义字符,如表3-6所示。 表3-6 Python转义字符 转义字符描 述 \(以行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 69 续表 大学计算机———Python 程序设计 转义字符描 述 \b 退格(Backspace) \e 转义 \000 空 \n 换行 \v 纵向制表符 \t 横向制表符 \r 回车 \f 换页 \0yy 八进制数,yy代表的字符,例如,\012代表换行 \xyy 十六进制数,yy代表的字符,例如,\x0a代表换行 \other 其他的字符以普通格式输出 3.2.5 字符串类型的运算 1.字符串运算符 字符串运算符如表3-7所示。 表3-7 字符串运算符与示例 字符串运算符描 述示 例 + 字符串连接 > > > 'Hello'+'Python' 'HelloPython' * x*n或n*x表示重复输出n次字符串x > > > 'Hello'*2 'HelloHello' in 成员运算符,如果字符串中包含给定的字符 返回True,否则返回False > > > 'h'in'hello' True > > > 'H'in'hello' False notin 成员运算符,如果字符串中不包含给定的字 符返回True,否则返回False > > > 'h' notin'hello' False > > > 'H' notin'hello' True 70 续表 第3 章 问题求解中的数据抽象———数据…… 字符串运算符描 述示 例 [] 索引:使用下标索引来访问值 > > > a='Hello' > > > a[1] e' ' [:] 切片:截取字符串中的子串 > > > a='Hello' > > > a[1:4] e'll' > > > a[4:1:-2] 'ol' 2.字符串类型的格式化 Python支持格式化字符串的输出。最基本的用法是将一个值插入到一个 包含字符串格式符%s的字符串中。例如: >>> print ("My name is %s and weight is %d kg!" % ('xiaoming', 61)) My name is xiaoming and weight is 61 kg! 另外,Python已经不在后续版本中使用类似C 语言中printf的格式化方 法,而是主要采用format()方法进行字符串格式化,建议读者尽量采取此方法。 (1)format()方法的基本使用格式。 format()方法的基本使用格式如下: <模板字符串>.format(<逗号分隔的参数>) 用法:将<逗号分隔的参数>按照序号关系替换到<模板字符串>的一对 大括号“{}”所代表的槽中(从0开始编号),若无序号则按照出现顺序替换。 例如: >>> "My name is {} and weight is {}!".format("xiaoming",60) 'My name is xiaoming and weight is 60!' 如果需要输出大括号,使用两层嵌套即可,例如: >>> "圆周率{{{1}{2}}}是{0}".format("无理数",3.1415926,"") '圆周率{3.1415926}是无理数' (2)format()方法的格式控制。 在format()方法的模板字符串的一对大括号“{}”所代表的槽中,除了可以 71 大学计算机———Python 程序设计 包括参数序号,还可以包括格式控制信息,格式如下,其中的参数均是可选的。 {[参数序号]:[填充][对齐][宽度][,][.精度][类型]} . 填充:指宽度内除了参数外的字符采用什么方式表示,默认为空格。 . 对齐:指宽度内参数输出的对齐方式,使用<、>、^分别表示左对齐、右 对齐和居中对齐,默认为左对齐。 . 宽度:指定参数输出的字符宽度,如果参数实际宽度大,则使用实际宽 度,如果实际宽度小,则用填充符填充,默认用空格填充。 . 逗号:用于显示数字类型的千位分隔符。 . 精度:表示浮点数的小数部分输出的有效位数或者字符串输出的最大 长度。 . 类型:通过格式化符号控制输出格式。Python字符串格式化符号如表 3-8所示。 表3-8 字符串格式化符号 格式化符号描 述 c 输出对应的ASCII码字符 b 输出二进制整数 d 输出十进制整数 o 输出八进制整数 x、X 输出十六进制数(小写、大写) e、E 输出浮点数的指数形式(基底写为e、E) f 输出浮点数的标准浮点形式,可指定小数点后的精度 g、G f和e的功能组合、f和E的功能组合 % 输出浮点数的百分形式 例如: >>> s="python" >>> "{0:30}".format(s) 'python ' >>> "{0:>30}".format(s) ' python' >>> "{0:*^30}".format(s) '************python************' 72 第3 章 问题求解中的数据抽象———数据…… >>> "{0:3}".format(s) 'python' >>> "{0:-^20,}".format(12345.6789) '----12,345.6789-----' >>> "{0:.2f}".format(12345.6789) '12345.68' >>> "{0:.4}".format("python") 'pyth' >>> "{0:c},{0:b},{0:d},{0:o},{0:x},{0:X}".format(20) '\x14,10100,20,24,14,14' >>> "{0:e},{0:E},{0:f},{0:F},{0:g},{0:G},{0:%}".format(1230000) '1.230000e+06,1.230000E+ 06,1230000.000000,1230000.000000,1.23e+ 06, 1.23E+06,123000000.000000%' 3.字符串运算函数 在Python 解释器提供了一些内置函数,其中字符串运算函数如表3-9 所示。 表3-9 常用的内置字符串运算函数与示例 字符串 运算函数 描 述示 例 len(x) 返回字符串x的长度(一个英文和中文字符 都是一个长度单位),或其他组合数据类型的 元素个数 > > > len("Python,你好!") 10 > > > len([1,2,3]) 3 str(x) 返回任意类型x的字符串形式 > > > str(123.45) 1' 23.45' eval(x) 计算字符串x中有效的表达式值,从而将x 转换成数字类型 > > > eval(2' +2') 4> > > eval(8' 0') 80 chr(x) 返回Unicode编码x对应的单字符 > > > chr(65) 'A' ord(x) 返回单字符x对应的Unicode编码 > > > ord("A") 65 hex(x) 返回整数x对应十六进制数的小写形式字 符串 > > > hex(12) 0' xc' oct(x) 返回整数x对应八进制数的小写形式字符串 > > > oct(9) 0' o11' 73 大学计算机———Python 程序设计 4.字符串处理方法 字符串类共包含43个内置方法,常用的如表3-10所示(其中string代表字 符串)。 表3-10 常用的内置字符串处理方法与示例 字符串处理方法描 述示 例 string.lower() 把string中的所有字符转换为 小写 > > > 'Abc'.lower() a' bc' string.upper() 把string中的所有字符转换为 大写 > > > 'Abc'.upper() 'ABC' string.islower() 如果string中的所有字符都是 小写,返回True,否则返 回False > > > 'Abc'.islower() False string.isprintable() 如果string中的所有字符都是 可打印的,返回True,否则返 回False > > > 'Abc'.isprintable() True string.isalpha() 如果string中的所有字符都是 字母,返回True,否则返 回False > > > 1' 23a'i.salpha() False string.isnumeric() 如果string中的所有字符都是 数字,返回True,否则返 回False > > > 1' 23a'i.snumeric() False string.isspace() 如果string中的所有字符都是 空格,返回True,否则返 回False > > > ' '.isspace() True string.startswith(obj, [start[,end]]) 检查字符串是否在start至end 指定的范围内且以obj开头,是 则返回True,否则返回False > > > a' bcde'.startswith(a' ') True > > > a' bcde'.startswith(a' ',1,3) False string.endswith (obj, [start[,end]]) 检查字符串是否在start至end 指定的范围内且以obj结束,是 则返回True,否则返回False > > > a' bcde'.endswith(e' ') True > > > a' bcde'.endswith(e' ',0,3) False string.split(str=""[, num = string.count (str)]) 以str为分隔符(默认分隔符为 空格)切片string,并放入一个 列表中,如果num 有指定值, 则仅分隔为num +1 个子字 符串 > > > 1' 92.168.3.2'.split('.') [1' 92',1' 68',3' ',2' '] > > > 1' 92.168.3.2'.split('.',2) [1' 92',1' 68',3' .2'] 74 续表 第3 章 问题求解中的数据抽象———数据…… 字符串处理方法描 述示 例 string.count (str, [start[,end]]) 返回在start至end指定的范围 内str在string中出现的次数 > > > a' bcade'.count(a' ') 2> > > a' bcade'.count(a' ',2,5) 1 string.replace (str1, str2, num = string. count(str1)) 把string 中的str1 替换成 str2,如果指定num,则替换前 num 次 > > > a' bcade'.replace(a' ',2' ') 2' bc2de' > > > a' bcade'.replace(a' ',2' ',1) 2' bcade' string.center(width) 将string居中对齐,并使用空 格将string 填充至长度 为width > > > a' bcde'.center(7) 'abcde' > > > a' bcde'.center(8) 'abcde ' > > > a' bcde'.center(1) a' bcde' string.lstrip() 删除string左边的空格 > > > ' abcde '.lstrip() a' bcde ' string.rstrip() 删除string字符串末尾的空格 > > > ' abcde '.rstrip() ' abcde' string.strip([obj]) 在string 上执行lstrip()和 rstrip() > > > ' abcde '.strip() a' bcde' string.zfill(width) 返回长度为width 的字符串, 原字符串string右对齐,前面 填充0 > > > a' bc'.zfill(5) 0' 0abc' > > > -'123'.zfill(5) -'0123' string.join(seq) 以string 作为分隔符,将组合 数据类型seq变量中的所有元 素(以字符串表示)合并为一个 新的字符串 > > > color=r' ed',b' lue',g' reen' > > > '&'.join(color) r' ed&blue&green' 【例3-1】 使用字符串函数和方法进行微信注册账号的判断和处理。要 求:使用手机号注册微信账号,即长度为11 位,必须是数字,而且以数字1 开头。 【程序3-1.py】 1 account=input("请输入微信账号:") 2 if len(account)==11 and account.isnumeric() and account.[0]=="1": 75 大学计算机———Python 程序设计 3 print("账号格式正确!") 4 else: 5 print("账号格式不正确!") 3.3 列 表 3.3.1 列表定义与特点 Python的列表功能非常强大,有人戏称它是“打了激素”的数组。 列表是一组有序存储的数据。比如,菜单就是一种列表。列表的主要特点 如下。 (1)列表是一个有序序列。 (2)同一个列表中,可以包含任意类型的对象。 (3)列表是可变的,可以添加、删除、直接修改列表成员。 (4)列表存储的是对象的引用,而不是对象本身。 3.3.2 列表基本操作 1.创建列表 可以使用方括号把由逗号分隔的不同数据项括起来,或使用list()函数创 建一个列表。 list()方法的语法格式如下: list(seq) 作用:将元组或字符串seq转换为列表。 比如,在下例中,我们看到在同一个列表中,可以包含任意类型的对象。 >>> ['physics', 'chemistry', 19.97, 2000] ['physics', 'chemistry', 19.97, 2000] >>> list('abcd') ['a', 'b', 'c', 'd'] 2.索引 可以使用下标索引来访问列表中的值,前面介绍过,序列类型具有双向索引 76