Python与医药数据处理 第三章

第三章 基本数据类型

3.1 数字类型及操作

3.1.1 数字类型的表示

  • 整数的表示:
    整数在Python中的数据类型为int
    十进制数不需要引导符,直接写正负号和十进制数字
    二进制整数由0b或0B引导,字母大小写完全等价,后接二进制数
    八进制整数由0o或0O引导,字母大小写完全等价,后接八进制数
    十六进制整数由0x或0X引导,字母大小写完全等价,后接八进制数
    Python 整数的取值范围理论上为 \([- \infty , + \infty ]\),但实际上是受计算机内存制约和决定的

  • 浮点数的表示:
    浮点数在Python中的数据类型为float

    虽然课本中没有介绍,但如果能够明白浮点数是什么,为什么不直接称其为“实数”或“小数”的一系列问题,可以更好地理解与其相关的很多问题,当然,如果不能理解,直接记忆结论,也不会带来任何问题

    事实上,float类型的数据在计算机中都由32位二进制数存储,这里面的信息包括:正负号,数字串,有效数位。

    通俗地讲,就是给定一串二进制数,并告诉你正负号和小数点在二进制数中的位置,来记录实数。因此,它的记数逻辑是先有一串数字,再在特定位置上点上小数点,与我们常规思维中的先写整数部分,再写小数点,最后写小数部分的逻辑不同。电脑中的存储方式,数字的位数是确定的,而小数点是不定的,可以移动的,因此我们称这类数字为“浮点数”。

    正因此,带来了新的问题,这种存储方式不能准确地记录数据,存在精度与误差的概念。同时,小数点的浮动导致数字的有效数位不同,也就是精度不同,对于精度不同的数字,在进行运算的过程中有它相应的修约规则,这就导致了所谓的浮点数运算误差:

    >>>0.1+0.2
    0.30000000000000004
    

    浮点数有两种表示方法:十进制法、类科学计数法:
    十进制法:就是我们日常书写的小数、实数格式
    类科学计数法:把一个浮点数表示为 \(a \times 10^{n}\) 的类科学计数法,在计算机中则记为aen或aEn,如68e4 8.6E-5
    浮点数可以表示的范围很大,但受到计算机系统影响,存在最大值,可以利用 sys 库中sys.float_info查看
    img

  • 复数的表示:
    复数在Python中的数据类型为complex

    Python中复数的格式为a+bj,其中 \(a\),\(b\) 均为浮点数,如1.25e-6+5.68e+9j是一个合法的复数

    复数在Python中以class的模式存储,我们可以用命令z.real z.imag来获取实部和虚部
    print(z)输出命令输出复数是,外面会携带一个括号,返回(a+bj)
    对虚数使用abs()函数(绝对值函数),返回复数的模

3.1.2 数字类型的运算

  • 基本运算操作符:
    img

    求正数和负数的运算+ -只需要一个操作数,称为一元运算操作符,其他需要两个操作数的运算操作符,称为二元运算操作符

    其中关于结合性的这部分,左结合意味着同级符号从左往右结合,如1+2+3先计算1+2,再进行+3操作。而乘方等运算为右结合,即同级符号从右往左结合,如1**2**3,先进行右边的2**3,再计算1**(2**3的结果)

  • 增强赋值运算操作符:
    通用格式为a <操作符>= b,等价于a = a <操作符> b,目的是记法简便,如a += b,即相当于a = a + b

  • 运算操作符的优先级:
    img
    表格中一些位运算相关的运算符事实上我们接触不多,常用的大致按优先顺序可分为五个层组:乘方,正负,乘除,加减,赋值

  • 运算结果的类型:
    整数 和 浮点数:浮点数
    整数/浮点数 和 复数:复数
    相同类型之间:一般保持类型不变(除了整数的除法运算,结果为浮点数)

3.1.3 Python内置函数

  • 数值运算函数:
    abs(x):取绝对值
    divmod(x, y):返回元组(x // y, x % y)
    pow(x, y[, z]):返回x ** y % z,如 \(z\) 缺省,直接返回乘方计算值
    round(x[, ndigits]):返回对 \(x\) 精确到 \(ndigits\) 位的小数,缺省时默认保留到整数,保留时遵守“四舍六入五成双”的规则
    max(x1, x2, ...):求最大值
    min(x1, x2, ...):求最小值

  • 类型转换函数:
    bin(x):返回 \(x\) 对应二进制整数的字符串(注意是字符串!)
    oct(x):返回 \(x\) 对应八进制整数的字符串(注意是字符串!)
    hex(x):返回 \(x\) 对应十六进制整数的字符串(注意是字符串!)
    int(x):返回 \(x\) 对应的十进制整数(注意不是字符串!)
    float(x):返回 \(x\) 对应的浮点数(注意不是字符串!)
    complex(re[, im]):返回一个实部为 \(re\) 虚部为 \(im\) 的复数,\(re\) 可以是整数、浮点数及整数字符串、浮点数字符串、复数字符串,但\(im\) 只能是整数或浮点数
    img

3.1.4 math 库的使用方法

  • 常数:
    math.pi:\(\pi\)
    math.e:\(e\)
    math.inf:\(\infty\)

  • 数值计算函数(选取可能比较实用的部分函数):
    math.fsum[x, y, ...]:浮点数精确求和
    math.ceil(x):向上取整
    math.floor(x):向下取整
    math.gcd(a, b):求最大公约数
    math.pow(x, y):\(x^y\)
    math.exp(x):\(e^x\)
    math.log(x[, base]):\(log_{base}x\),当 \(base\) 缺省时,默认计算自然对数(\(base = 10\))
    math.sin(x) math.cos(x) math.tan(x):三角函数,无需多言
    math.asin(x) math.acos(x) math.atan(x):反三角函数,无需多言

3.2 字符串类型及操作

3.2.1 存储方式

  • 字符串的索引号:
    字符串,顾名思义,就是将一系列字符像串珠子一样穿在一起,形成一个有序的串,我们可以从串中提取其中的一个字符,也可以在串上以一个字符为单位进行操作、修改
    img
    如图,从正向顺序来看,第一个字符的编号为 0,随后依次递增,范围为 \(0 \sim length-1\)
    其次,从反向逆序来看,倒数第一个编号为 -1,随后往前依次递减,范围为 \(-1 \sim -length\)
    例如,在如图字符串中,s[7]与s[-7]均指向空格 (空元素),s[8]与s[-6]均指向字母S
    其中的编号就称为索引号

3.2.2 表示方式

  • 定界符:
    书写字符串类型的数据时,需要用一对单引号'abc'或一对双引号"abc"或一对三引号('''abc'''或"""abc""")来包括其内容,三引号一般用于多行注释语句,定界符在输出时不会出现在屏幕上
    如果输出内容中需要包含引号,单引号、双引号、三引号就需要混合交错使用,如输出:

    abc"def"ghi

    应使用命令:print('abc"def"ghi') 或 print(```abc"def"ghi```) 即内容中的引号类别应与外侧界定符相异,避免冲突

  • 转义符:
    反斜杠 \ 引导转义符,\n 表示换行符,\t 表示制表符,\0 表示后续不输出,\r表示光标回退至行首,并且每输出一个新的字符就覆盖掉原先该位置的内容,\b表示光标回退1位,各转义符效果展示如下:
    (PS:后面两个语句在我的本地 IDLE 里跑不出正确结果,是配置在 VSCode 里的 Python 环境的运行结果的截图)
    img
    img
    img
    imgimg
    imgimg
    那么很显然,在这种情况下,如果我们在输出文本里会有\n等内容出现时,会和转义符发生冲突,那么我们在输入此类内容时,应当使用\\表示一个反斜杠字符

    PS:我们在 2.1.2 就提到过 \ + 空格键 用来在语句太长时续行,要注意辨析

    img
    有一种情况需要注意,当反斜杠与后面的字符不构成转义符时,当我们使用\\或\时,均代表一个斜杠
    img

3.2.3 运算操作符

  • 连接符 "+"
    返回由多个字符串按先后顺序连接后得到的字符串:

    >>>"abc" + "def" + "ghi"
    'abcdefghi'
    
  • 复制符 "*"
    格式为 s * num 或 num * s,s 为字符串,\(num\) 为复制次数,最终返回的结果为 \(num\) 个字符串 s 相接的新字符串:

    >>>"abc" * 3
    'abcabcabc'
    
  • 成员运算 in
    格式为 chr in s 其中 chr 为字符,s 为字符串,用于判断字符元素 chr 是否在串 s 中,返回值为 \(True\) 或 \(False\):

    >>>s = "abc123"
    >>>'a' in s
    True
    >>>'4' in s
    False
    
  • 索引取元素与切片
    <string>[i] 提取单个字符
    <string>[[start]:[end]:[step]] 切片,三个参数分别为起始索引、终止索引(左闭右开)、步长
    切片的具体过程:方向一致性判别、取字符
    其中在第一个过程中,如果起止方向与步长方向不一致,则返回空串

    P.S. 若 \(start\) 缺省或超出索引号范围,表示开始取字符无限制(从头开始);若 \(end\) 缺省或超出索引号范围,表示结束取字符无限制(至尾结束)若 \(step\) 缺省,默认步长取1

3.2.4 内置函数

len(x) 返回字符串长度(字符个数)
str(x) 将其他类型的变量x转换为字符串形式并返回
chr(x) x为Unicode编码,将其转化为对应的字符并返回
ord(x) 返回字符对应的Unicode编码

注意后两个函数的主体是unicode编码与字符,而不是字符串
常用Unicode编码:' ' -- 32 , 'A' ~ 'Z' -- 65 ~ 90 , 'a' ~ 'z' -- 97 ~ 122

3.2.5 内置方法

简要介绍8个常用方法:
str.lower() str.upper() 将字符串全部转化为小写/大写
str.isspace() 判断字符串是否都为空白(空白包括 \r \t \n)
str.split(sep = None, maxsplit = -1) 以 \(sep\) 的值切分 \(str\) 得到若干字串,返回由这些子串组成的列表
str.join(iterable) 以 \(str\) 连接 \(iterable\) 列表(元素必须为字符串)中的元素,并形成新的字符串
str.replace(old, new[, count]) 返回 \(str\) 的副本(即原字符串不受改变),前 \(count\) 个 \(old\) 字串替换为 \(new\) 串
str.strip() 删除 \(str\) 最前和最后各一个字符
str.count(sub[, start[, end]]) 返回 str[start : end] 切片中 \(sub\) 子串的出现次数。若 \(start\) 与 \(end\) 缺省,则在全串中从头到尾检索
str.find(sub[, start[, end]]) 返回 str[start : end] 切片中 \(sub\) 子串第一次出现时的第一个字符的索引,若找不到,返回 -1。若 \(start\) 与 \(end\) 缺省,则在全串中从头到尾检索

详细介绍1个format()方法:
通用格式:

"text{[序号]:[填充符][对齐][宽度][,][.精度][类型]}text".format(c1, c2, ...)

{}及其内的部分称为槽,是嵌在文本内的内容,通过控制其中的参数来控制槽中内容的格式
一个槽对应 format(c1, c2, ...) 括号内的一个变量,这些变量都有相应的序号,依次为0, 1, 2,槽的格式内标明序号,就可以将槽和变量对应起来
[填充符]:如果输出的内容长度小于宽度,就用填充符补全
[对齐]:< 左对齐,> 右对齐,^ 居中
[宽度]:即规定的槽的内容的长度
[,]:是否需要千分位分隔符,有则需要,无则不需要
[.精度]:有效数字位数(若后续类型为科学计数法) / 小数位数(若后续类型为普通浮点数) / 字符串最大长度(若变量内容本身即为字符串)
[类型]:整数六种:b二进制,d十进制,o八进制,x十六进制小写,X十六进制大写,cUnicode码;浮点数4种:e类科学计数法(小写),E类科学计数法(大写),f浮点数十进制,%浮点数百分数

如 "{:*>15.5}".format{strPi} 填充符号为 *,右对齐,宽度15,字符串最大长5(对字符串截取前五个字符)
如 "{0:*>15.{1}}".format(pi, effD),输出格式化后的 \(pi\) 格式化要求为:填充符*,右对齐,宽度15,\(effD\) 位有效数字输出

该方法的简写:
f<模板字符串str>
如 "{0:*>15.{1}}".format(pi, effD),亦可写作:
f"{pi:*>15.{effD}}"

3.3 逻辑类型及操作

3.3.1 逻辑类型

逻辑类型数据只由两个:\(True\) 和 \(False\)

3.3.2 逻辑类型运算符

逻辑二元运算有三个,分别为and or not,中文名称分别为“与”、“或”、“非”,运算优先级为 not > and > or

3.3.3 返回值为逻辑类型的运算(判断运算符)

<=:小于等于; <:小于; >:大于; >=:大于等于; ==:等于; !=:不等于
is:是; is not:不是
in:是成员; not in:不是成员
not and or

这些运算符都是判断运算符,若判断的结果为正确,则运算返回 \(True\) 值,否则返回 \(False\)

字符串的大小比较:从两个字符串的第一个字符开始,比较Unicode码大小,大者其字符串则大;若相同,则比较下一位,直到比出为止

大小比较的连写:1>2<3>5 只要有一处符号处的比较结果为假则该表达式结果即为假;全部符号比较结果皆为真,原表达式结果才为真

大小比较符在不同类型的数据之间一般不能使用,如字符串和数字不能比较(浮点数与整数除外,因为本质都是数字的类型,这个其实也很好理解)。但是等于和不等于可以用在不同类型数据之间,两个数据类型都不相同的变量,那么他们的关系肯定是不等于

3.4 混合运算中的优先级

**(乘方)
+ -(求正负数)
* / % //(乘除)
+ -(加减)
<= < > >= == != is is not in not in(判断)
not(非)
and(与)
or(或)
= %= /= //= -= += *= **=(赋值与加强赋值)

posted @ 2025-06-18 22:58  凛凛雾  阅读(78)  评论(0)    收藏  举报