📝 05. 字符串 str 详解
本章概述
学习 Python 字符串的定义、操作和常用方法。 预计学习时间:60 分钟
5.1 字符串定义
# 单引号
s1 = 'hello'
# 双引号
s2 = "world"
# 三引号(多行字符串)
s3 = """第一行
第二行
第三行"""
# 空字符串
s4 = ""单双引号嵌套
小技巧
外面用双引号,里面可以直接用单引号,反之亦然。
# 外面用双引号,里面可以直接用单引号
print("I'm Tom")
# 外面用单引号,里面可以直接用双引号
print('他说:"你好"')5.2 转义字符
用 \ 开头的特殊字符:
| 转义字符 | 含义 |
|---|---|
\n | 换行 |
\t | 制表符(Tab) |
\\ | 反斜杠本身 |
\' | 单引号 |
\" | 双引号 |
\r | 回车 |
\b | 退格 |
示例
print("hello\nworld") # 换行
print("hello\tworld") # Tab缩进
print("C:\\Users\\Tom") # 路径中的反斜杠原始字符串 r”
在字符串前加 r,转义字符失效,原样输出:
print(r"C:\Users\Tom") # 不用写双反斜杠了
print(r"\n\t") # 直接输出\n\t常用场景
写文件路径、正则表达式时,用原始字符串更方便。
5.3 字符串索引和切片
字符串是有序序列,每个字符都有下标(索引),从 0 开始。
0 1 2 3 4 5
P y t h o n
-6 -5 -4 -3 -2 -1
索引取值
s = "Python"
s[0] # 'P'(第一个)
s[5] # 'n'(最后一个)
s[-1] # 'n'(倒数第一个)
s[-2] # 'o'(倒数第二个)切片
取子串,格式 s[start:end:step]
切片规则
- 含头不含尾(包含 start,不包含 end)
- start 省略默认从头开始
- end 省略默认到末尾
- step 省略默认步长为 1
切片示例
s = "Python"
s[1:4] # 'yth'(索引1到3)
s[:3] # 'Pyt'(前3个)
s[3:] # 'hon'(从第3个到末尾)
s[:] # 'Python'(整个字符串,复制一份)
s[::2] # 'Pto'(每隔一个取一个)
s[::-1] # 'nohtyP'(反转字符串)
s[-3:-1] # 'ho'反转字符串
s[::-1]是 Python 中最简单的字符串反转方法!
5.4 字符串运算
# 拼接 +
"Hello" + " " + "World" # 'Hello World'
# 重复 *
"Hi" * 3 # 'HiHiHi'
# 成员判断 in / not in
"P" in "Python" # True
"abc" in "Python" # False
# 长度 len()
len("Python") # 65.5 字符串方法大全
🔍 查找与判断
s = "Hello World"
# 查找子串位置
s.find("World") # 6(找到返回起始索引)
s.find("abc") # -1(找不到返回-1)
s.rfind("o") # 7(从右边找)
# 查找子串(找不到报错)
s.index("World") # 6
# s.index("abc") # 报错 ValueError
# 统计出现次数
s.count("o") # 2
s.count("l") # 3
# 判断开头/结尾
s.startswith("Hello") # True
s.endswith("ld") # True
# 判断内容
s.isalpha() # False(有空格,不全是字母)
"abc".isalpha() # True(全是字母)
"123".isdigit() # True(全是数字)
"abc123".isalnum() # True(字母+数字)
" ".isspace() # True(全是空白字符)
"Hello".isupper() # False(不全大写)
"HELLO".isupper() # True
"hello".islower() # True
"Hello World".istitle() # True(每个单词首字母大写)✂️ 大小写转换
s = "Hello World"
s.upper() # 'HELLO WORLD'(全大写)
s.lower() # 'hello world'(全小写)
s.swapcase() # 'hELLO wORLD'(大小写互换)
s.title() # 'Hello World'(每个单词首字母大写)
s.capitalize() # 'Hello world'(首字母大写,其余小写)🧹 去除空白
s = " hello "
s.strip() # 'hello'(去掉两边空白)
s.lstrip() # 'hello '(去掉左边空白)
s.rstrip() # ' hello'(去掉右边空白)
# 也可以去掉指定字符
"***hello***".strip("*") # 'hello'🔗 分割与拼接
# 分割
s = "a,b,c,d"
s.split(",") # ['a', 'b', 'c', 'd'](按逗号分割)
"hello world".split() # ['hello', 'world'](默认按空白分割)
# 按行分割
"line1\nline2\nline3".splitlines() # ['line1', 'line2', 'line3']
# 拼接(用指定字符连接列表)
"-".join(["a", "b", "c"]) # 'a-b-c'
" ".join(["Hello", "World"]) # 'Hello World'拼接性能
大量字符串拼接时,用
join()比+效率高很多!
🔄 替换
s = "Hello World"
s.replace("World", "Python") # 'Hello Python'
"aabbaa".replace("a", "x") # 'xxbbxx'(全部替换)
"aabbaa".replace("a", "x", 2) # 'xxbbaa'(只替换前2个)📏 对齐填充
s = "hi"
s.center(10) # ' hi '(居中,总宽10)
s.center(10, "*") # '****hi****'
s.ljust(10) # 'hi '(左对齐)
s.rjust(10) # ' hi'(右对齐)
s.zfill(5) # '000hi'(左边补0,总宽5)
"123".zfill(5) # '00123'🔤 编码
# 字符串转字节
"你好".encode("utf-8") # b'\xe4\xbd\xa0\xe5\xa5\xbd'
# 字节转字符串
b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode("utf-8") # '你好'5.6 字符串格式化
方式 1:% 格式化(老式)
name = "Tom"
age = 18
"我叫%s,今年%d岁" % (name, age)
# '我叫Tom,今年18岁'| 占位符 | 含义 |
|---|---|
%s | 字符串 |
%d | 整数 |
%f | 浮点数 |
%.2f | 保留2位小数的浮点数 |
%x | 十六进制 |
方式 2:format() 方法(推荐)
name = "Tom"
age = 18
"我叫{},今年{}岁".format(name, age)
# '我叫Tom,今年18岁'
# 按索引
"{0}今年{1}岁,{0}喜欢Python".format(name, age)
# 按名字
"我叫{name},今年{age}岁".format(name="Tom", age=18)
# 格式化数字
"{:.2f}".format(3.14159) # '3.14'
"{:0>5d}".format(123) # '00123'(补0,右对齐)
"{:,}".format(1000000) # '1,000,000'(千分位)
"{:.1%}".format(0.25) # '25.0%'(百分比)方式 3:f-string(最推荐,Python 3.6+)
推荐使用
f-string 是 Python 3.6+ 的新特性,最直观、最强大!
在字符串前加 f,直接在 {} 里写变量或表达式:
name = "Tom"
age = 18
f"我叫{name},今年{age}岁"
# '我叫Tom,今年18岁'
# 可以写表达式
f"明年我{age + 1}岁"
# 格式化数字
pi = 3.1415926
f"{pi:.2f}" # '3.14'
f"{pi:0>10.2f}" # '0000003.14'
# 千分位
num = 1000000
f"{num:,}" # '1,000,000'
# 百分比
f"{0.25:.1%}" # '25.0%'5.7 字符串遍历
s = "Python"
# 方式1:遍历每个字符
for char in s:
print(char)
# 方式2:带索引遍历
for i, char in enumerate(s):
print(i, char)
# 方式3:按索引遍历
for i in range(len(s)):
print(s[i])5.8 字符串的不可变性
重要!
字符串是不可变的,不能修改单个字符。
s = "hello"
# s[0] = 'H' # ❌ 报错!TypeError
# ✅ 正确:重新赋值
s = "H" + s[1:]
print(s) # 'Hello'为什么不可变?
- 性能:不可变对象可以被缓存和复用
- 安全:可以作为字典的 key
- 多线程安全:不可变对象不会被修改
🔗 相关章节
📝 我的笔记
在这里记录你的理解、疑问和练习代码
# 你的练习代码
✅ 本章检查清单
- 掌握字符串的定义和转义字符
- 会使用索引和切片操作字符串
- 掌握常用的字符串方法
- 会使用三种字符串格式化方式
- 理解字符串的不可变性
- 会遍历字符串