目录

  • 1 Python语言基础
    • 1.1 本章导学
    • 1.2 Python概述
    • 1.3 人机交互
    • 1.4 对象与变量
    • 1.5 编码与命名规范
    • 1.6 注释
    • 1.7 实践指导
      • 1.7.1 Python解释器的安装
      • 1.7.2 Pycharm的安装与基本使用
    • 1.8 项目实训
      • 1.8.1 日期格式化输出
      • 1.8.2 欢迎入学
      • 1.8.3 整数四则运算
    • 1.9 作业
    • 1.10 编程训练
  • 2 数值类型与数值运算
    • 2.1 本章导学
    • 2.2 数值类型
    • 2.3 数值类型转换
    • 2.4 数值运算
    • 2.5 常用数学运算函数
    • 2.6 Math模块及其应用
    • 2.7 实践指导
      • 2.7.1 计算矩形面积
      • 2.7.2 一元二次方程求解
      • 2.7.3 换披萨
    • 2.8 作业
    • 2.9 编程训练
    • 2.10 项目实训
      • 2.10.1 计算弓形的面积
      • 2.10.2 地球数据计算
      • 2.10.3 学费计算
  • 3 流程控制
    • 3.1 本章导学
    • 3.2 流程控制
    • 3.3 常用运算
      • 3.3.1 真值测试
      • 3.3.2 比较运算
      • 3.3.3 成员运算
      • 3.3.4 布尔运算
      • 3.3.5 身份运算
    • 3.4 循环结构
      • 3.4.1 Range
      • 3.4.2 for 循环
        • 3.4.2.1 for循环(上)
        • 3.4.2.2 for循环实例
        • 3.4.2.3 for循环(下)
      • 3.4.3 while循环
    • 3.5 分支结构
    • 3.6 流程跳转
    • 3.7 else子句
    • 3.8 异常处理
    • 3.9 实践指导
      • 3.9.1 兔子繁殖问题
      • 3.9.2 九九乘法表
      • 3.9.3 百钱百鸡
      • 3.9.4 计算圆周率
      • 3.9.5 百分制转五分制
      • 3.9.6 输出与3无关的数
      • 3.9.7 自身以外的最大因数
      • 3.9.8 判断素数
      • 3.9.9 百钱百鸡进阶
      • 3.9.10 最小公倍数
      • 3.9.11 最大素数
      • 3.9.12 四则运算
      • 3.9.13 正整数A+B
    • 3.10 作业
    • 3.11 编程训练
    • 3.12 项目实训
      • 3.12.1 古代数学问题
      • 3.12.2 个人所得税计算器
      • 3.12.3 计算圆周率
  • 4 函数与模块化编程
    • 4.1 本章导学
    • 4.2 函数定义、调用与返回值
    • 4.3 参数传递
    • 4.4 变量作用域
    • 4.5 匿名函数
    • 4.6 递归函数
    • 4.7 实践指导
      • 4.7.1 阶乘函数定义
      • 4.7.2 素数判定函数
      • 4.7.3 幂函数的定义
      • 4.7.4 简单计算器
      • 4.7.5 回文素数
    • 4.8 作业
    • 4.9 编程训练
    • 4.10 项目实训
      • 4.10.1 来自计算机的问候
      • 4.10.2 自定义数学函数模块
      • 4.10.3 神奇的素数
  • 5 字符串
    • 5.1 本章导学
    • 5.2 序列通用操作
      • 5.2.1 字符串通用操作
      • 5.2.2 索引
      • 5.2.3 切片
      • 5.2.4 序列拼接与重复
      • 5.2.5 成员测试
    • 5.3 字符串创建与字符常量
    • 5.4 字符串与文件遍历
    • 5.5 常用字符串处理方法
    • 5.6 字符串格式化
    • 5.7 random模块及应用
    • 5.8 实践指导
      • 5.8.1 字符串索引百分制转五分制
      • 5.8.2 回文字符串判断
      • 5.8.3 输出身份信息
      • 5.8.4 约瑟夫环问题
      • 5.8.5 温度转换
      • 5.8.6 字符分类统计
      • 5.8.7 凯撒加密
      • 5.8.8 遍历输出文件
      • 5.8.9 隐私数据处理
      • 5.8.10 猜数游戏
      • 5.8.11 模拟验证码
      • 5.8.12 模拟产生微软序列号
    • 5.9 作业
    • 5.10 编程训练
    • 5.11 项目实训
      • 5.11.1 信息加密与解密
      • 5.11.2 文本分析
      • 5.11.3 日期分析处理
      • 5.11.4 单词猎手游戏
  • 6 序列类型
    • 6.1 本章导学
    • 6.2 元组
    • 6.3 列表
      • 6.3.1 列表的创建
      • 6.3.2 列表的更新
      • 6.3.3 列表元素的删除
      • 6.3.4 列表排序
      • 6.3.5 列表赋值与复制
      • 6.3.6 列表推导式
      • 6.3.7 列表常用内置函数
      • 6.3.8 列表嵌套及排序
    • 6.4 实践指导
      • 6.4.1 成绩统计分析
      • 6.4.2 二维列表的排序
      • 6.4.3 自幂数
      • 6.4.4 蒙特卡洛模拟圆周率
      • 6.4.5 文件中数据统计分析
      • 6.4.6 读取Excel文件中的证券数据
      • 6.4.7 读取csv文件中的数据
      • 6.4.8 读取SQLite数据库中的数据
    • 6.5 作业
    • 6.6 编程训练
    • 6.7 项目实训
      • 6.7.1 分配学号
      • 6.7.2 葡萄酒评论分析报告
      • 6.7.3 模拟生成身份信息并查验身份
  • 7 集合与映射类型
    • 7.1 本章导学
    • 7.2 集合类型
      • 7.2.1 集合创建
      • 7.2.2 集合操作
      • 7.2.3 集合运算
    • 7.3 映射类型
      • 7.3.1 字典的创建
      • 7.3.2 获取字典数据
      • 7.3.3 修改字典值
      • 7.3.4 字典排序
    • 7.4 实践指导
      • 7.4.1 奇特的四位数
      • 7.4.2 特殊的生日
      • 7.4.3 二进制IP转十进制
      • 7.4.4 手机销售分析
      • 7.4.5 通讯录的查询与更新
      • 7.4.6 查询首都
      • 7.4.7 词频统计
    • 7.5 作业
    • 7.6 编程训练
    • 7.7 项目实训
      • 7.7.1 大学排行榜分析
      • 7.7.2 简易英汉字典
      • 7.7.3 股票分析
  • 8 文件操作
    • 8.1 本章导学
    • 8.2 文件概述
    • 8.3 文件打开与关闭
    • 8.4 文件读写操作
    • 8.5 文件的应用
      • 8.5.1 CSV与JSON文件
      • 8.5.2 文件与文件夹操作
    • 8.6 NumPy文件操作
    • 8.7 实践指导
      • 8.7.1 读取文件
      • 8.7.2 读文件统计成绩
      • 8.7.3 pandas读文件统计成绩
      • 8.7.4 csv转json
      • 8.7.5 json转csv
      • 8.7.6 csv与json互转-pandas
      • 8.7.7 从多文件中提取数据汇总
      • 8.7.8 numpy读写文件
      • 8.7.9 numpy数据分析
      • 8.7.10 pandas数据分析
    • 8.8 作业
    • 8.9 编程训练
    • 8.10 项目实训
      • 8.10.1 ​词频统计
      • 8.10.2 批量文件处理与格式转换
  • 9 数据可视化
    • 9.1 本章导学
    • 9.2 基本线型图
    • 9.3 函数绘图
    • 9.4 数据绘图
      • 9.4.1 读两列数据绘图
      • 9.4.2 读多列数据绘图
      • 9.4.3 二列数据绘制多条曲线
    • 9.5 作业
    • 9.6 编程训练
    • 9.7 项目实训
      • 9.7.1 ​科学实验数据可视化
      • 9.7.2 金融数据可视化
      • 9.7.3 中英文词云
  • 10 实践与训练资源
    • 10.1 在线编程训练
    • 10.2 教师资源
本章导学

第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 是形状参数。



本章课件