本章导学
上一节
下一节
第5章 字符串
【本章导读】
Python内置了一系列的数据类型,其中最主要的内置类型是数值类型、文本序列(字符串)类型、序列(列表、元组和range)类型、集合类型、映射(字典)类型。本章在介绍字符串、列表、元组和range类型共有的通用序列操作方法的基础上,详细讲解字符串类型的创建、表示、字符串遍历、字符串操作、字符串处理方法和格式化等内容。并以random库的一些应用为例讲授字符串的实际应用,同时进一步加强流程控制语句的相关知识的应用训练。
【本章要点】
● 序列数据类型
字符串: 'Hello', '1024'
列表: [1, 2, 3], ['Tom', 99]
元组:(1,), (5, 10, 20), ('Tom', '100')
Range:range(100), range(5, 100, 5)● 通用序列操作方法
s = 'Hello' t = 'Python' print(s[1]) # e,索引 print(s[1:4]) # ell,切片 print(s + t) # HelloPython,拼接 print(s * 3) # HelloHelloHello,重复 if 'e' in s: # 成员测试 print(True) # True
● 字符串的创建与表示
s = 'Hello' t = "Python" r = """测试语句""" 单引号: '允许包含有 "双" 引号' 双引号: "允许包含有 '单' 引号"。 三重引号: '''三重单引号''', """三重双引号"""
● 字符串的遍历
for c in 'Hello': print(c)
● 字符串序列的操作
# 字符串常量
string.ascii_letters: ascii_lowercase 和 ascii_uppercase 常量的拼连
string.ascii_lowercase:小写字母 'abcdefghijklmnopqrstuvwxyz'
string.ascii_uppercase:大写字母 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.digits:字符串 '0123456789'。
string.hexdigits:字符串 '0123456789abcdefABCDEF'。
string.octdigits:字符串 '01234567'。
string.punctuation:由在 C 区域设置中被视为标点符号的 ASCII 字符所组成的字符串: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
string.printable:由被视为可打印符号的 ASCII 字符组成的字符串。 这是 digits, ascii_letters, punctuation 和 whitespace 的总和。
string.whitespace:由被视为空白符号的 ASCII 字符组成的字符串。 其中包括空格、制表、换行、回车、进纸和纵向制表符。# 自定义字符串格式化
str.format() 方法
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | digit+]
attribute_name ::= identifier
element_index ::= digit+ | index_string
index_string ::= <any source character except "]"> +
conversion ::= "r" | "s" | "a"
format_spec ::= <described in the next section>● 字符串序列处理方法
str.capitalize()返回原字符串的副本,其首个字符大写,其余为小写 str.title()返回原字符串的标题版本,其中每个单词第一个字母为大写,其余字母为小写 str.casefold()返回原字符串消除大小写的副本。 消除大小写的字符串可用于忽略大小写的匹配。 str.center(width[, fillchar])返回长度为 width 的字符串,原字符串在其正中。 使用指定的 fillchar 填充两边的空位 str.count(sub[, start[, end]])返回子字符串 sub 在 [start, end] 范围内非重叠出现的次数。 str.encode(encoding='utf-8', errors='strict')返回原字符串编码为字节串对象的版本。 默认编码为 'utf-8'。 str.endswith(suffix[, start[, end]])如果字符串以指定的 suffix 结束返回 True,否则返回 False。 str.expandtabs(tabsize=8)返回字符串的副本,其中所有的制表符会由一个或多个空格替换,具体取决于当前列位置和给定的制表符宽度 str.find(sub[, start[, end]])返回子字符串 sub 在 s[start:end] 切片内被找到的最小索引 str.index(sub[, start[, end]])类似于 find(),但在找不到子类时会引发 ValueError。 str.format(*args, **kwargs)执行字符串格式化操作
str.isalnum()如果字符串中的所有字符都是字母或数字且至少有一个字符,则返回 True , 否则返回 False str.isalpha()如果字符串中的所有字符都是字母,并且至少有一个字符,返回 True ,否则返回 False str.isascii()如果字符串为空或字符串中的所有字符都是 ASCII ,返回 True ,否则返回 False str.isdecimal()如果字符串中的所有字符都是十进制字符且该字符串至少有一个字符,则返回 True , 否则返回 False str.isdigit()如果字符串中的所有字符都是数字,并且至少有一个字符,返回 True ,否则返回 False str.isidentifier()如果字符串是有效的标识符,返回 True str.islower()如果字符串中至少有一个区分大小写的字符 4 且此类字符均为小写则返回 True ,否则返回 False str.isnumeric()如果字符串中至少有一个字符且所有字符均为数值字符则返回 True ,否则返回 False str.isprintable()如果字符串中所有字符均为可打印字符或字符串为空则返回 True ,否则返回 False str.isspace()如果字符串中只有空白字符且至少有一个字符则返回 True ,否则返回 False str.istitle()如果字符串中至少有一个字符且为标题字符串则返回 True str.isupper()如果字符串中至少有一个区分大小写的字符 4 且此类字符均为大写则返回 True ,否则返回 False
str.join(iterable)返回一个由 iterable 中的字符串拼接而成的字符串 str.ljust(width[, fillchar])返回长度为 width 的字符串,原字符串在其中靠左对齐 str.lower()返回原字符串的副本,其所有区分大小写的字符 4 均转换为小写 str.upper()返回原字符串的副本,其中所有区分大小写的字符 4 均转换为大写 str.lstrip([chars])返回原字符串的副本,移除其中的前导字符 str.maketrans(x[, y[, z]])此静态方法返回一个可供 str.translate() 使用的转换对照表 str.translate(table)返回原字符串的副本,其中每个字符按给定的转换表进行映射 str.partition(sep)在 sep 首次出现的位置拆分字符串,返回一个 3 元组 str.split(sep=None, maxsplit=- 1)返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串 str.splitlines([keepends])返回由原字符串中各行组成的列表,在行边界的位置拆分 str.startswith(prefix[, start[, end]])如果字符串以指定的 prefix 开始则返回 True,否则返回 False str.strip([chars])返回原字符串的副本,移除其中的前导和末尾字符 str.swapcase()返回原字符串的副本,其中大写字符转换为小写,反之亦然 str.zfill(width)返回原字符串的副本,在左边填充 ASCII '0' 数码使其长度变为 width
str.removeprefix(prefix, /)如果字符串以 前缀 字符串开头,返回 string[len(prefix):] 。否则,返回原始字符串的副本 str.removesuffix(suffix, /)如果字符串以 后缀 字符串结尾,并且 后缀 非空,返回 string[:-len(suffix)] 。否则,返回原始字符串的副本: str.replace(old, new[, count])返回字符串的副本,其中出现的所有子字符串 old 都将被替换为 new。 如果给出了可选参数 count,则只替换前 count 次出现。 str.rfind(sub[, start[, end]])返回子字符串 sub 在字符串内被找到的最大(最右)索引,这样 sub 将包含在 s[start:end] 当中 str.rindex(sub[, start[, end]])类似于 rfind(),但在子字符串 sub 未找到时会引发 ValueError str.rjust(width[, fillchar])返回长度为 width 的字符串,原字符串在其中靠右对齐。 使用指定的 fillchar 填充空位 str.rpartition(sep)在 sep 最后一次出现的位置拆分字符串,返回一个 3 元组 str.rsplit(sep=None, maxsplit=- 1)返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串 str.rstrip([chars])返回原字符串的副本,移除其中的末尾字符
# 自定义字符串格式化
● 字符串的格式化输出
str.format()
格式字符串包含有以花括号 {} 括起来的“替换字段”。
不在花括号之内的内容被视为字面文本,会不加修改地复制到输出中。
如果你需要在字面文本中包含花括号字符,可以通过重复来转义: {{ and }}
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | digit+]
attribute_name ::= identifier
element_index ::= digit+ | index_string
index_string ::= <any source character except "]"> +
conversion ::= "r" | "s" | "a"
format_spec ::= <described in the next section>
替换字段开头可以用一个 field_name 指定要对值进行格式化并取代替换字符被插入到输出结果的对象。
field_name 之后有可选的 conversion 字段,它是一个感叹号 '!' 加一个 format_spec,并以一个冒号 ':' 打头
format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= digit+
grouping_option ::= "_" | ","
precision ::= digit+
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
'<' 强制字段在可用空间内左对齐(这是大多数对象的默认值)。
'>' 强制字段在可用空间内右对齐(这是数字的默认值)。
'=' 强制在符号(如果有)之后数码之前放置填充。 这被用于以 '+000000120' 形式打印字段。 这个对齐选项仅对数字类型有效。 这是当 '0' 紧接在字段宽度之前时的默认选项。
'^' 强制字段在可用空间内居中。
类型含意
'b' 二进制格式。 输出以 2 为基数的数字。
'c' 字符。在打印之前将整数转换为相应的unicode字符。
'd' 十进制整数。 输出以 10 为基数的数字。
'o' 八进制格式。 输出以 8 为基数的数字。
'x' 十六进制格式。 输出以 16 为基数的数字,使用小写字母表示 9 以上的数码。
'X' 十六进制格式。 输出以 16 为基数的数字,使用大写字母表示 9 以上的数码。 在指定 '#' 的情况下,前缀 '0x' 也将被转为大写形式 '0X'。
'n' 数字。 这与 'd' 相似,不同之处在于它会使用当前区域设置来插入适当的数字分隔字符。
None 和 'd' 相同。
float 和 Decimal 值的可用表示类型有:
'e' 科学计数法。 对于一个给定的精度 p,将数字格式化为以字母 'e' 分隔系数和指数的科学计数法形式。 系数在小数点之前有一位,之后有 p 位,总计 p + 1 个有效数位。 如未指定精度,则会对 float 采用小数点之后 6 位精度,而对 Decimal 则显示所有系数位。 如果小数点之后没有数位,则小数点也会被略去,除非使用了 # 选项。
'E' 科学计数法。 与 'e' 相似,不同之处在于它使用大写字母 'E' 作为分隔字符。
'f' 定点表示法。 对于一个给定的精度 p,将数字格式化为在小数点之后恰好有 p 位的小数形式。 如未指定精度,则会对 float 采用小数点之后 6 位精度,而对 Decimal 则使用大到足够显示所有系数位的精度。 如果小数点之后没有数位,则小数点也会被略去,除非使用了 # 选项。
'F' 定点表示。 与 'f' 相似,但会将 nan 转为 NAN 并将 inf 转为 INF。
'g' 常规格式。 对于给定精度 p >= 1,这会将数值舍入到 p 个有效数位,再将结果以定点表示法或科学计数法进行格式化,具体取决于其值的大小。 精度 0 会被视为等价于精度 1。准确的规则如下:假设使用表示类型 'e' 和精度 p-1 进行格式化的结果具有指数值 exp。 那么如果 m <= exp < p,其中 m 以 -4 表示浮点值而以 -6 表示 Decimal 值,该数字将使用类型 'f' 和精度 p-1-exp 进行格式化。 否则的话,该数字将使用表示类型 'e' 和精度 p-1 进行格式化。 在两种情况下,都会从有效数字中移除无意义的末尾零,如果小数点之后没有余下数字则小数点也会被移除,除非使用了 '#' 选项。如未指定精度,会对 float 采用 6 个有效数位的精度。 对于 Decimal,结果的系数会沿用原值的系数数位;对于绝对值小于 1e-6 的值以及最小有效数位的位值大于 1 的数值将会使用科学计数法,在其他情况下则会使用定点表示法。正负无穷,正负零和 nan 会分别被格式化为 inf, -inf, 0, -0 和 nan,无论精度如何设定。
'G' 常规格式。 类似于 'g',不同之处在于当数值非常大时会切换为 'E'。 无穷与 NaN 也会表示为大写形式。
'n' 数字。 这与 'g' 相似,不同之处在于它会使用当前区域设置来插入适当的数字分隔字符。
'%' 百分比。 将数字乘以 100 并显示为定点 ('f') 格式,后面带一个百分号。
None 对于 float 来说这类似于 'g',不同之处在于当使用定点表示法时,小数点之后将至少显示一位。 所用的精度会大到足以精确表示给定的值。对于 Decimal 来说这相当于 'g' 或 'G',具体取决于当前 decimal 上下文的 context.capitals 值。总体效果是将 str() 的输出匹配为其他格式化因子所调整出的样子。● random库的应用
簿记功能 random.seed(a=None, version=2) 初始化随机数生成器
用于字节数据的函数 random.randbytes(n)生成 n 个随机字节
整数用函数 random.randrange(stop)random.randrange(start, stop[, step]),从 range(start, stop, step) 返回一个随机选择的元素 random.randint(a, b)返回随机整数 N 满足 a <= N <= b。相当于 randrange(a, b+1)。 random.getrandbits(k)返回具有 k 个随机比特位的非负 Python 整数
序列用函数 random.choice(seq)从非空序列 seq 返回一个随机元素。 如果 seq 为空,则引发 IndexError。 random.choices(population, weights=None, *, cum_weights=None, k=1)从*population*中选择替换,返回大小为 k 的元素列表。 如果 population 为空,则引发 IndexError。 random.shuffle(x[, random])将序列 x 随机打乱位置。 random.sample(population, k, *, counts=None)返回从总体序列或集合中选择的唯一元素的 k 长度列表。 用于无重复的随机抽样。
实值分布 random.random()返回 [0.0, 1.0) 范围内的下一个随机浮点数。 random.uniform(a, b)返回一个随机浮点数 N ,当 a <= b 时 a <= N <= b ,当 b < a 时 b <= N <= a 。 random.triangular(low, high, mode)返回一个随机浮点数 N ,使得 low <= N <= high 并在这些边界之间使用指定的 mode 。 random.betavariate(alpha, beta)Beta 分布。 参数的条件是 alpha > 0 和 beta > 0。 返回值的范围介于 0 和 1 之间。 random.expovariate(lambd) 指数分布。 lambd 是 1.0 除以所需的平均值,它应该是非零的。 random.gammavariate(alpha, beta) Gamma 分布。 ( 不是 gamma 函数! ) 参数的条件是 alpha > 0 和 beta > 0。 random.gauss(mu, sigma) 正态分布,也称高斯分布。 mu 为平均值,而 sigma 为标准差 random.lognormvariate(mu, sigma)对数正态分布 random.normalvariate(mu, sigma)正态分布 random.vonmisesvariate(mu, kappa)冯·米塞斯分布 random.paretovariate(alpha)帕累托分布。 alpha 是形状参数。 random.weibullvariate(alpha, beta)威布尔分布。 alpha 是比例参数,beta 是形状参数。

本章课件

