第3章基本数据类型 本章学习目标 .理解数字类型、字符串类型和逻辑类型相关的概念。 .掌握数字类型、字符串类型和逻辑类型的表示方法。 .掌握数字类型、字符串类型和逻辑类型的运算操作符、内置函数、标准库函数和内置 方法。 本章依次介绍Python的三种基本数据类型及其操作,即数字类型及其操作、字符串类 型及其操作和逻辑类型及其操作,期间穿插介绍4个应用基本数据类型的案例。 3.数字类型及其操作 1 本节主要包括以下5方面内容。 ①数字类型的概念。 ②数字类型的表示。 ③数字类型的运算操作符。 ④内置的数字类型的函数。 ⑤数字类型的标准库———math库。 1.数字类型的概念 3.1 Python的数字类型大致对应数学中“数”的概念,包括整数、浮点数和复数三种类型。 其中,整数的概念和数学中的“整数”略有不同,Python的整数除十进制整数外,还包括二进 制整数、八进制整数和十六进制整数。浮点数和复数分别对应数学中的实数和复数。 3.2 数字类型的表示 1. 数字类型包括整数、浮点数和复数,下面分别介绍每种数字类型的表示方法。 1. 整数的表示 Python中,十进制、二进制、八进制和十六进制整数的表示方法各不相同。 1)十进制整数表示 十进制整数不需要引导符。书写十进制整数时,直接书写正负号和十进制数字序列即 可。例如,1080 、99 和-217 都是Python合法的十进制整数。 2)二进制整数表示 二进制整数的引导符是“0b”或“0B”。其中,“b”是英文二进制“binary”的首字母,出现 在引导符中的时候,字母“b”大、小写完全等价。书写二进制整数时,数字序列中只可包含 “0”和“1”两个数字。例如,0b010 和-0B101 都是Python合法的二进制整数。 Python程序设计———以医药数据处理为例(第....................................2..版..) 3)八进制整数表示 八进制整数的引导符是“0o”或“0O”。其中,“o”是英文八进制“octal”的头字母,出现在 引导符中的时候,字母“o”大、小写完全等价。书写八进制整数时,数字序列中只可包含“0” “1”“2”“3”“4”“5”“6”和“7”这8个数字。例如,0o123和-0O456都是Python合法的八进 制整数。 4)十六进制整数表示 十六进制整数的引导符是“0x”或“0X”。其中,“x”表示英文十六进制“hexadecimal”,出 现在引导符中的时候,“x”大、小写完全等价。书写十六进制整数时,数字序列中只可以包 含“0”“1”“2”“3”“4”“5”“6”“7”“8”“9”“a”“b”“c”“d”“e”和“f”。其中,“a”表示10,“b”表示 11,……,以此类推,“f”表示15。另外,十六进制整数中,“a”“b”“c”“d”“e”和“f”大、小写等 价。例如,0x1a3和-0X9f都是Python合法的十六进制整数。 Python整数类型理论上的取值范围是[-∞,∞],实际上,Python整数的取值范围受 到程序员计算机内存的限制,内存配置不同的机器取值范围也不同。 2.浮点数的表示 Python中浮点数的表示方法有两种:十进制法和类科学记数法。 1)十进制法 十进制法的特点是数据中必须包含小数点。例如,0.0、-77.、1000.和-2.17都是十进 制法表示的浮点数。 2)类科学记数法 类科学记数法把一个浮点数分解成a 与10的n 次幂相乘的形式,其中,a 称为尾数,n 称为指数。用类科学记数法书写浮点数时,先写a,然后写“e”或“E”,最后写n。例如, 68e4、4.4e-3和8.6E5都是类科学记数法表示的浮点数。 Python中,浮点数的表示范围很大,但受到宿主计算机系统的影响,有最大值限制。用 户可以通过调用标准库-sys库的sys.float_info,查看自己系统的Python浮点数的最大值, 相关代码及运行结果示例如下。 >>>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) 由运行结果可见,本机Python浮点数的最大值是1.798×10308。 另外,Python的浮点数运算存在误差(一般小于10-16),典型的例子如0.1和0.2的和 不等于0.3,以下是Python中求0.1和0.2的和的代码及其运行结果。 >>>0.1 +0.2 0.30000000000000004 因此,如果数据处理不允许有误差,就应该转换为整数进行运算,运算结束后再处理小 数点的问题。 3.复数的表示 Python中,复数的表示和数学中复数的表示相近,写作a+bj 或a+bJ。其中,a 是实 ·64· 第3章 基本数据类型.................. 部,b 是虚部,a 和b 都是浮点数类型。例如,26.2+3j、-5.6+7j和1.25e-6+5.68e+9j都 是Python合法的复数。 书写复数时,等于整数的浮点数实部或虚部可以略写为整数形式。例如,12.3+4j和 -5.6+7j都是Python合法的复数。但在计算机内部,虚部4和7仍然作为浮点数处理。 任何一个Python复数都有两个属性:real和imag。对于一个特定的复数z=a+bj, z.real的返回值为实部a,z.imag的返回值为虚部b。 例如,以下是求一个复数的实部和虚部的代码及其运行结果。 >>>z =1.23e-4 +5.6e +89j >>>z.real 0.000123 >>>z.imag 5.6e +89 复数用print()函数输出到屏幕上时,Python会在复数外面添加一对圆括号。 例如,以下是调用print()函数输出复数“1+2j”的代码及其运行结果。 >>>print(1+2j) (1+2j) 3.1.3 数字类型的运算操作符 Python数字类型的运算操作符主要包括两大类:基本运算操作符和增强赋值运算操 作符。 1.基本运算操作符 Python数字类型的基本运算操作符主要有9个,详见表3.1。 表3.1 Python数字类型的基本运算操作符 运算表达式运算结果结 合 性 x**y x 的y 次幂,即xy 右结合 +x 求x 本身的正数,即x*1 右结合 -x 求x 的负数,即x*(-1) 右结合 x* y x 与y 之积左结合 x/y x 除以y 的商左结合 x//y x 除以y 的整商左结合 x% y x 除以y 的余数,也称为模运算左结合 x+ y x 与y 之和左结合 x- y x 与y 之差左结合 以上9个基本运算操作符中,求正数和求负数只需要1个操作数,是一元运算操作符, 其余7个运算操作符都是二元运算操作符。 对于这7个二元运算操作符(**、*、/、//、%、+、-),Python都提供了相应的增强 赋值运算操作符。 ·65· Python程序设计———以医药数据处理为例(第....................................2..版..) 2.增强赋值运算操作符 Python的增强赋值运算操作符共7个,分别是**=、*=、/=、//=、%=、+=和-=。 增强赋值运算操作的过程是先将两个操作数做运算,然后创建操作符左边的变量,并把运算 结果赋值给操作符左边的变量。 例如,以下代码展示了增强赋值运算操作符“**=”的运算过程。 >>>y =3 >>>x =2 >>>#计算y 的x 次方得到9,然后创建变量y,并把9 赋值给变量y >>>y**=x >>>y 9 3.不同运算的优先级 数字类型的运算操作符很多,同一表达式中出现两个以上运算操作符时,需要考虑运算 的优先顺序。数字类型运算的优先顺序详见表3.2。 表3.2 数字类型运算的优先顺序 运算操作符运算描述 ** 乘方(最高优先级) ~ 按位取反 +、- 求正、取负 *、/、//、% 乘、除、求整商、取余 +、- 加法、减法 >>、<< 右移位、左移位 & 位与 |、^ 位或、位异或 =、%= 、/=、//=、-=、+=、*=、**= 赋值运算、增强赋值运算 其中,运算的优先顺序对应表中行的先后顺序,即排在第一行的乘方运算优先级最高, 排在第二行的按位取反运算优先级次之,……,以此类推,排在最后一行的创建变量及赋值 运算、增强赋值运算优先级最低。 同一行的多个运算优先级相同,表达式中哪个运算先出现哪个运算优先执行。 4.运算结果的类型 数字类型的数据进行运算后,运算结果的数据类型遵循以下三个原则。 ① 整数和浮点数运算,结果是浮点数。 ② 整数或浮点数与复数运算,结果是复数。 ③ 相同类型的数据运算,结果一般保持类型不变;但整数除法例外,结果是浮点数。 3.1.4 内置的数字类型的函数 Python的一个函数可以看作一个小机器人。小机器人必须首先制造,然后使用。对应 ·66· 第3章 基本数据类型.................. Python的代码,制造小机器人的代码就是函数定义代码,使用小机器人的代码就是函数调 用代码。所谓内置函数,就是指函数定义代码集成在Python解释器里的函数。Python使 用者可以直接调用内置函数。 Python主要提供了13个内置的数字类型的函数,这些函数可以分为三大类:数值运 算函数、类型转换函数和类型判断函数。 1.数值运算函数 数值运算函数的用法见表3.3。 表3.3 数值运算函数 函 数描 述 abs(x) 参数是整数或实数时,返回值为绝对值; 参数是复数时,返回值是该复数和其共轭复数的积的平方根 divmod(x,y) 返回值是元组(x//y,x%y) pow(x,y[,z]) 返回值是(x **y)%z,其中,z 是可选参数,z 省略时,函数的返回值为x * *y; 如果同时给三个参数传参,要求三个实参必须都取整数 round(x[,ndigits]) 返回值是对x 精确到ndigits位小数的取值,其中,ndigits是可选参数,其默认值 是0 max(x1,x2,…,xn) 返回x1,x2,…,xn 中的最大值或一个可迭代类型数据的最大元素 min(x1,x2,…,xn) 返回x1,x2,…,xn 中的最小值或一个可迭代类型数据的最小元素 其中,参数指函数名后面圆括号中的内容,返回值对应函数的计算结果。如果把函数类 比为买菜机器人,参数就是钱,返回值就是买回来的菜。 注意: ① 表3.3中,“函数”一列出现的方括号,表示其中的参数在函数调用时,可以设置实 参,也可以不设置。本书后续表中的“函数”列的方括号含义相同。 ② 调用表3.3的round()函数对数据取整时,函数按照“4舍6入5成双”的原则对x 取整。例 如,以下代码及其运行结果就是按照“4舍6入5成双”的原则取整的。 >>>#4 舍 >>>round(2.4) 2> >>#6 入 >>>round(2.6) 3> >>#2 是双数,按照5 成双原则结果为2 >>>round(2.5) 2> >>#4 是双数,按照5 成双原则结果为4 >>>round(3.5) 4 2.类型转换函数 类型转换函数见表3.4。 ·67· Python程序设计———以医药数据处理为例(第....................................2..版..) 表3.4 类型转换函数 函 数描 述 bin(x) 返回x 对应的二进制整数的字符串 oct(x) 返回x 对应的八进制整数的字符串 hex(x) 返回x 对应的十六进制整数的字符串 int(x) 返回x 对应的十进制整数。参数x 可以是浮点数、仅包含数字的数字字符串、二、 八、十六进制数 float(x) 返回x 对应的浮点数。参数x 可以是整数、整数字符串和浮点数字符串 complex(re[,im]) 返回一个复数,实部为re,虚部为im。参数re可以是整数、浮点数、整数字符串、浮 点数字符串和复数字符串;参数im 可以是整数或浮点数,但不能取字符串 表3.4中的6个函数,又叫6个类(6个数据类型)的实例化函数,或者说6个创建类对 象的函数。在Python中,一个数据类型就是一个类,一个数据就是相应数据类型的一个实 例,一个实例还常称作该类的一个对象。例如,整数类型(int)是一个类,而100就是整数类 的一个实例,或者说100是整数类型的一个对象,而int(x)函数就是整数类型的实例化函 数,或者说是创建整数类型对象的函数。 3.类型判断函数 Python内置的类型判断函数是type(x),其返回值是x的类型,参数x可以是Python 支持的所有类型的数据。 例如,以下是两个调用函数type()的例子。 >>>type(3e2) >>>type(abs(3+4j)) 3.1.5 标准库2:math库的使用方法 操作数字类型除了可以使用运算操作符、内置的数字类型的函数之外,还常用数字类型 的标准库———math库。 标准库由负责Python开发和维护的组织PSF开发,随Python解释器一起发布,并且 随Python的安装同步安装于计算机中,因此,math库不需要安装,只需要引入(import)后 即可使用。 math库中主要定义了5个数学常数和44个数值运算函数。 1.math库的常数 math库的常数详见表3.5。 表3.5 math库的常数 常 数数学表示描 述 math.pi π 圆周率,值为3.141592653589793 math.e e 自然常数e,值为2.718281828459045 ·68· 第3章基本数据类型 .................. 续表 常数数学表示描述 math.inf ∞ 正无穷大 math.nan 浮点数类型的一个特殊数据,表示“不是数” math.tau τ 2π,值为6.283185307179586 2.math库的函数 math库总计定义了44个函数,分为数值计算函数、幂对数函数、三角双曲函数和高等 特殊函数4大类。 1)数值计算函数 6。math库的数值计算函数共16个,详见表3. 表3.h库的数值计算函数 6 mat 函数数学表示描述 math.fabs(x) |x| 返回 x 的绝对值,其中, x 是整数或浮点数 math.fmod(x,y) x % y 返回 x 与 y 的模 math.fsum([x,y,…])x+y+… 浮点数精确求和 math.ceil(x) [x] 向上取整,返回不小于 x 的最小整数 math.floor(x) [x] 向下取整,返回不大于 x 的最大整数 math.factorial(x) x! 返回 x 的阶乘,如果 x 是小数或负数,返回ValueEror math.gcd(a,b) 返回a与b的最大公约数 math.frexp(x) x = m *2e 返回(m,e), m 和 e 分别是 x 的二进制表示的尾数和指数。 x 取值为0时,返回(0.0,0) math.ldexp(x,i) x *2i 返回 x *2i 的值,math.frexp(x)函数的逆运算 math.modf(x) 以元组类型返回 x 的小数部分和浮点数形式的整数部分 math.trunc(x) 返回 x 的整数部分 math.copysign(x,y) |x|*|y|/ y 返回用数值 y 的正负号替换数值 x 的正负号得到的数值 math.isclose(a,b) 比较 a 和 b 的相似性,返回True或False math.isfinite(x) 当 x 不是无穷大时,返回True;否则返回False math.isinf(x) 当 x 为正数无穷大或负数无穷大时,返回True;否则返 回False math.isnan(x) 当 x 取值nan时,返回True;否则返回False 2)幂对数函数 7。 math库的幂对数函数共8个,详见表3.3)三角双曲函数 8。 math库的三角双曲函数共16个,详见表3. ·69· Python程序设计———以医药数据处理为例(第2版) ........................................ 表3.h库的幂对数函数 7 mat 函数数学表示描述 math.pow(x,y) xy 返回 x 的 y 次幂 math.exp(x) ex 返回e的 x 次幂,其中e是自然常数 math.expml(x) ex 1 返回e的 x 次幂减1 math.sqrt(x) x 返回 x 的平方根 math.log(x[,base]) logbasex 返回以base为底的 x 的对数值,base省略时,返回 x 的自然对 数值 math.log1p(x) ln(1+x) 返回1+ x 的自然对数值 math.log2(x) log2x 返回 x 的以2为底的对数值 math.log10(x) log10x 返回 x 的以10为底的对数值 表3.h库的三角双曲函数 8 mat 函数数学表示描述 math.degres(x) 返回弧度 x 对应的角度值 math.radians(x) 返回角度 x 对应的弧度值 math.hypot(x,y) x2+y2 返回坐标为(x,y)的点到原点(0,0)的距离 math.sin(x) sinx 返回 x 的正弦函数值, x 是弧度值 math.cos(x) cosx 返回 x 的余弦函数值, x 是弧度值 math.tan(x) tanx 返回 x 的正切函数值, x 是弧度值 math.asin(x) arcsinx 返回 x 的反正弦函数值, x 是弧度值 math.acos(x) arcosx 返回 x 的反余弦函数值, x 是弧度值 math.atan(x) arctanx 返回 x 的反正切函数值, x 是弧度值 math.atan2(y,x) arctany/ x 返回y/ x 的反正切函数值, x 是弧度值 math.sinh(x) sinhx 返回 x 的双曲正弦函数值 math.cosh(x) coshx 返回 x 的双曲余弦函数值 math.tanh(x) tanhx 返回 x 的双曲正切函数值 math.asinh(x) arcsinhx 返回 x 的反双曲正弦函数值 math.acosh(x) arcoshx 返回 x 的反双曲余弦函数值 math.atanh(x) arctanhx 返回 x 的反双曲正切函数值 4)高等特殊函数 9。math库的高等特殊函数共4个,详见表3. ·70· 第3章 基本数据类型.................. 表3.9 math库的高等特殊函数 函 数数学表示描 述 math.erf(x) 2 π∫x 0 e-t2dt 高斯误差函数,应用于概率论、统计学等领域 math.erfc(x) 2 π∫∞ x e-t2dt 余补高斯误差函数,math.erfc(x)=1-math.erf(x) math.gamma(x) ∫∞ 0 xt-1e-xdx 伽马(Gamma)函数,也叫欧拉第二积分函数 math.lgamma(x) ln(gamma(x)) 伽马函数的自然对数 3.1.6 微实例3.1:计算基本统计量 通常,计算基本统计量需要完成两项工作:学习基本统计量的计算公式,编写基本统计 量计算程序。 1.基本统计量计算公式 计算基本统计量主要用到两个公式:均值公式和标准差公式。 1)均值公式 假设一组数据表示为S=s0,s1,…,sn-1,均值公式参见式(3.1)。 mean= Σn-1 i=0 ( si ) n (3.1) 2)标准差公式 假设一组数据表示为S=s0,s1,…,sn-1,标准差公式参见式(3.2)。 dev= Σn-1 i=0 (si - mean)2 n -1 (3.2) 2.基本统计量计算程序 1)程序说明/readme 程序运行后,要求用户以英文逗号为分隔符输入5个数;之后,程序按照公式求均值和 标准差;最后,输出最大值、最小值、均值和标准差4个值。 2)源程序 #微实例3.1.py #Input a, b, c, d, e =eval(input("请输入用逗号分隔的5 个数: ")) #Process mean =(a+b+c+d+e)/5 dev =(((a-mean)**2+(b-mean)**2+(c-mean)**2+(d-mean)**2+(e-mean)**2)/4)**0.5 #Output print("最大值为: ", max(a, b, c, d, e)) print("最小值为: ", min(a, b, c, d, e)) print("平均值为: ", mean) ·71· Python程序设计———以医药数据处理为例(第....................................2..版..) print("标准差为: ", dev) 3)运行示例 程序运行后,屏幕显示如下。 请输入用逗号分隔的5 个数: 1, 2, 3, 4, 5 最大值为: 5 最小值为: 1 平均值为: 3.0 标准差为: 1.5811388300841898 3.2 字符串类型及其操作 字符串类型及其操作主要包括以下6方面内容。 ① 字符串类型的概念。 ② 字符串类型的表示。 ③ 字符串类型的运算操作符。 ④ 内置的字符串类型的函数。 ⑤ 案例:查找化合物ID及水溶性值。 ⑥ 内置的字符串类型的方法。 3.2.1 字符串类型的概念 计算机由早期的主要用于数值计算,到现在更多地用于信息处理,字符串类型发挥了巨 大的作用。Python程序中,字符串类型的应用极其广泛,如药品的名称、种类、包装单位、中 国药品电子监管码,以及化合物的序号、分类、InChIKey(化合物的身份证)、SMILES码等, 在Python程序中的数据类型都是字符串类型。 字符串类型中有一类特殊的字符串,其字符都是数字字符,这种字符串叫数字字符串。 学号和大多数的身份证号就是常见的数字字符串。数字字符串不同于数字类型的数据,前 者仅用于标识,不用于加、减、乘、除等数字类型的运算。注意区分数字字符串和数字类型的 数据。 Python字符串类型的数据是由一对引号作为定界符、一组字符按照特定顺序构成的序 列。字符串类型的数据有两个显著特征,具体如下。 ① 字符串数据由字符组成,其中的字符既可以是中英文文字,也可以是数字字符、空格 或其他特殊符号。例如,"生石膏15~30g(先煎)"、"01"和"A01\n"是三个Python合法的 字符串类型的数据。 ② 字符串数据中的字符是有序的。Python支持两种字符串索引:正向索引和反向索 引,如图3.1所示。 其中,正向索引从0开始编号,图3.1所示字符串共14个字符,最后一个字符的索引号 为13;反向索引从-1开始编号,最后一个字符的索引号为-14。每个字符都有两个索引 号:正向索引号和反向索引号。如图3.1中的“空格”字符的索引号是7和-7。 ·72· 第3章 基本数据类型.................. 图3.1 Python的字符串索引 3.2.2 字符串类型的表示 在Python中书写字符串类型的数据时,需要用一对单引号' '或者一对双引号"",或者 一对三引号(三个单引号或三个双引号构成一个三引号)作为定界符,括起字符串中的所有 字符。其中,单引号和双引号的作用相同,三引号字符串常用作多行注释语句。 例如,一个程序中包含以下6行代码,6行代码总体构成1个多行注释语句。 ''' 清肺排毒汤处方组成: 麻黄9g、炙甘草6g、杏仁9g、生石膏15~ 30g (先煎)、 桂枝9g 、泽泻9g 、猪苓9g、白术9g、茯苓15g、 柴胡16g、黄芩6g 、姜半夏9g、生姜9g、紫菀9g 、 冬花9g、射干9g、细辛6g、山药12g、枳实6g 、陈皮6g、藿香9g ''' 字符串类型的数据可以用于创建变量并为变量赋值,也可以作为一个数据项出现在表 达式中,这一点和数字类型的数据相同。 例如,运行以下语句后创建变量s,并为s赋值一个字符串类型的数据。 s="麻黄9g、炙甘草6g、杏仁9g、生石膏15~30g(先煎)、桂枝9g、泽泻9g、\ 猪苓9g、白术9g、茯苓15g、柴胡16g、黄芩6g、姜半夏9g、生姜9g、紫菀9g、\ 冬花9g、射干9g、细辛6g、山药12g、枳实6g、陈皮6g、藿香9g" 注意:由于这个字符串是处方信息,包含的字符个数较多,书写时采用Python续行符 “\”把一条长语句分写在三行,这里的续行符“\”并不是s字符串中的字符。 输出和书写字符串类型的数据时需要注意以下三个问题。 ① 调用print()函数输出字符串类型的数据时,作为定界符的引号不显示在屏幕 上。例如,print("hi")语句运行后,屏幕上只显示“h”和“i”两个字符,引号不会出现在 屏幕上。 ② 书写内含引号的字符串时,单引号、双引号和三引号要配合使用,以确保作为定界符 的引号和字符串内含的引号不同。例如,拟在屏幕上输出字符串“Shesaid"Hi,Jacky", thenshesmiled.”,正确的Python语句为 print('She said "Hi, Jacky", then she smiled.') 或者 print('''She said "Hi, Jacky", then she smiled.''') 其中,由于双引号是字符串内含的字符,因此定界符引号只能采用单引号或三引号。 ·73· Python程序设计———以医药数据处理为例(第....................................2..版..) ③ 转义符问题。 Python中,反斜杠“\”用作转义符,即反斜杠“\”用于和特定的字符组合构成新的字符, 这些新字符往往具有特殊的含义。例如,“\t”是1个字符,表示制表符;“\n”表示换行符, “\r”表示将光标定位到当前行的行首,“\b”表示将光标回退1位,“\0”表示其后续的字符不 输出等。 如果字符串数据内含反斜杠作为正常字符,而不是用作转义符,就需要书写两个反斜杠 表示一个反斜杠字符。 例如,以下代码中,x字符串中的反斜杠用作转义符;y字符串中的反斜杠是正常字符。 >>>#\t 表示制表位 >>>x ="c:\tese" >>>print(x) c:ese >>>#\\表示一个反斜杠字符 >>>y ="c:\\tese" >>>print(y) c:\tese 3.2.3 字符串类型的运算操作符 Python提供了5个字符串类型的运算操作符(见表3.10),分别是连接、复制、成员运 算、按索引号取字符(即字符引用)和切片。 表3.10 字符串类型的运算操作符 运算表达式描 述 x+y 连接两个字符串x 与y,返回得到的新字符串 x*n或n*x 复制n 次字符串x,返回得到的新字符串 xins 如果x 是s 的子串,则返回True,否则返回False str[i] 按索引号取字符(即字符引用),返回索引号为i 的字符 str[start:end[:step]] 字符串切片 1.连接 Python的连接运算符是“+”,连接运算返回将两个字符串连接而成的新字符串。 例如,以下代码将三个字符串进行连接,返回由三个字符串连接而成的新字符串。 >>>"Xu" +"chang" +"qing" 'Xuchangqing' 2.复制 Python的复制运算符是“*”,复制运算返回字符串重复连接若干次形成的新字符串。 例如,以下代码返回一个字符串复制三次形成的新字符串。 >>>'紫菀'* 3 '紫菀紫菀紫菀' 3.成员运算 Python的成员运算符是“in”,用来判断一个子串是否在另一个字符串中,若在,则返回 ·74· 第3章 基本数据类型.................. True,否则返回False。 例如,以下代码使用成员运算判别“桂枝”和“人参”是否在字符串formula中。 >>>formula ="麻黄9g、炙甘草6g、杏仁9g、桂枝9g、泽泻9g、\ 猪苓9g、白术9g、茯苓15g、柴胡16g、黄芩6g、姜半夏9g、\ 冬花9g、射干9g、细辛6g、山药12g、枳实6g、陈皮6g、藿香9g" >>>"桂枝" in formula True >>>"人参" in formula False 4.按索引号取字符(字符引用) Python采用str[i]实现按索引号取字符,其中,str是字符串常量、字符串变量或返回 值是字符串的表达式,i是索引号,返回值是索引号等于i的字符。str[i]就是索引号为i的 字符的引用形式。 例如,以下代码分别求字符串'PubChemSearch'中索引号为5和索引号为-7的字符。 >>>'PubChem Search'[5] 'e' >>>'PubChem Search'[-7] ' ' 5.字符串切片 字符串切片通过两个索引号确定一个取值范围,并按照一定的步长在确定的范围内取 字符,最后返回取得的所有字符构成的子串。 字符串切片的语法为 [[start]:[end]:[step]] 其中,start和end对应两个索引号,由这两个索引号对应的两个字符构成一个左闭右 开的区间,这个区间就是字符的取值范围;step是步长值,是非0整数。 字符串切片的运行过程主要包括两步:方向一致性判别和取字符。 1)方向一致性判别 切片操作首先根据step的值确定第1个方向,确定方法是:如果step大于0,方向为从 左到右,反之方向为从右到左;然后,从start对应的字符开始扫描字符串,直到end对应的 字符结束扫描,扫描行进的方向为第2个方向。若两个方向不一致,则切片运算返回空串; 否则进入第二步,即取字符。 2)取字符 取字符的具体过程为:以start的值为索引号取第1个字符,以start+step的值为索引 号取第2个字符,……,以此类推,以start+(i-1)×step的值为索引号取第i 个字符,当索 引号对应的字符达到或越过end对应的字符时,停止取字符,end对应的字符和越过end的 字符不取,返回之前取得的所有字符组成的字符串。 注意:start省略或start取值超出索引号范围,表示开始取字符没有限制;end省略或 end取值超出索引号范围,表示结束取字符没有限制;step省略表示step值为1。 例如,以下代码展示了三次字符串切片运算的结果。 >>>s ='PubChem Search' ·75· Python程序设计———以医药数据处理为例(第....................................2..版..) >>>#以下step 为1,第1 个方向为左→右,字符r 到字符C 的方向为右→左,结果为空串 >>>s[-3:3] '' >>>#以下step 为1,第1 个方向为左→右,字符C 到字符r 的方向为左→右,两个方向一致 >>>s[3:-3] 'Chem Sea' >>>#step 为-1,第1 个方向为右→左,开始、结束没限制,从右到左无限制取字符 >>>s[::-1] 'hcraeS mehCbuP' 其中,最后一次切片运算是常用的求字符串的逆序串的方法。 字符串切片常用于从一个长字符串中截取特定的子串,编程截取子串的方法分为以下 三步。① 确定子串首字符在长字符串中的索引号,作为切片操作的start的值。 ② 按照子串中相邻字符在长串中的索引号的间距确定step的值。 ③ 确定子串尾字符在长字符串中的索引号,用这个索引号加step的值作为切片操作的 end的值。从而书写出切片表达式。 例如,从"PubChemSearch"中截取子串"Chem"时,切片表达式的构造过程如下。 ① 子串"Chem"的首字符"C"在长串中的索引号是3和-11,因此,切片操作start的取 值为3或-11。 ②"Chem"相邻字符在长串中的索引号相差1,所以step取值为1。 ③ 子串"Chem"的尾字符“m”在长串中的索引号是6和-8,seep的值是1,因此,切片 操作end的取值为7或-7。 从"PubChemSearch"中截取子串"Chem"的切片表达式及表达式的运算结果如下。 >>>"PubChem Search"[3:7] 'Chem' >>>"PubChem Search"[-11:7] 'Chem' >>>"PubChem Search"[3:-7] 'Chem' >>>"PubChem Search"[-11:-7] 'Chem' 3.2.4 内置的字符串类型的函数 Python解释器主要提供了4个内置的字符串类型的函数,参见表3.11。 表3.11 内置的字符串类型的函数 函 数描 述 len(x) 返回字符串x 的字符个数 str(x) 返回任意类型x 所对应的字符串形式 chr(x) 返回Unicode编码为x 的单字符 ord(x) 返回单字符对应的Unicode编码 注意:第1个函数len(x)求字符串x的字符个数时,由于Python3以Unicode字符为 ·76· 第3章 基本数据类型.................. 计数单位,因此英文字符和中文字符都算1个字符。另外,"\t""\n""\b""\r""\0""\ 123"等特殊字符也算1个字符。 3.2.5 微实例3.2:查找化合物ID 及水溶性值 1.程序说明/readme 从数据文件中读出的水溶性数据是一个长字符串,调用print()函数展示在屏幕上如 图3.2 化合物水溶性数据展示 图3.2所示。 由图3.2可见,第一行是标题行,其余每行对应一个化合 物,每个化合物的信息共25个字符(包括换行符)。从列的角 度看,第1列是化合物的序号,第2列是化合物的ID,第3列 是化合物的水溶性值。 本程序的功能为:用户从键盘输入1个化合物的序号,程 序查找并输出相应化合物的ID及其水溶性值。 2.源程序 #微实例3.2.py #input #使用赋值语句输入solubilityTxt 的值 solubilityTxt ="SN,IdentityNo,Solubility\n01,LT-615-348, 0.019714\n\ 02,LT-771-215,0.03072346\n03,LT-771-216,0.03174257\n\ 04,LT-323-560,0.06074634\n05,LT-619-512,0.10491267" #从键盘输入1 个序号赋值给变量sn sn =input("Please input the serial number(01-05):") #Process #序号为int(sn)的化合物,其子串的首字母的索引号为int(sn)* 25 pos =int(sn)* 25 #id 对应的子串,从当前位置后的第3 个字符开始,长度为10 id =solubilityTxt[pos+3:pos+13] #水溶性值对应的子串,从当前位置后的第15 个字符开始,长度为10 sValue =float(solubilityTxt[pos+15:pos+25]) 3.运行示例 程序运行后,屏幕显示如下。 Please input the serial number(01-05): 02 the compound ID is: LT-771-215 the solubility value is: 0.03072346 3.2.6 内置的字符串类型的方法 所谓方法,通俗地讲就是打包在类中的函数,其调用语法和函数的调用语法相似,仅有 一点不同:即调用方法时,方法名前必须有“.”,“.”之前必须有类或对象。内置方法指的是 定义语句集成在Python解释器里的方法,Python使用者可以直接调用内置方法。 Python解释器总计内置了43个字符串类型的方法。下面分别从常用的字符串方法和 str.format()方法两方面进行介绍。 ·77· Python程序设计———以医药数据处理为例(第2版) ........................................ 1.常用的字符串方法 12 。 常用的字符串方法约有17个,见表3. 表3.常用的字符串方法 12 方法描述 str.lower() 返回字符串str的副本,副本中的字符全部采用小写字母 str.upper() str.islower() 返回字符串str的副本,副本中的字符全部大写 判别字符串str中的字符是否都是小写,若是,则返回True;否则 返回False str.isprintable() 判别字符串str中的字符是否都是可打印字符,若是,则返回 True;否则返回False str.isnumeric() 判别字符串str中的字符是否都是数字字符(包括中文的数字零 一、二、三等),若是,则返回True;否则返回False str.ispace() str.endswith(sufix[,start[,end]]) 判别字符串str中的字符是否都是空白,若是,则返回True;否则 返回False。 注意:Python中的空白包括空格和"\r""\t""\n"等特殊字符 判别字符串切片str[start:end]是否以sufix的值结尾,若是,则 返回True;否则返回False。 若start和end省略则判断整个字符串str是否以sufix的值结尾 判别字符串切片str[start:end]是否以prefix的值开头,若是,则 st.trsih(peix[,trt[,nd]])返回True;否则返回False。 rsatwtrfsae若start和end省略则判断整个字符串str是否以prefix的值开头 st.plt(enxplt1)以sep的值为分隔符切分str,得到若干子串,返回由这些子串组rsisp=Noe,masi= 成的列表 返回切片str[start:end]中sub的值出现的次数。st.onssae rcut(ub[,trt[,nd]]) 若start和end省略则返回整个字符串str中sub的值出现的次数 返回str的副本,其中前count个old值的子串被替换为new值的st.epae(lecut]) rrlcod,nw[,on 子串。如果count省略,则替换所有old值的子串 返回str值居中、总宽度为width值、两侧用filchar值填充的新字st.etr(ith[,flchr]) rcnewdia 符串 返回str的副本,其中,左右两侧的chars值的字符被删除st.ticas]) rsrp([hr 返回str值左边补0后总宽度为width值的新字符串 st.fl(it rziwdh) 返回由str值连接iterable值中所有元素形成的新字符串 st.oieal rjin(trbe) 在切片str[tt:d]中查找sub值的子串,若找到,则返回第一 st.id(ub[,trt[,end]]) 次找到的sub(s) 值(a) 第一(e) 个字符的索引;(n) (r) 若找不到,则返回-1。 若start和end省略则在整个字符串str中查找sub值对应的子串 rfnssa 在切片str[start:end]中查找sub值的子串,若找到,则返回第一 次找到的sub值第1个字符的索引;若找不到,则终止程序并st.nesb[,tred]]) ridx(usat[,n 报错。 若start和end省略则在整个字符串str中查找sub值对应的子串 其中,相对常用的7个字符串方法应用的例子如下。 ·78· 第3章 基本数据类型.................. 1)str.lower()方法的例子 >>>s1 ="Drug" >>>s1.lower() 'drug' 2)str.isspace()方法的例子 >>>#Python 中的空白包括空格、\r、\t、\n 等特殊字符 >>>" \r \t \n".isspace() True >>>#空串不是空格串,空串中不包含任何字符 >>>"".isspace() False 3)str.split()方法的例子 >>>tanreqing ="黄芩、熊胆粉、山羊角、金银花、连翘" >>>herbs =tanreqing.split("、") >>>herbs ['黄芩', '熊胆粉', '山羊角', '金银花', '连翘'] 4)str.join(iterable)方法的例子 >>>#iterable 的元素必须是字符串类型 >>>herbs=['黄芩', '熊胆粉', '山羊角', '金银花', '连翘'] >>>"、".join(herbs) '黄芩、熊胆粉、山羊角、金银花、连翘' 5)str.replace()方法的例子 >>>tanreqing ="黄芩、熊胆粉、山羊角、金银花、连翘" >>>#str.replace()方法返回新的字符串,原字符串不变 >>>tanreqing.replace(" 、", ",") '黄芩,熊胆粉,山羊角,金银花,连翘' >>>tanreqing.replace(",", "") '黄芩熊胆粉山羊角金银花连翘' >>>tanreqing '黄芩、熊胆粉、山羊角、金银花、连翘' 6)str.strip()方法的例子 >>>#键盘输入数据时,前后各输入一个空格 >>>CpId =input("please input a compound ID: ") please input a compound ID: LT-615-348 >>>CpId ' LT-615-348 ' >>>#调用CpId.strip()方法去除字符串前后的空格,用返回值新串再次创建CpId 并赋值新串 >>>CpId =CpId.strip() >>>CpId 'LT-615-348' 7)str.find()方法的例子 >>>formula ="麻黄9g、炙甘草6g、杏仁9g、生石膏15~30g" >>>formula.find("、") 4 ·79· Python程序设计———以医药数据处理为例(第....................................2..版..) 2.str.format()方法 str.format(paras)方法首先按照str中槽的规定格式化参数paras得到子串,然后用子 串替换str中对应的槽,返回得到的str的副本。 例如,下面是一条调用str.format(paras)方法的语句及其运行结果。 >>>"计算化合物分子量时{}的占用率为{: .2%}".format("cpu", 0.1) '计算化合物分子量时cpu 的占用率为10.00%' 在这条调用语句中,str为"计算化合物分子量时{}的占用率为{:.2%}",str中共有两 个槽,分别是{}和{:.2%};paras共有两个参数,分别是"cpu"和0.1。这里,str.format (paras)方法的调用过程为:首先,用{}格式化参数"cpu",由于这个槽没有格式要求,得到 子串为"cpu";用{:.2%}格式化参数0.1时,由于这个槽要求取对应参数的保留2位小数的 百分数形式,所以得到子串为"10.00%";接下来用得到的两个子串替换掉str中对应的两个 槽,得到str的副本字符串为'计算化合物分子量时cpu的占用率为10.00%';最后,str.format (paras)方法返回str的这个副本字符串'计算化合物分子量时cpu的占用率为10.00%'。 str.format(paras)方法的调用格式为 <模板字符串str>.format(<逗号分隔的参数paras>) 其中,<模板字符串> 包括需原样返回的多个字符和若干个槽,槽规定如何格式化 参数。下 面重点介绍槽的构造方法,并举例说明槽的用法。 1)槽的构造方法 槽一般写作下面的形式: {参数序号:格式控制标记} 其中,花括号是槽的定界符,不可省略;参数序号可以省略,表示槽与参数按序号一一对 应;“:”是格式引导符,后续只要有格式控制标记,冒号便不可以省略;格式控制标记规定如 何格式化相应参数,依次包括“填充”“对齐”“宽度”“,”“.精度”和“类型”6个字段的值。 注意:书写格式控制标记时,6个字段都是可选项,可以组合6个字段中的若干字段使 用,但必须遵循表3.13中字段的先后顺序。 表3.13 格式控制标记的字段 填 充对 齐宽 度, .精度类 型 默认用空 格填充 <左对齐 >右对齐 ^居中对齐 默认数字类型右 对齐;字符串类型 左对齐 槽的设定输出宽 度,对应格式化参 数得到的子串的 字符总数 数字类型的千位 分隔符,适用于整 数和浮点数 有效数字位数 或小数位数 或字符串的最大 长度 整数类型: b,c,d,o,x,X; 浮点数类型: e,E,f,% 其中,整数的6种格式的含义如下。 ① b:二进制整数形式。 ②c:Unicode码为该整数的字符。 ·80· 第3章 基本数据类型.................. ③ d:十进制整数形式。 ④ o:八进制整数形式。 ⑤ x:十六进制小写形式。 ⑥ X:十六进制大写形式。 浮点数的4种格式的含义如下。 ①e:类科学记数法表示形式,其中的“e”小写。 ② E:类科学记数法表示形式,其中的“E”大写。 ③f:浮点数的十进制表示形式。 ④ %:浮点数的百分数形式。 2)str.format()调用的例子 以下是6次调用str.format()方法的例子,注意观察模板字符串和槽的设置与返回值 字符串之间的对应关系。 >>>#1)参数序号省略,表示槽与参数按序号一一对应 >>>#“.2”表示保留2 位小数,“%”表示浮点数的百分数形式 >>>"计算化合物分子量时{}的占用率为{: .2%}".format("cpu", 0.1) '计算化合物分子量时CPU 的占用率为10.00%' >>>from math import pi >>>pi 3.141592653589793 >>>#2)填充符号为空格、右对齐、宽度为15 个字符、有效数字位数为5 >>>"{: >15.5}".format(pi) ' 3.1416' >>>#3)填充符号为*、右对齐、宽度为15 个字符、有效数字位数为5 >>>"{: *>15.5}".format(pi) '*********3.1416' >>>#4)填充符号为*、右对齐、宽度为15 个字符、有效数字位数为变量effD 的值 >>>effD =5 >>>"{0: *>15.{1}}".format(pi, effD) '*********3.1416' >>>#5)填充符号为*、右对齐、宽度为15 个字符、小数位数为5 >>>"{: * >15.5f}".format(pi) '********3.14159' >>>strPi =str(pi) >>>strPi '3.141592653589793' >>>#6)填充符号为*、右对齐、宽度为15 个字符、字符串最大长度为5 >>>"{: *>15.5}".format(strPi) '**********3.141' 3)str.format()方法的简写形式 Python程序中,调用str.format()方法还常常采用简写形式,由原调用形式转换为简写 形式的方法如下。 原调用形式: ·81· Python程序设计———以医药数据处理为例(第....................................2..版..) <模板字符串str>.format(<逗号分隔的参数paras>) 简写形式: f<模板字符串str> 在简写形式中,槽中的参数序号转变为对应的参数引用。 以下是一个同时使用两种形式调用str.format()方法的例子。 >>>pi=3.1415926 >>>effD =5 >>>"{0:*>15.{1}}".format(pi, effD) '*********3.1416' >>>f"{pi:*>15.{effD}}" '*********3.1416' 3.3 案例3-1:清肺排毒汤处方展示 格式化展示清肺排毒汤的处方通常需要完成以下三项工作。 ① 明确清肺排毒汤处方展示要求。 ② 设计清肺排毒汤处方展示算法。 ③ 编写清肺排毒汤处方展示程序。 3.3.1 清肺排毒汤处方展示要求 中药已有数千年历史,是中华民族的智慧结晶,是我国的宝贵财富之一。在新型冠状病 毒疫情肆虐期间,中药对预防和治疗新型冠状病毒疫情发挥了重要的作用,其中有一剂名方 叫“清肺排毒汤”。 清肺排毒汤是由我国汉代张仲景所著《伤寒杂病论》中的多个经典方剂优化组合而成 的,处方共计包含21味草药,如图3.3所示。 图3.3 清肺排毒汤处方展示样例 这种清肺排毒汤处方的展示方式具有4个特点。 ① 处方名称字符串“清肺排毒汤”居中显示在第一行。 ② 每行显示4味草药,每味草药的信息占13个英文字符宽度。 ③ 每行下面有一个空行。 ④ 最后一味草药的信息单独显示。 ·82·