oeasy python 124 字符串操作与序列类通用方法
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
序列_字符串_string_str
回忆
- 配套视频
- 上次我们用 元组 做了两个应用
- 欢乐颂
- 大写数字
- 元组 和 列表 都是 序列

- 用 元组 不用列表的原因是
- 元组 是 不可变的(immutable)
- 更适合 表示 固定的序列
- 元组 比 列表 占用更少内存
- 还有 啥 序列类型 呢?🤔
字符串
- 序列 序列
- 有序的排列
- 在 python3 的在线文档中

- 字符串 是 字符的序列
in 是否包含
"o" in "oeasy"
"oe" in "oeasy"
"os" in "oeasy"
"os" not in "oeasy"
- 如果 有元素 在里面
- 就返回 True
- 否则
- 返回 False

加法运算
-
初始化
s1 = "oeasy"
s2 = "o2z" -
序列运算加法
s1 + s2
-
两个字符串拼接

- 和列表一样

- 元组呢?
元组加法
(0) + (1)
- 没有逗号
- 经历了 自动解包

-
打上逗号
(0,) + (1,)
-
就没有问题了

乘法
s2 * 2
- 乘法 是 加法的累积

- 和列表 一样

- 和元组 也一样

复杂运算
s1 = "oeasy"
s2 = "o2z"
3 * s1 + s2
3 * (s1 + s2)
- 结果

- 关于字符串
- 还有 一种 拼合方式
- 就是 两个字符串常量 直接拼
拼接字符序列常量

- 用空格拼接字符序列
- 非常快速

- 但是
- 这个仅仅限于字符串常量

- 如果是 变量
- 就不行了
索引
s = "oeasy"
- 我们当初 学索引
- 就是从 字符串开始的

- 正向索引没有问题
- 逆向呢?
逆向索引
- 开头
- 索引是 0
- 头尾相连后
- 倒数第1
- 是 -1
|----|----|----|----|----|
| 0 | 1 | 2 | 3 | 4 |
| o | e | a | s | y |
| -5 | -4 | -3 | -2 | -1 |

- 规律 和 列表 一样的
- 切片呢?
切片
|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 |
| o | e | a | s | y |
s = "oeasy"
s[1:2]
s[1:3]
s[1:4]
s[1:5]
- 切片的因素
- start
- stop
- 前闭后开

- 负数切片怎么做呢?
负数切片
- 先选择范围
- 控 开始位置
- start
- 5 - 4 = 1
- 控 结束位置
- stop
- 5 - 1 = 4
|----|----|----|----|----|
| 0 | 1 | 2 | 3 | 4 |
| o | e | a | s | y |
| -5 | -4 | -3 | -2 | -1 |
s[-4:-1]
s[1:4]
- 果断下刀!

- 想用 负数序号 切到 尾巴?
放手
s[-4:]
- 就把 stop位置 彻底放开

切片步长 step
s[0:5:2]
s[0:5:3]
s[0:5:4]
s[0:5:5]
- 步长步长
- 一步有多长

- 步长可以为负数么?
切片步长为负数
s[::-1]
- 步长为负数
- 倒着走

- 字符串 翻转了
- 好像 reverse 了
倒背如流
-
反转效果
s1 = "分久必合,合久必分"
s1[::-1] -
这样子
- 一本书倒背如流也很简单啊

- 再来试试
道德经

s = "道可道非恒道"
- 想要截取
恒道
思考

- 有几种方式 可以切出"恒道" 呢?
单字
- 如果 只截 一"道"字
- 有
几种截取方法呢?

- 一个字符 还构成字符串 么?
单字字符串
s[2]
type(s[2])
- 串上 只有 一个鸡排

- 但也算 鸡排串

- 单字符的字符串是一种特殊情况
python之禅
- Special cases aren't special enough to break the rules.
- 特殊情况 不足以打破规则

- 单字符的字符串
- 有点特殊 但还是字符串
- 空串
- 更特殊 依然还是 字符串
长度、最大最小值
- 这些函数 字符序列都支持
- 长度 len
- 最大值 max
- 最小值 min

- 大小比的是 ascii 序数
-
ord 函数
ord("a")
ord("y") -
可以用 index
- 找出 字符的 索引位置 吗?
index 索引位置
s = "oeasyo2z"
s.index("o")
s.index("o", 1)
s.index("o", 6)
- 找出"oeasy"中
- "o"的位置

count 计数
s = "打南边来了个喇嘛,手里提拉着五斤鳎目。打北边来了个哑巴,腰里别着个喇叭。南边提拉鳎目的喇嘛要拿鳎目换北边别喇叭哑巴的喇叭。哑巴不愿意拿喇叭换喇嘛的鳎目,喇嘛非要换别喇叭哑巴的喇叭。喇嘛抡起鳎目抽了别喇叭哑巴一鳎目,哑巴摘下喇叭打了提拉鳎目的喇嘛一喇叭。也不知是提拉鳎目的喇嘛抽了别喇叭哑巴一鳎目,还是别喇叭哑巴打了提拉鳎目的喇嘛一喇叭。喇嘛炖鳎目,哑巴嘀嘀嗒嗒吹喇叭。"
s.count("喇嘛")
s.count("鳎目")
s.count("哑巴")
s.count("喇叭")
- 不但可以 统计单个字符
- 也可以 统计多个字符

回顾

平行赋值(parallel assignment)
- 字符串 也可以 平行赋值

- 两边数量 必须相等

总结
- 这次复习了 字符序列
- 也就是 字符串
- 字符序列 和 列表、元组一样
- 序列的东西他全能用
- in
- 加法、乘法运算
- 索引
- 切片
- index
- len
- max
- min
- 都属于序列
- 有序的排列
- 可以用 序列的 方法操作

- 有
无序的容器 吗??🤔 - 下次再说 👋
- 配套视频