字符串插画

其实你早就离不开字符串了:input() 读进来的、f-string 拼出来的、文件里一行一行读回的,全是字符串。上一课我们用 split 把一行成绩拆开——那只是字符串本事的冰山一角。这一课把字符串"玩透":怎么精确地取出一部分、怎么拆、怎么拼、怎么找、怎么换。

一、字符串是一串排好队的字符

把字符串想成一排座位,每个字符坐一个位置,位置编号叫索引。规矩是:从 0 开始数;从后往前数,用负数,-1 是最后一个。

s = "Python"
print(s[0])    # P   第一个
print(s[5])    # n   最后一个
print(s[-1])   # n   倒着数第一个,还是它
print(len(s))  # 6   len() 数一共有几个字符

易错点先说清:6 个字符,索引只到 5。写 s[6] 不是"取不到",是直接报错——座位只排到 5 号,没有 6 号。

二、切片:一刀切走一段

想一次取出好几个字符,用切片,写法是 s[起:止]。最重要的规矩:含头不含尾——取到"止"的前一个为止。

s = "Python"
print(s[0:3])   # Pyt   取 0、1、2 号,不含 3 号
print(s[3:])    # hon   省略"止",一直取到末尾
print(s[:3])    # Pyt   省略"起",从头取
print(s[-2:])   # on    最后两个

再加第三个参数步长,s[起:止:步长],每隔几个取一个:

print(s[::2])    # Pto   隔一个取一个
print(s[::-1])   # nohtyP  步长 -1:整个倒过来!

记住这个 s[::-1],把字符串倒序只要一招,后面的回文判断就靠它。

三、常用方法:字符串的工具箱

方法是"字符串自带的工具",用点号调用:字符串.方法(...)。挑最常用的几个:

方法干什么例子
split(分隔符)按分隔符拆成列表"a,b,c".split(",") → ['a', 'b', 'c']
join(列表)把列表拼成字符串(split 的反操作)"-".join(['a','b']) → "a-b"
strip()削掉两头的空格和换行" 好 ".strip() → "好"
replace(旧, 新)把出现的旧串全换成新串"我爱猫".replace("猫", "狗") → "我爱狗"
find(子串)找子串第一次出现的位置,找不到返回 -1"banana".find("na") → 2
count(子串)数子串出现了几次"banana".count("a") → 3
startswith / endswith判断开头/结尾,返回 True/False"test.jpg".endswith(".jpg") → True
upper / lower英文大小写转换"AbC".lower() → "abc"

还有个不用方法的快捷判断——in,问"在不在里面":

print("Py" in "Python")      # True
print("猫" in "我爱编程")      # False

四、字符串是"只读"的

有个坑迟早要踩,先给你打预防针:字符串不能改。想把 "hello" 的 h 改成大写,这样写会报错:

s = "hello"

正确做法是拼一个新串——切片正好派上用场:

s = "H" + s[1:]   # 取新首字母 + 原来的后半截
print(s)          # Hello

replace、upper 这些方法看起来像在"改"字符串,其实都是生成了一个新串,原来的没动。记住:字符串只读,要改就重拼。

五、三个小实战

实战 1:拆学号。假设学号 "20250312" 的含义是:前 4 位入学年份、接着 2 位班级、最后 2 位座号。用切片一刀一个:

sid = "20250312"
print("入学年份:", sid[:4])    # 2025
print("班级:", sid[4:6])       # 03
print("座号:", sid[6:])        # 12

实战 2:数词频。统计一句话里每个词出现几次——split 拆词,配上第九课的字典,一气呵成:

text = "apple banana apple orange banana apple"
count = {}
for w in text.split():
    count[w] = count.get(w, 0) + 1
print(count)   # {'apple': 3, 'banana': 2, 'orange': 1}

其中 count.get(w, 0) 的意思是"有这个词就取它的次数,没有就当 0"——字典的安全取法,值得记住。

实战 3:回文判断。正着读反着读一样的句子叫回文,比如"上海自来水来自海上"。判断方法简单粗暴:和倒过来的自己比一比。

def is_palindrome(s):
    return s == s[::-1]

print(is_palindrome("上海自来水来自海上"))   # True
print(is_palindrome("我爱编程"))             # False

本课小结

· 索引从 0 开始,-1 是最后一个;len() 数长度,索引最大只到 len-1。
· 切片 s[起:止:步长],含头不含尾;s[::-1] 一招倒序。
· 工具箱:split 拆、join 拼、strip 削两头、replace 换、find 找(找不到是 -1)、count 数、in 判断在不在。
· 字符串只读:要"改",就用切片拼一个新串。

练一练

1. 文件名侦探:给一个文件名如 "报告.docx",取出它的扩展名 "docx"(提示:split 按 "." 拆開,取最后一块;或者想想切片怎么定位那个点)。
2. 敏感词过滤:留言墙同款功能——输入一句话,把里面的某个敏感词(自己定一个)用 replace 换成 "***",打印过滤后的句子。
3. 挑战题:升级实战 2 的词频统计:统计完之后,把出现次数最多的词打印出来(提示:max 配合字典,或者先排序)。

下一课,我们让数据"画出来":用 matplotlib 把成绩变成图表。

More

相关教程