📝 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")       # 6

5.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'

为什么不可变?

  1. 性能:不可变对象可以被缓存和复用
  2. 安全:可以作为字典的 key
  3. 多线程安全:不可变对象不会被修改

🔗 相关章节


📝 我的笔记

在这里记录你的理解、疑问和练习代码

# 你的练习代码
 

✅ 本章检查清单

  • 掌握字符串的定义和转义字符
  • 会使用索引和切片操作字符串
  • 掌握常用的字符串方法
  • 会使用三种字符串格式化方式
  • 理解字符串的不可变性
  • 会遍历字符串