第3章 常见数据类型 Python语言的数据类型非常丰富,有数字类型、字符串类型、布尔类型、列表、元组、集合、字典等多种类型的数据。由于每一种数据类型表示范围和性质不相同,系统为每种数据类型分配的存储空间也不相同。本章介绍Python语言三种常见的数据类型,分别是数字类型、字符串类型、布尔类型。其中,数字类型和布尔类型被称为基本数据类型数据,而字符串类型属于组合数据类型中的序列类型。 3.1数 字 类 型 数字是人类计数活动的抽象表示,是数学运算和逻辑推理的基础。计算机对数字的识别和处理有两个基本要求: 确定性和高效性。确定性是指读入的数据正确且无歧义,高效性是指较高的运算速度兼具较少的存储空间。 用于表示数字或数值的数据类型叫作数字类型,Python语言提供三种数字类型: 整数、浮点数和复数,分别对应数学中的整数、实数和复数。 3.1.1整数类型 整数类型共有四种进制表示方式: 十进制、二进制、八进制和十六进制。默认情况下采用十进制表示,各个进制间为了相互区别,分别加了不同的引导符,如表31所示。 表31整数类型四种进制说明 进制类型 引导符号 详 细 说 明 示例 十进制 无 系统默认进制 123或-426 二进制 0B或0b 由字符0和1组成 0b1011 八进制 0o或0O 由字符0~7组成 0o715 十六进制 0X或0x 由字符0~9,a~f,或A~F组成 0xAB5 二进制与十进制之间的相互转换我们比较熟悉,例如: (1011)2=(23+21+20)=(11)10。 如何将八进制和十六进制转换为二进制和十进制呢?首先,将八进制数的每一位写成对应的三位二进制数,如果是十六进制数,就将这个数的每一位写成四位的二进制数,再将这个二进制数转换为对应的十进制数。 例如: (715)8=(111001101)2=(28+27+26+23+22+20)=(256+128+64+8+4+1)=(461)10。 也可以将(715)8按位展开,例如: (715)8=(7×82+1×81+5×80)=(448+8+5)=(461)10。 十六进制转换成二进制或十进制方法同上。 Python程序设计基础教程(题库·微课视频·二级真题解析) 第 3 章常见数据类型 读者可尝试用上述方法计算如下数据。 0o743=()2=()10 0x1Af==()2=()10 3.1.2浮点数类型 浮点数类型与数学中的实数概念相似,表示带有小数的数值。Python语言要求如果指定某个数据为浮点数,则该数必须有小数部分,小数部分可以是0。这种设计理念主要是为了区分浮点数和整数。浮点数有两种表示方法: 十进制表示和科学记数法两种。 科学记数法使用字母e或E作为幂的符号,基数是10,具体表示方法如下。 897=8.97e+2=8.97e2=8.97×102-0.789=-7.89e-1=-7.89×10-1 需要说明的是: 0与0.0值相同,但二者数据类型不同,一个是整数,一个是浮点数。它们在计算机内部的表示方法也不相同,主要是因为这两类数据在计算机中由不同的硬件单元执行,因此处理方法不相同。 3.1.3复数类型 复数类型类似数学中的复数,常用于科学计算。复数可用a+bj形式表示,其中,a是实部,表示实数部分; b 为虚部,表示虚数部分,后面接j或J表示,如3.2+5j。需要注意的是,如果虚部的值为1,这个1不能省略,否则就是错误的数据。1+1j是正确的复数写法。 >>>10.0-2+3j #实部用整数形式表示 (8+3j) >>> 1+j #虚部前面的"1"不能省略,否则提示错误信息 Traceback (most recent call last): File "", line 1, in 1+j NameError: name 'j' is not defined >>> 1+1j (1+1j) 复数类型中的实部和虚部都是浮点数类型,对于复数z,可以用z.real和z.imag分别获得它的实部和虚部。需要注意的是,复数z必须放在一对圆括号“()”中,两者是缺一不可的整体。另外,在复数运算过程中,实部能用整数表示,就不用浮点数表示。 >>> (1.45e4+2.49e5j).real 14500.0 >>> (1.45e4+2.49e5j).imag 249000.0 >>> 2+3j.imag #该实数没有放在圆括号中,虚数部分得出的值不正确 5.0 >>> (2+3j).imag #这是正确的虚数部分的结果 3.0 3.1.4数字类型内置运算符 Python语言提供了多个数字类型内置运算符,它们的操作功能与数学计算方法类似,其运算结果也符合数学意义,每一种运算符的功能如表32所示。 表32内置运算符功能描述 运算符名称 示例 功 能 描 述 +加 6+5=11 两数之和 -减 6-5=1 两数之差 *乘 6*5=30 两数乘积 /除 6/3=2.0 两数之商(必须是浮点数) //地板除 6//5=1 取不大于商的最大整数 %模运算 6%5=1 取相除后的余数 **幂运算 6**3=216 6×6×6=216 两个数计算后,其结果可能会改变原有的数字类型,规则如下。 (1) 整数与浮点数混合运算,输出结果是浮点数。 (2) 整数之间运算,产生结果类型与操作符相关,“/”运算的结果是浮点数。 (3) 整数或浮点数与复数计算,输出结果是复数。 (4) 如果在一个表达式中同时出现多个运算符,运算符的优先级别如表33所示。 1. “+、-、*、/”运算符 这四个运算符与数学领域对应运算符计算方法相似。 >>>100/3 33.333333333333336 >>>100//3 33 >>>123+4.0 127.0 特殊情况: >>> 1.2+2.3 3.5 >>> 1.1+2.2 3.3000000000000003 仔细观察上面的结果,可以看到有时两个浮点数相加,运算结果难以理解。这是因为整数运算与浮点数运算的值有差异。浮点数最多只能输出17个数字长度的结果,而且只有前面15个数字是确定的、精准的。下面的例子非常形象地说明了浮点数与整数在运算时由于精度不同导致运算结果也不相同。 >>> 4.567891238*1.234567897 5.639371879422386 >>> 4567891238*1234567897 5639371879422386486 整数运算能够得到完全准确的运算结果,因此为了提高运算精度,使用整数形式表达浮点数是常见的方法之一。 2. “%”取模运算符 “%”取模运算符在编程中经常被使用,通常用来判断一个数字是奇数还是偶数,或者判断一个数字是否能被另一个数字整除,有时也用于判断周期规律数,如一个星期七天,用d代表日期,则d%7的取值可以有0、1、2、3、4、5、6,分别对应星期日、星期一、星期二、……、星期六。 “%”取模运算规则如下。 (1) 除数不能为0,否则系统提示错误信息。 (2) 结果的符号位与除数的正负号有关,如果除数的符号位是正号,其结果一定为正数,否则一定为负数。 (3) 如果被除数与除数符号位同号,计算结果为两者相除之后的余数。 (4) 如果被除数与除数符号位异号,计算结果为两者相除之后的余数与除数之差的绝对值。 >>> 23%5 3 >>> -23%-5 -3 >>> 23%-5 -2 >>> -23%5 2 3. “**”幂运算符 >>> 2**2**3 256 很多人从左至右计算得到的结果是64,而实际上因为右结合的特点,先计算23=8,再计算28=256。 思考一下,如何将数学中的算式用Python语言表达式表示出来呢?例如: x=245+6×8 实现方法及运算结果如下。 >>> x=2**4/5+6*8 >>> x 51.2 如果在一个复杂的表达式中同时出现多个数字运算符,应该遵循如表33所示的运算规则。其中,括号()优先级别最高。如果出现多个(),按照从内向外逐层展开的原则进行计算。如果在一个表达式中出现多个同一级别的运算符,按照从左向右的顺序依次运算。 表33数字运算符优先级别 级别 运 算 符 名 称 ()括号 **幂 +、-正负号 *、/、//、%乘、除、整除、模除运算 +、-加、减 >>> 3*4**2/8%5 1.0 >>> 30-3**2+8//3**2*10 21 3.1.5数字类型内置函数 Python语言提供了一些数字类型内置函数,它们无须导入,用户可以直接使用。 1. abs(x) 功能: 取数值x的绝对值。如果x为正数,函数值为x,否则函数值为x的相反数。 >>>abs(-78) 78 2. divmod(x,y) 功能: 该函数的返回值有两个结果,并以圆括号“()”形式输出,第一个值为x//y运 算后的结果,第二个值为x%y运算后的结果。 >>>divmod(14,5) (2,4) 3. pow(x,y,[z]) 功能: 如果参数z省略,该函数是求数值x的y次幂的值,即pow(x,y)=x**y。 如果有第三个参数z,该函数先求x的y 次幂的值,再将结果与z进行取模运算,将最终结果作为真正的函数返回值,即pow(x,y,z)=x**y%z。可以将参数y的值设为0.5,使用pow()函数可以完成开根号运算。 >>>pow(2,10) 1024 >>>pow(2,10,5) 4 >>> pow(9,0.5) 3.0 4. round(x,n) 功能: 四舍五入函数。如果参数n的值是大于或等于1的正整数,则将x四舍五入后保 留到小数点后面第n位。如果参数n的值为0,保留到x的个位; 如果n=-1,-2,-3,则保留x到十位、百位、千位,以此类推。 >>>round(45.23,2) 45.23 >>> round(45.23,0) 45.0 >>> round(45.23,-1) 50.0 有时也会有例外,如下面程序代码所示。 >>> round(4.5) 4 >>> round(4.500001) 5 >>> round(5.5) 6 在Python语言中,针对四舍五入取舍为“5”这个数时还要遵循银行家算法进行考虑,即数字“5”的后面非0就进“1”,因此round(4.500001)=5; 如果数字“5”的后面为0,还要看数字“5”前面的数是奇数还是偶数。如果是偶数应该舍去,如round(4.5)=4; 如果是奇数,结果要向前进“1”,如round(5.5)=6。 还有一些极个别的现象,有一些末位为“5”的数字,看起来在四舍五入操作中不符合这个规律,这是因为在进制转换中有进位或者发生了舍弃,在提高精度后,可能比那个数大一点点或小一点点。 5. min/max() 功能: 在众多同类可比较的数据中取最小值或最大值。 >>>max(1,2,6,8) 8 >>>min(1,2,6,8) 1 6. bin(x) 功能: 将整数x转换成等值的二进制数。 >>>bin(56) '0b111000' 7. complex(r,i) 功能: 创建一个复数r+i*j,其中,j可以省略。 >>> complex(3,6) (3+6j) 可以利用上述所讲的内置函数解决一些实际问题。 【例31】要求用户从键盘上输入一个三位整数,编写一个能够输出其百位、十位和个位上的数字的程序。 问题分析: 此题关键在于如何把一个三位数的个位、十位、百位成功分离出来,方法有很多,这里介绍两种,也请读者们自行思考还可以采用哪些方法实现上述功能。 方法一: x=input('请输入一个三位数:') x=eval(x) a=x//100 b=x//10%10 c=x%10 print(a,b,c) 方法二: x=input('请输入一个三位数:') x=eval(x) a,b=divmod(x,100) b,c=divmod(b,10) print(a,b,c) 3.2math函数库的使用 显然,上述提到的内置函数或者运算符运算功能有限,远不能满足像三角函数、对数函数等复杂多元的计算需求,但是用户可以调用标准函数库math解决上述问题。由于复数类型常用于更复杂的科学计算,因此math函数库功能不支持复数运算,仅支持整数和浮点数运算。 math库的调用方法与turtle库一样,需要使用保留字import引用该库及库中的函数。 3.2.1math函数库的数学常数功能 math库中有4个数学常数,其功能如表34所示。 表34math函数库中的数学常数 常数名称 表示符号 功能描述 数据取值或范围 math.pi π 圆周率 3.1415926 math.e e 自然常数 2.7182818 math.±inf ∞或-∞ 正、 负无穷大 math.nan 非浮点数标记 3.2.2math函数库中常用函数功能 math函数库中的函数共有44个,分为4大类,包括16个数值表示函数、8个幂对数函数、16个三角函数和4个高等特殊函数。由于库中函数数量较多,本章只介绍常用的9个函数的功能,如表35所示。 表35math函数库中常用函数功能列表 函数名称 数 学 表 示 操 作 实 例 fabs(x) |x| >>>fabs(-36) 36.0 fmod(x,y) 与x%y功能相似,但并不完全相同。数值位只取两者相除后的余数,符号位与被除数一致 >>>fmod(25,6) 1.0 >>>fmod(-25,6) -1.0 >>>fmod(25,-6) 1.0 >>>fmod(-25,-6) 1.0 fsum([x,y,z,…]) x+y+z+… >>>0.1+0.2+0.3 0.600000000000001 >>>fsum([0.1,0.2,0.3]) 0.6 ceil(x) 向上取整 返回不小于x的最小整数 >>>ceil(56.7) 57 floor(x) 向下取整 返回不大于x的最大整数 >>>floor(56.7) 56 pow(x,y) xy >>>pow(2,5) 32.0 sqrt(x) x >>>sqrt(144) 12.0 exp(x) 返回e的次幂 >>>exp(2) 7.38905609893065 log(x,y) 返回以y为底, 以x 为真数的对数 >>>log(100,10) 2.0 说明: (1) 虽然math函数库的pow()函数与内置函数pow()两者都可以进行次幂运算,但功能略有差别。主要取决于内置函数pow()中是否有第三个参数z,如果有,pow()运算后的结果为pow(x,y,z)=x**y%z,这时两个函数的返回值大相径庭,请读者仔细分辨。 (2) math函数库中fabs()函数与内置函数abs()都可以取绝对值,但是fabs()函数只针对整数和浮点数,abs()函数还可以针对复数计算。 3.2.3math函数库应用举例 【例32】天天向上的力量。 小明英语成绩欠佳,在新年第一天,他发誓一定要好好学习、天天向上。假设: 一年365天,以第一天的能力值作为基数,记为1.0。当他好好学习时,能力值相比前一天提高0.1%,不学习时能力值相比前一天下降0.1%。如果小明每天都在努力学习,一年后他的能力值将达到多少?再假设小明每天都违背初衷,不思进取,每天放任自流,一年下来他的能力值将达到多少?两差相差多少? 问题分析: 本题是指数计算经典题目。为了方便计算,可以调用标准库函数math,调用方法及实现过程代码如下。 >>> import math >>>X=math.pow((1+0.001),365) >>>Y=math.pow((1-0.001),365) >>>Print(x) 1.44 >>> Print(y) 0.69 >>>x-y 0.75 通过上述数据对比分析,似乎天天努力上进与天天放任自流的能力值相差不是很多,并没有带给大家特别震撼的效果。接下来,把每天进步或退步的能力值比例提高到1%,重新观察两者间的差距。 将上题中的0.1%即0.001换成0.01,重新套用公式得到的数据为x=37.78,y=0.03,x/y=3700,即两者相差37倍,这个数值非常惊人。由此可见水滴石穿、以小见大的道理。 【例33】已知a=2,b=3,c=8,求解一元二次方程ax2+bx+c=0的实根。 问题分析: 一元二次方程求根公式为x=-b±b2-4ac2a,接下来要处理的主要问题是如何将求根公式的表达式正确表达出来。需要注意的是,除式中分子与分母属于不同部分,可以使用“()”将两者明确区分,否则将导致分子、分母错位,输出结果错误。 由于涉及开根号,可以调用math函数库中的sqrt()函数解决问题。当然,如果不调用任何外部函数,使用pow(x,0.5)函数也可以解决开根号问题。 >>> from math import * >>> a=2 >>> b=8 >>> c=3 >>> x2=(-b+sqrt(b**2-4*a*c))/(2*a) >>> x1=(-b-sqrt(b**2-4*a*c))/(2*a) >>> print(x1,x2) -3.58113883008419 -0.41886116991581024 计算圆的面积、体积时通常需要用到常数π,常规算法需要事先定义π值小数点后面保留的位数,这就可能导致运算结果精度下降。如果调用math函数库的π值,运算结果的精度将会得到显著提升,读者不防尝试一下。 3.3字符串类型数据 字符串是Python语言最重要、最常见的数据类型之一,在实际应用中大量存在并被人们频繁使用。它由0个或多个字符组成,是字符的有效序列表示形式。 3.3.1字符串界限符说明 字符串从外观看,通常由一对单引号(')、双引号(")或三引号(''')构成。其中,单引号与双引号的作用都是用来表示一行字符,两者没有区别。如果想表示多行字符,则必须用三引号引用数据。三者的区别如下。 单引号表示字符形式: '白日依山尽' 双引号表示字符形式: "千山鸟飞绝" 三引号表示字符形式: '''飞流直下三千尺 疑是银河落九天''' 使用单引号时,双引号、三引号可以作为字符串的一部分; 使用双引号时,单引号、三引号也可以作为字符串的一部分。 >>> print('这是一首"李白"的诗') 这是一首"李白"的诗 >>> print("该诗'豪放自由',被后人千古称颂!") 该诗'豪放自由',被后人千古称颂! 使用三引号的方法及运行结果如下。 >>>b='''a=1'' >>>print(b) #使用print()函数输出字符串时,外围界限符不显示 a=1 >>>b #显示字符串类型的变量值,显示字符串界限符 '''a=1'' 3.3.2字符串的表示、索引和切片 字符串是字符的序列,用户可以按照单个字符或字符片段进行索引。索引有两种方式,分别是正向递增序号表示法与反向递减序号表示法,具体使用规则如图31所示。 图31Python字符串的两种序号体系 如果字符串的长度为N,正向递增表示方法以最左侧字符序号为0,向右依次递增,最右侧字符的序号为N-1; 反向递减序号以最右侧字符序号为-1,向左依次递减,最左侧字符序号为-N。这两种方法可以交叉使用。 1. 单个字符索引 >>>"新春快乐,万事如意!"[1] '春' >>>"新春快乐,万事如意!"[-1] '!' >>>"新春快乐,万事如意!"[3] '乐' >>>"新春快乐,万事如意!"[-3] '如' 2. 切片索引 如果想对字符串某一段字符索引,可采用[M:N]格式,表示字符串从M到N(不包含N)的子字符串,其中,M、N为字符串的索引序号,正向递增与反向递减方式可混合使用。 >>>"新春快乐,万事如意!"[2:4] '快乐' >>>"新春快乐,万事如意!"[5:2] '' #顺序必须是从左到右,否则返回空串 >>>"新春快乐,万事如意!"[0:-1] '新春快乐,万事如意' >>>" 新春快乐,万事如意!"[3:] #与[3:9]结果不同 '乐,万事如意!' >>>" 新春快乐,万事如意!"[:-3] '新春快乐,万事' “:”前面内容为空,表示从最左边位置索引; “:”后面内容为空,表示一直索引到最后一个字符。[M:N:K]表示返回从M位置开始按照步长K的值索引直到N的位置(不包含N)结束所有的字符。K的值可以是正整数,也可以是负整数,表示步长为正或者为负,即正向或反向索引。 >>> a='好好学习,天天向上!' >>> a[:4] '好好学习' >>> a[4:] ',天天向上!' >>> a[::] '好好学习,天天向上!' >>> a[::-2] '!向天习好' 3.3.3字符串操作符 Python语言提供了五个字符串操作符,它们的功能如表36所示。 表36字符串操作符功能 操作符 功 能 描 述 x+y 连接x与y字符串 x*n或n*x 把字符串x复制n次 x in s 字符串x是s子串,返回True; 否则返回False str[i] 索引,返回第i个字符 str[n:m] 切片,左闭右开 >>>'Python语言'+'程序设计' 'Python语言程序设计' >>>'good!'*3 'good! good! good!' >>>a= 'Python语言'+'程序设计' >>> 'Python语言'ina True >>> 'M'ina False 【例34】要求用户从键盘上输入1~4的数字,输出对应的各季度字符串的名称。例如: 输入3,返回“第三季度”。 问题分析: 根据题意首先需要给出完整的字符串,其次根据字符串的特点寻找内在规律,再根据用户给定的数值确定索引的起始位置与结束位置,并返回最终字符串。 x='第一季度第二季度第三季度第四季度' y=eval(input("请输入季度数字(1---4):")) m=(y-1)*4 #输入的数字在x字符串的索引信息 print(x[m:m+4]) #输出返回字符串的切片信息 3.3.4字符串内置函数 下面介绍九个Python语言中与字符串操作相关的内置函数。 1. type()函数 功能: 它是Python语言内置函数之一,但不是字符串处理函数,该函数的功能是返回参数的数据类型。int表示整数类型数据; float表示浮点数类型数据; str表示字符型数据; complex表示复数类型数据。 >>> type(3) >>> type(3.2) >>> type('123') >>> type(2+3j) 2. len(x)函数 功能: 求字符串x的长度。 >>>len('你好') 2 3. str(x)函数 功能: 将任意类型x转换成字符型数据。 >>>str(1010+101) '1111' 4. int(x)函数 功能: 将任意类型x转换成整数类型数据。 >>>int(10.01) 10 >>>int("10") 10 5. float(x)函数 功能: 将任意类型x转换成浮点数类型数据。 >>>float(10) 10.0 >>>float('123.456') 123.456 6. chr(x)函数 功能: 返回Unicode编码x对应的单字符。 >>>chr(1010) 'c' 7. ord(x)函数 功能: 返回单字符x对应的Unicode编码。 >>>ord('和') 21644 8. hex(x)函数 功能: 返回整数x对应的十六进制数的小写形式字符串。 >>> hex(205) '0xcd' 9. oct(x)函数 功能: 返回整数x对应的八进制数的小写形式字符串。 >>> oct(-45) '-0o55' 3.3.5Unicode编码 计算机中的每个字符都可以用唯一确定的数字表示,这种表示方式称为编码。计算机自从诞生以来,广泛应用的编码形式是ASCII码。它用一个字节表示计算机键盘上的常见字符以及一些被称为控制符号的特殊值,最多能表示256种不同的字符。其中,大写英文字母A~Z用65~90表示,小写英文字母a~z用97~122表示。 由于ASCII编码的设计初衷只针对英文字符,如果要表示中文,显然一个字节不够,至少需要两个字节,而且还不能与ASCII编码冲突,所以中国制定了GB 2312编码,用来把中文编进去。类似日文和韩文等其他语言也有这个问题,为了统一所有文字的编码,Unicode编码应运而生。 Unicode编码又称为统一码、万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode编码是为了解决传统字符编码方案局限性而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode编码于1990年开始研发,1994年正式公布。 随着计算机工作能力的增强,Unicode编码自从面世以来在各个国家广泛应用。世界上大多数程序用的字符集都是Unicode编码,因为Unicode编码有利于程序国际化和标准化。Python字符串中每个字符都使用Unicode编码表示。如果读者需要查询相关字符对应的Unicode编码,可以通过访问网站http://tool.oschina.net/encode查询,或者访问网站http://bianma.supfree.net/ Unicode获取相关信息。 为了节省存储空间,在字符传输和存储中常使用UTF8、UTF16、UTF32等编码形式,这些编码方式是一种可变长的编码,是Unicode根据一套规则转换而来的。UTF32编码是指存储一个字符用4字节,以此类推,UTF16编码是指存储一个字符用2字节,而UTF8编码是指存储一个字符用1字节。上述编码存储过程中,如果该字符位数不够,左边用数字“0”进行填充点位。 3.3.6字符串函数处理方法 在Python语言中所有的数据类型都采用面向对象方式实现,被封闭为各个类,字符串也是一个类,它具有类似()形式的字符串处理函数,这类函数在面向对象中被称为“方法”。表示待处理的字符串,表示字符串处理方法。 字符串类型共包含43个内置方法,接下来重点介绍几个常用的方法及其相关功能。 1. str.lower()方法 功能: 将字符串内容全部转换为小写字母。 >>>'Python'.lower() 'Python' 2. str.upper()方法 功能: 将字符串内容全部转换为大写字母。 >>>'Python'.upper() 'PYTHON' 3. str.split()方法 功能: 将字符串按空格划分为列表,如果参数里面有字符,则将参数中指定的字符去掉 后再按空格划分为列表。 >>>'Python is an excellent language.'.split() ['Python','is','an','excellent','language.'] >>>'Python is an excellent language.'.split('an') ['Python is ',' excellent I ',' guage.'] 4. str.count(sub)方法 功能: 返回子串出现的次数。 >>>'Python is an excellent language.'.count('an') 2 >>>'Python is an excellent language.'.count('a') 3 5. str.replace(old,new)方法 功能: 用指定的新字符替代原有的旧字符。 >>>'I love apple'.replace('e','#') 'I lov# appl#' 6. str.center(width,占位符)方法 功能: 将字符串居中,不足位用占位符占位。 >>>'Python'.center(10,'=') '==Python==' >>>'Python'.center(1,'=') 'Python' 7. str.strip(chars)方法 功能: 将字符串的左侧及右侧去掉chars中列出的字符。 >>>'==Python=='.strip('') '==Python==' >>>' =Python='.strip('=') 'Python' 8. str.join(iter)方法 功能: 将iter变量的每一个元素后增加一个str字符串。 >>>'.'.join('12345') '1.2.3.4.5' >>>' '.join('Python') 'p y t h o n' 3.3.7字符串中常见的转义字符 字符串本身含有三种界限符,如果遇到一个很复杂的字符串既包含双引号又包含单引号,为了区别外围的界限符,系统本身引入了一个新的符号——转义符“\”。通过转义符告诉系统不要对它们进行匹配。转义符不但可以转义单引号、双引号,也可以转义其他符号。表37列出了常用转义字符及其含义。 表37常用转义字符及其含义 转义字符 含义 \n 换行符,光标移到下行行首 \\ 字符本身 \ 用在行尾时相当于续行符 \' 相当于单引号 \" 相当于双引号 \a 响铃,蜂鸣 \b 退格键(Back Space),IDLE下不支持该符号,需要保存为.py文件,然后在命令下执行 \v 纵向(垂直)制表符 \t 横向(水平)制表符 \r 回车,IDLE下不支持该符号,需要保存为.py文件,然后在命令下执行 \f 换页 \0 NULL,什么都不做 3.4字符串类型的格式化 字符串是程序向控制台、网络、文件等介质输出运算结果的重要形式之一,当用户输出一个字符串时,有时希望输出的框架不变,人称或部分内容略有变化。为了满足上述需求,也为了提高输出结果的灵活性和效率,很多高级语言都采用了字符串格式化输出方式。Python语言也不例外,它采用format()方法赋予字符格式化输出形式。 3.4.1format()方法的基本使用方法 格式: <模板字符串>.format(<逗号分隔的参数>) 说明: 模板字符串是一个由字符串和槽组成的字符串,用来控制字符串和变量的显 示效果。槽用{}表示,对应format()方法中逗号分隔的参数。槽的数量与format()方法中出现的变量个数必须一致,否则系统出错。 >>> "{ }曾说:书籍是人类进步的阶梯。".format('高尔基') '高尔基曾说:书籍是人类进步的阶梯。' 如果模板字符串有多个槽,且槽内没有指定的序号,则按槽出现的先后顺序分别对应format()方法中的不同参数。 >>> "{ }曾说:书籍是人类{ }的阶梯。".format('高尔基',"进步") '高尔基曾说:书籍是人类进步的阶梯。' format()方法中,参数根据出现的先后顺序存在一个默认的序号,如图32所示。 图32format()方法中槽顺序与参数顺序对应关系 如果用户希望引用槽的先后顺序发生改变,也可以自行设置序号。 >>> "{1}曾说:书籍是人类{0}的阶梯。".format("进步",'高尔基') '高尔基曾说:书籍是人类进步的阶梯。' 如果槽的数量与format()方法中出现的变量数量不一致,程序不能通过简单的顺序找出确定的对应变量,系统就会给出错误信息提示。 >>> "这是{ }的名言。{ }曾说:书籍是人类进步的阶梯!".format('高尔基') Traceback (most recent call last): File "", line 1, in "这是{ }的名言。{ }曾说:书籍是人类进步的阶梯!".format('高尔基') IndexError: tuple index out of range 如果想得到正确的结果,必须在槽中使用序号指定参数使用。 >>> "这是{0}的名言。{0}曾说:书籍是人类进步的阶梯!".format('高尔基') '这是高尔基的名言。高尔基曾说:书籍是人类进步的阶梯!' 如果希望在模板字符串中也能输出大括号“{}”,可以在要输出的信息两侧套上两个大括号,具体方法表示如下。 >>> "{ }曾说:{{书籍是人类{}的阶梯。}}".format('高尔基',"进步") '高尔基曾说:{书籍是人类进步的阶梯。}' 3.4.2format()方法的格式控制 format()方法中的槽除了可以包含参数序号,还可以包含格式控制信息。其内部样式如下。 {<参数序号>: <格式控制标记>} 其中,格式控制标记用来控制参数显示时的格式,语法说明如表38所示。 表38槽的格式控制标记说明 : <填充> <对齐> <宽度> <,> <.精度> <类型> 引导符号 用于填充的单个字符 <左对齐 >右对齐 ^居中对齐 设定输出字符的宽度 数字的千分位分隔符,适用于整数及浮点数 设置浮点数小数位的精度或字符串的最大长度 整数类型: b,c,d,o,x,X 浮点数类型: e,E,f,% 上述控制标记的6个字段可分为两组,用户根据需要可以有选择地使用,也可以组合在一起使用。 第一组: <填充><对齐><宽度>这3个字段密切相关,主要用于对显示信息格式的规范。 <宽度>字段指当前槽设定输出字符的宽度,如果实际值比设定值大,按实际长度输出。如果该值小于指定宽度,则按照指定的对齐方式在宽度内对齐,不足位以空格填充。 <对齐>字段采用上述三个符号分别表示左、右、居中对齐。 <填充>字段可以修改默认填充字符,填充字符只能有一个。 示例1: >>> a='美好的一天' >>>b='*' >>> '{:10}'.format(a) '美好的一天 ' #系统默认左对齐,不足位用空格占位 >>> '{:&^10}'.format(a) '&&美好的一天&&&' #居中对齐,不足位用&符号占位 >>> '{:1}'.format(a) '美好的一天' #指定宽度为1,实际宽度为6,则以实际宽度为准 示例2: >>> a='美好的一天' >>>b='*' >>> '{0:{1}^10}'.format(a,b) '**美好的一天***' #指定不足位用以填充字符的变量b >>> '{0:{1}^{2}}'.format(a,b,15) '*****美好的一天*****' #指定不足位用以填充字符的变量b和宽度 >>> "{:^1}".format(a) #设定的宽度为1,按字符真正长度显示 '美好的一天' 第二组: <,><.精度><类型>3个字段主要用于对数值本身的规范。 <宽度>字段用于显示数字类型的千分位分隔符。 >>> '{:-^25,}'.format(78965432) '-------78,965,432--------' #带千分位分隔符的输出 >>> '{:-^25}'.format(78965432) '--------78965432---------' #不带千分位分隔符的对比输出 <.精度>字段由小数点“.”开头。对于浮点数,精度表示小数部分输出的有效位数,对于字符串而言,精度表示输出的最大长度。与<宽度>字段不同,设置<.精度>后,如果实际长度大于精度设定的长度,输出将被截断。 >>> '{:.3f}'.format(1786.52345) '1786.523' >>> '{:^20.3f}'.format(1786.52345) '1786.523' >>> '{:.3}'.format('祝小明生日快乐!') '祝小明' <类型>字段表示输出整数和浮点数类型格式。其中,整数类型的输出格式有6种,浮点数类型的输出格式有4种,具体说明如表39所示。 表39format()格式中<类型>字段说明 整数类型字符 输出说明浮点数类型字符 输 出 说 明 b 二进制形式e 小写字母e的指数形式 c Unicode编码字符E 大写字母E的指数形式 d 十进制形式f 标准浮点形式 o 八进制形式% 百分比形式 x 小写十六进制形式 X 大写十六进制形式 3.5布尔数据类型 同一种数据可以比较大小,有些不同种类的数据也可以比较大小,结果可用真(True)或假(False)描述。值为True和False的数据称为布尔数据类型。用户可以通过关系比较运算、逻辑运算、成员运算、同一性运算、位操作运算等操作方法得到相关布尔数据的值。 3.5.1比较运算符 表310列出了用于数据比较的关系运算符及其相关功能。 表310关系运算符相关说明 运算符操作举例 返回值 说明 3>=5(大于或等于) False 3<=5(小于或等于) True 同种类型数据可以比较大小 3==3(等于) True =表示赋值,==表示相等 '123'>=123 TypeError 类型不一致不能比较大小 'A'<'a' True 字母比较按英文先后顺序a'26' True 0<1<2<…<9,字母大于数字 1!=3(不等于) True 3<5<10 True 3<5>4 True 与数学方法相一致 'hell'>'word' False '张三'>'李四' False '张三'>'hello' True 字母或汉字均属于字符型数据,按照Unicode编码中的数值大小比较。通常先比较第一个字母的大小,如果相同,再比较下一个字母大小,以此类推 上述关系运算符中,“==”和“!=”是同一个级别的运算符,它们的优先级别最高; “>”“>=”“< ”“<=”也是同一级别运算符,它们的级别较低。如果在一个表达式中同时出现多个运算符,则按优先级别的高、低顺序计算,同一级别的运算符运算时遵循从左到右依次运算的原则。 3.5.2逻辑运算符 逻辑运算符有三个,分别是and(与运算)、or(或运算)、not(非运算)。它们三者中,not的优先级别最高,and次之,or最低。 逻辑与运算(and)是指运算符两侧数据同时为真,其值为真,其余情况均为假。 逻辑或运算(or)是指运算符两侧数据同时为假,其值为假,其余情况均为真。 逻辑非运算(not)是指将真(True)取反值为假,假(False)取反值为真。 >>>3>4 and 4<7 False >>>3<4 or 4>7 True >>>x=3.14 >>>not x<5.0 False >>>not false True 以下情况称为逻辑短路。具体原因如下。 1. aandb 如果a的值为真,继续计算b的值,b的结果决定最终表达式的值。如果a的值为假,无须计算b 的值,最终结果为假。 2. aorb 如果a的值为真,无须计算b的值,结果为真。如果a为假,继续计算b的值,b的结果决定最终表达式的值。 需要说明的是,无论是a还是b,只要是非空、非零、非None的数,一律认为是真值。 >>>x=3 >>>x>2 and print(x) 3 >>>x>2 or print(x) True >>>False and 12 False >>>False or 12 or 0 12 3.5.3成员运算符 成员运算符“in”用于测试一个对象是否存在于另一个对象中。成员运算符有两个,一个是“in” 表示存在,另一个是“not in”表示不存在,两者优先级别一样。 >>>'abc' in 'abcdef' True >>>'ac'in'abcd' False >>>'a'notin'bcd' True 3.5.4同一性运算符 同一性运算符“is”用于测试两个变量是否指向同一个对象。同一性运算符也有两个,一个是“is”表示被测试的两个对象相同,另一个是“is not”表示被测试的两个对象不相同,两者优先级别一样。 这里用于判断两个对象相同或不同的依据是两个对象的数值不仅值一样,类型也要一样。如果是变量,还要保证两个变量的命名空间(即id值)也要一样。Python语言规定只有在[-5,257]中的整数,它们id值才相等,其他范围的数据,它们的id值不相同。 测试id值大小,可用Python语言内置函数id(x)完成,其结果为数值x对应的id值。系统规定: id(x)对每一个数据返回唯一的编号。编号是指数据存储在内存中的唯一地址。数据不同,编号也不同,用户可以通过比较两个变量编号是否相同判断数据是否一致。 另外,在学习“is”运算符时,一定要与“==”运算符区别清楚。“==”运算符用来判断两个对象的值(value)是否相同。“is”运算符用来判断两个对象的值以及为每个变量分配的命名空间即id值是否相同。 >>> x=y=5 >>> z=5 >>> x is y True >>> x is z True >>> id(x),id(y),id(z) (1429199088, 1429199088, 1429199088) 如果数据的取值范围为不在[-5,257]区间的整数,则会出现如下结果。 >>>x=y=2.5 >>>z=2.5 >>>x==z True >>>x is y True >>>x is z#由于x,y,z不是整数而是浮点数 False >>>x==z True >>> id(x) 64634016 >>> id(y) 64634016 >>> id(z) 61766192 3.5.5位运算符 位运算符只能用于整数运算,内部执行过程为: 首先将整数转换为二进制数,然后右对齐,必要时左侧补“0”,接下来按位进行运算,最后把结果转换为十进制数返回。表311列出Python语言位运算符功能。 表311Python语言位运算符功能 运算符 功能 ~ 取反 << 左移 >> 右移 & 与 | 或 ^ 异或 下面以8位二进制数为例详细解释各种位操作运算符实现过程。 1. 取反(按位取反)运算 >>> ~1 -2 说明: 1的二进制数为00000001,按位取反得11111110,代表补码为-2的整数。 2. 左移/右移运算 >>> 12<<2 48 >>> 12>>2 3 说明: 12的二进制数为00001100,向左移两位变成二进制数00110000即十进制数48。12向右移两位变成二进制数00000011即十进制数3。 3. 与/或运算 “&”运算规则是: 1&1=1; 1&0=0; 0&1=0; 0&0=0。 “|”运算规则是: 1|1=1; 1|0=1; 0|1=1; 0|0=0。 >>> 45&65 1 >>> 45|65 109 说明: 45转换成二进制数为00101101,65转换成二进制数为01000001,二者按位“与”运算结果为二进制数00000001,即十进制数1。将45与65按位“或”运算结果为二进制数01101101,即十进制数109。 4. 异或运算 “^”运算规则是: 1^1=0; 0^0=0; 1^0=1; 1^1=1。 >>> 45^65 108 说明: 45转换成二进制数为00101101,65转换成二进制数为01000001,二者按位进行“异或”操作,即每一位上的两个数同为0或为1时,其值为0; 每一位上的两个数相异时,其值为真。最后结果是二进制数01101100,对应的十进制数为108。 3.5.6常用运算符的优先级别和结合性 在实际运算中,经常出现多种运算符混合在一起的复杂表达式,表312列出了各种运算符同时出现时的优先级别,以及在运算中需要考虑的结合性问题。 >>> a=3;b=4;c=5 >>> a+b>c andb==c False >>> a+3/b-c%2>2 True 表312运算符优先级别及结合性说明 优先级 运算符 结合性 () ** */%// +- >><< & ^| <<=>>= ==!= not and or isisnot innotin =+=-=*=/=%=//=**= 从左至右 从右至左 从左至右 从右至左 3.5.7补充说明 Python语言不支持++和--运算符,它们有另外的含义,要注意与其他高级语言的区别。 >>> i=8 >>> ++i#正正得正,等价于+(+i) 8 >>> i++ #不支持++运算,提示语法错误 SyntaxError: invalid syntax >>> --i #负负得正,等价于-(-i) 8 >>> i-- #不支持--运算,提示语法错误 SyntaxError: invalid syntax >>> -----(4+5) -9 >>> 4- +5#等价于4-(+5) -1 >>> 4+ -5 -1