智泊Python--Day7

智泊Python–Day7

  Day7 全部围绕字符串(str)展开。字符串是 Python 里最高频的数据类型,也是「不可变类型」的代表——一旦创建就不能改其中某个字符。这一天的重点是三块:

  • ① 字符串的基本操作(索引、切片、拼接、乘法、成员判断)
  • ② 字符串的常用内置方法(统计、大小写、查找、拆分/合并/替换等)
  • ③ 进阶的转义、编码解码、对齐、前后缀判断

  最后用两道作业把方法串起来实战。

 

1.字符串的基本操作

  字符串用引号包裹(单/双/三引号都行)。关键点:str 是不可变类型,所以 s[0] = "A" 会直接报错。索引和列表一致(s[0] 正序、s[-1] 倒序);切片 s[start:stop:step] 同样适用,其中 s[::-1] 是经典的「逆序」写法。字符串之间可以用 + 拼接、* 重复,in 判断子串是否属于它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 字符串的基本操作

# str : 引号包裹的就是字符串 " "

# 创建字符串
s = "你好,这里是空指针"
print(s)
print("=" * 20)

# 索引
print(s[0])
print(s[1])
print(s[2])
print("=" * 20)

# 长度
print(len(s)) # 9(中文每个字算一个字符)
print("=" * 20)

# 循环
for i in s:
print(i)
print("=" * 20)

for i in range(len(s)):
print(s[i])
print("=" * 20)

for i, j in enumerate(s):
print(i, j)
print("=" * 20)

# 修改字符串:str是不可变类型
# s[0] = "A" # 报错,str是不可变类型,不能修改字符串中的字符
# print(s)

# 切片
s = "ABCDEFGHI"
print(s[:4]) # ABCD
print(s[4:]) # EFGHI
print(s[2:4]) # CD
print(s[2:7:2]) # CEG
print(s[::-1]) # IHGFEDCBA(逆序,原笔记注释 IHGFEDCBAA 为笔误,已修正)
print("=" * 20)

# 加法(拼接)
s = "你好,这里是空指针"
s += ",请多指教"
print(s)

# 乘法(重复)
s = "你好,这里是空指针"
s *= 3
print(s)
print("=" * 20)

# 成员(子串判断)
if "空" in s:
print("空指针" in s)

if "指针" in s:
print("指针" in s)

 

2.字符串的基本功能1

  这一节是字符串方法的「主力军」。分几类记:统计类 count();内容判断类 isupper()/islower()/isdigit()/isalpha()/isalnum()/istitle()/isspace()(这类返回 True/False,面试常考);大小写转换 upper()/lower()/title()/swapcase()(都返回新字符串,原串不变);类型转换 int()/float();查找 find()/rfind()(找不到返回 -1,比 index() 更安全);最后是拆分/合并/替换 三件套 split()/join()/replace()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# count() 统计子串出现次数
s = "hell hello hell"
print(s.count("hell")) # 3
print(s.count("o")) # 1
print(s.count("ll", 8, 10)) # 在索引 8-10 之间,ll 出现次数 → 0
print("=" * 20)

# 内容判断 (掌握)
# 大写判断
s = "ABC"
print(s.isupper()) # True(是否都是大写字母)
# 小写判断
s = "abc"
print(s.islower()) # True(是否都是小写字母)
# 数字判断
s = "123"
print(s.isdigit()) # True(是否都是数字)
# 字母判断
s = "a1b2c3"
print(s.isalpha()) # False(含数字)
# 字母数字判断
s = "a1b2c3"
print(s.isalnum()) # True(是否都是字母或数字)
# 首字母是否大写判断
s = "Hello World"
print(s.istitle()) # True(每个单词首字母大写)
# 是否为空白字符串
s = ""
print(s.isspace()) # False(空串不是空白串;isspace 要真有空格/制表符等)
print("=" * 20)

# 大小写转换(都返回新字符串,不改原串)
s = "hello world"
print(s.upper()) # HELLO WORLD
print(s.lower()) # hello world
print(s.title()) # Hello World
print(s.swapcase()) # HELLO WORLD
print("=" * 20)

# 整数 / 浮点数转换
s = "123"
print(int(s)) # 123
print(type(int(s))) # <class 'int'>
s = "3.14"
print(float(s)) # 3.14
print(type(float(s))) # <class 'float'>
print("=" * 20)

# 查找
# find() 第一次出现的索引,没有返回 -1
# rfind() 最后一次出现的索引,没有返回 -1
s = "hello world hello world"
print(s.find("ll")) # 2
print(s.find("ll", 8, 10)) # -1
print(s.rfind("ll")) # 14
print(s.rfind("ll", 8, 10)) # -1
print("=" * 20)

  练习部分把上面方法组合起来用。练习 1 重点是「用 find() + len() 取子串」「用切片逆序」;练习 2 重点是 split()(按分隔符拆成列表)、join()(把列表拼回字符串)、replace()(替换子串,返回新串)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 练习1
# 1.已知字符串:"this is a test of Python"
s = 'this is a test of Python'
# a.统计该字符串中字母s出现的次数:count()
print(s.count("s")) # 3
# b.取出子字符串"test",用切片,不能数:使用find(),len()
print(s[s.find("test"):s.find("test") + len("test")]) # "test"
# c.采用不同的方式将字符串倒序输出:切片,循环
print(s[::-1]) # "nohtyP fo tset a si siht"
s2 = ""
len_s = len(s)
for i in range(len_s):
s2 += s[len_s - 1 - i] # 从末尾往前拼(原笔记末尾的 + "" 多余,已去掉)
print(s2)
print("=" * 20)

# 练习2
# 拆分,合并,替换
# 拆分-分割 split() 默认按空格拆分
s = "ikun is very very very handsome"
print(s.split())
# ['ikun', 'is', 'very', 'very', 'very', 'handsome']
# 拆分-分割 split() 可以指定拆分的字符
s = "ikun is-very-very-very-handsome"
print(s.split("-"))
# ['ikun is', 'very', 'very', 'very', 'handsome']
# 首字符拆分,前面会有一个空字符串
print(s.split("ikun")) # ['', ' is-very-very-very-handsome']
print("=" * 20)

# splitlines() 按行拆分 等效于 split("\n")
s = '''床前明月光,
疑是地上霜,
举头望明月,
低头思故乡.'''
print(s.splitlines())
# ['床前明月光,', '疑是地上霜,', '举头望明月,', '低头思故乡.']
print("=" * 20)

# 合并 join()
n = ['床前明月光,', '疑是地上霜,', '举头望明月,', '低头思故乡.']
print("\n".join(n)) # 用换行把列表拼成多行字符串
print("=" * 20)

# 替换 replace()
s = "ikun is very very very handsome"
s2 = s.replace("ikun", "onenull")
print(s) # "ikun is very very very handsome"(原串不变)
print(s2) # "onenull is very very very handsome"(新串)
print("=" * 20)

 

3.字符串的基本功能2

  进阶方法。\ 是转义字符——让本有特殊语义的字符「失效」(如 \n 换行、\\ 表示反斜杠本身)。Windows 路径里全是反斜杠,写起来很烦,所以用 r-string(r"...")让所有转义失效,原样保留。encode() 把字符串变成字节序列(bytes),decode() 反之,是「存储/网络传输」绕不开的一步。ord()/chr() 是字符与 ASCII 码互转;strip()/lstrip()/rstrip() 去首尾空白;center/ljust/rjust 做对齐;startswith()/endswith() 判断前后缀。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# b'' : 字节
# f'' : f-string

# 转义字符 \ 让有语义的字符失去语义
# \\ : 转义反斜杠
s = 'c:\\users\Administrator' # \u 在单引号里会被当转义,打印时显示为 c:\users\Administrator
print(s)
print("=" * 20)
# r'' : 让字符串中的转义字符失去语义(原始字符串,写路径神器)
s1 = r'c:\users\Administrator'
print(s1)
print("=" * 20)

# 编码和解码
s = "你好,中国"
# encode() 编码:字符串 => 二进制序列 可指定 encode("utf-8") / encode("gbk")
s1 = s.encode() # 默认 utf-8
print(s1) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\xad\xe5\x9b\xbd'(原笔记注释 b'hello world' 为笔误,已修正)
print("=" * 20)
# decode() 解码:二进制序列 => 字符串 同理 decode("utf-8") / decode("gbk")
s2 = s1.decode()
print(s2) # 你好,中国
print("=" * 20)

# ASCII码(了解)
print(ord("a")) # 97(字符 -> 编码)
print(chr(97)) # a(编码 -> 字符)

# strip() 去掉字符串首尾的空格(strip("字符") 可指定去掉首尾的某字符)
s = " hello world "
print(s.strip()) # hello world
print("=" * 20)
# lstrip() 去掉字符串左侧的空格
# rstrip() 去掉字符串右侧的空格

# 对齐方式(了解)
print("hello world".center(20)) # 居中(总长20)
print("hello world".ljust(20)) # 左对齐
print("hello world".rjust(20)) # 右对齐
print("=" * 20)

# 前缀 startswith() 检查字符串是否以指定的前缀开头
print("hello world".startswith("hello")) # True
print("hello world".startswith("world")) # False
print("=" * 20)

# 后缀 endswith() 检查字符串是否以指定的后缀结尾
print("hello world".endswith("world")) # True
print("hello world".endswith("hello")) # False
print("=" * 20)

 

4.作业

  两道综合题。第 1 题串起 swapcase()、isdigit()、字典计数(注意「忽略大小写」要先 lower())和「找出最大值对应键」;第 2 题是典型的「字符串 -> 结构化列表」处理:先按 - 拆成每个学生,再按 # 拆出字段,组装成字典列表——这是解析 CSV / 接口文本的高频套路。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 1.已知字符串 s="aAsmr3idd4bgs70lsf9eAF",要求如下:
s = "aAsmr3idd4bgs70lsf9eAF"
# a.请将s字符串的大写改为小写,小写改为大写:swapcase()
print(s.swapcase()) # AaSMR3IDD4BGS70LSF9Eaf
print("=" * 20)

# b.请将s字符串的数字取出,并输出成一个新的字符串:循环 + isdigit()
s1 = ""
for i in s:
if i.isdigit():
s1 += i
print(s1) # 34709
print("=" * 20)

# c.请统计s字符串中每个字母的出现次数(忽略大小写,a与A是同一个字母)
# 提示:创建新字典d,循环判断s中字符是否在字典中,在则次数+1
d = {}
s = s.lower() # 先统一转小写,保证 a/A 算同一个
for i in s:
if i.isalpha(): # 只统计字母
if i in d:
d[i] += 1
else:
d[i] = 1
print(d)
print("=" * 20)

# d.在c题基础上,输出出现频率最高的字母,多个并列则都输出
for key, value in d.items():
if value == max(d.values()):
print(key)
print("=" * 20)

# 2.处理字符串:
# 有字符串"01#张三#60-02#李四#90-03#王五#70"
# 每一部分表示: 学号#姓名#分数,提取学生信息存放于列表中
s = "01#张三#60-02#李四#90-03#王五#70"
# 先按 "-" 切分,得到每个学生串
s1 = s.split("-")
print(s1)
print("=" * 20)

# 再按 "#" 拆出字段,组装成字典
s2 = []
for i in s1:
lst = i.split("#")
d = {"学号": lst[0], "姓名": lst[1], "分数": int(lst[2])}
s2.append(d)
print(s2)
# [{'学号': '01', '姓名': '张三', '分数': 60},
# {'学号': '02', '姓名': '李四', '分数': 90},
# {'学号': '03', '姓名': '王五', '分数': 70}]
print("=" * 20)

智泊Python--Day7
https://one-null-pointer.github.io/2026/07/26/智泊Python--Day7/
Author
liaoyue
Posted on
July 26, 2026
传送口