来源:黑马程序员Python基础课程 + Python 3.11官方文档 + 网络资料整理
一、详细讲解
1.1 字符串基本特性
Python 字符串是不可变序列(Immutable Sequence),所有修改操作都会返回新字符串:
s = "Hello"
# s[0] = "J" # TypeError: 'str' object does not support item assignment
# 正确做法:创建新字符串
s2 = "J" + s[1:]
print(s2) # Jello
# 字符串长度
print(len("Hello")) # 5
1.2 字符串索引与切片
s = "Python是最流行的编程语言"
# 正向索引(从0开始)
print(s[0]) # P
print(s[7]) # 是
# 反向索引(从-1开始)
print(s[-1]) # 言
print(s[-4]) # 编
# 切片 s[start:end:step]
print(s[0:6]) # Python(不含end)
print(s[7:10]) # 是最流
print(s[:6]) # Python(省略start=0)
print(s[7:]) # 是最流行的编程语言(省略end=len)
print(s[::2]) # Pto无流编言言(步长2)
print(s[::-1]) # 言语言程编的行流最是(逆序)
1.3 常用字符串方法
查找与替换:
s = "Hello World, Hello Python"
# find/rindex:查找子串位置(找不到返回-1 或 抛异常)
print(s.find("World")) # 6
print(s.find("Java")) # -1
print(s.rfind("Hello")) # 13(从右向左找)
# count:统计出现次数
print(s.count("Hello")) # 2
# replace:替换(返回新字符串)
s2 = s.replace("Hello", "Hi")
print(s2) # Hi World, Hi Python
# partition/rpartition:分割为三部分
print(s.partition("World")) # ('Hello ', 'World', ', Hello Python')
print(s.rpartition("Hello")) # ('Hello World, ', 'Hello', ' Python')
大小写转换:
s = "Hello World"
print(s.upper()) # HELLO WORLD(全转大写)
print(s.lower()) # hello world(全转小写)
print(s.swapcase()) # hELLO wORLD(大写变小写,小写变大写)
print(s.title()) # Hello World(每个词首字母大写)
print(s.capitalize()) # Hello world(首字母大写,其余小写)
去空格与对齐:
s = " Hello World "
print(s.strip()) # Hello World(去除两端空格)
print(s.lstrip()) # Hello World (去除左端)
print(s.rstrip()) # Hello World(去除右端)
# 去除指定字符
print("!!Hello!!".strip("!")) # Hello
print("abHelloab".strip("ab")) # Hello
# 填充对齐
print("Hello".ljust(10)) # Hello (左对齐,填充右空格)
print("Hello".rjust(10)) # Hello(右对齐,填充左空格)
print("Hello".center(10)) # Hello (居中对齐)
print("Hello".zfill(10)) # 00000Hello(零填充)
判断方法(返回布尔值):
print("Hello123".isalnum()) # True(字母或数字)
print("Hello".isalpha()) # True(全是字母)
print("123".isdigit()) # True(全是数字)
print("123".isnumeric()) # True(Unicode数字)
print("123.5".isdecimal()) # False(小数点)
print("hello".islower()) # True(全小写)
print("HELLO".isupper()) # True(全大写)
print("Hello World".istitle()) # True(每个词首字母大写)
print(" ".isspace()) # True(全是空格)
print("Hello".startswith("He")) # True(以...开头)
print("Hello".endswith("lo")) # True(以...结尾)
1.4 字符串分割与拼接
s = "apple, banana, orange, grape"
# split:分割(返回列表)
parts = s.split(", ")
print(parts) # ['apple', 'banana', 'orange', 'grape']
# rsplit:从右向左分割(maxsplit次)
print(s.rsplit(", ", 1)) # ['apple, banana, orange', 'grape']
# splitlines:按换行符分割
text = "Line1\nLine2\r\nLine3"
print(text.splitlines()) # ['Line1', 'Line2', 'Line3']
# partition/rpartition
url = "https://blog.uuworld.cn"
print(url.partition("://")) # ('https', '://', 'blog.uuworld.cn')
# join:拼接(最常用)
fruits = ["apple", "banana", "orange"]
print(", ".join(fruits)) # apple, banana, orange
# 实际应用:文件路径拼接
import os
path = os.path.join("home", "user", "docs", "file.txt")
print(path) # home/user/docs/file.txt
1.5 f-string 格式化(Python 3.6+,重点)
name = "小明"
age = 18
score = 95.567
# 基本用法
print(f"姓名:{name},年龄:{age}")
# 输出:姓名:小明,年龄:18
# 表达式
print(f"10年后年龄:{age + 10}")
# 输出:10年后年龄:28
# 格式说明符
print(f"分数:{score:.2f}") # 分数:95.57
print(f"分数:{score:8.2f}") # 95.57(总宽度8右对齐)
print(f"百分比:{0.856:.1%}") # 百分比:85.6%
print(f"科学计数:{1234567:.2e}") # 1.23e+06
# Python 3.8+ 调试语法(重要!)
x = 10
y = 20
print(f"{x=}, {y=}, {x+y=}")
# 输出:x=10, y=20, x+y=30
1.6 字符串编码
# 字符串与字节串转换
s = "Hello世界"
b = s.encode("utf-8") # 字符串 -> 字节
print(b) # b'Hello\xe4\xb8\x96\xe7\x95\x8c'
print(len(b)) # 13(UTF-8中文字占3字节)
# 字节转回字符串
s2 = b.decode("utf-8")
print(s2) # Hello世界
# ASCII 转数字
print(ord("A")) # 65
print(chr(65)) # A
二、背诵版
不可变 → 一切修改返回新字符串 切片 → s[start:end:step],step负数逆序 strip()去空格 → lstrip/rstrip split()分割 → join()拼接 replace()替换 → count()统计 upper/lower/title → 大小写转换 f-string → f"{x=}" 调试语法(Python 3.8+) format → "{:.2f}".format(x) encode → decode(UTF-8中文3字节)三、考前记忆
| 方法 | 功能 | 示例结果 |
|---|---|---|
s.upper()/lower() |
大小写 | "Hello".upper() → "HELLO" |
s.strip() |
去两端空格 | " hi ".strip() → "hi" |
s.split() |
分割为列表 | "a,b".split(",") → ["a","b"] |
",".join(lst) |
列表拼接 | ",".join(["a","b"]) → "a,b" |
s.find(sub) |
查找位置 | "abc".find("b") → 1 |
s.replace() |
替换 | "aab".replace("a","c") → "ccb" |
s[start:end] |
切片 | "hello"[1:4] → "ell" |
f"{x=}" |
调试f串 | x=10 → "x=10"(3.8+) |
四、测试题
1. 单选题: "Hello".replace("l", "x") 的结果是?
- A.
"Hexlo" - B.
"Hexxo" - C.
"Hello" - D. 报错
2. 单选题: 关于字符串的说法,正确的是?
- A. 字符串可变,可以直接修改
- B.
"hello"[::-1]得到"olleh" - C.
split()和join()作用相同 - D.
strip()只去除左端空格
3. 判断题: Python 3.8 新增的 f"{x=}" 语法可以同时输出变量名和值。
4. 填空题: "hello world".split("o") 的结果是 ______。
5. 简答题: 说明 s.find("x") 和 s.index("x") 的区别。
6. 代码题: 用一句话统计字符串 "ababa" 中 "ab" 出现的次数。
- B(
replace替换所有匹配) - B(
[::-1]步长-1 表示逆序) - ✓
["hell", " w", "rld"]find()找不到返回-1,不报错;index()找不到会抛ValueError异常"ababa".count("ab")→ 2