Python 编程:从零基础到精通
第 3 课 - 字符串操作与格式化
学习目标
在本课结束时,你将能够:
- 理解字符串的基本概念、创建方式及其不可变性。
- 熟练使用索引和切片访问字符串中的特定字符或子串。
- 掌握常用的字符串内置方法(如大小写转换、查找、替换、分割)。
- 运用
format()方法和 f-string 对字符串进行灵活的格式化输出。
核心概念
1. 什么是字符串?
字符串(String)是用于表示文本数据的数据类型。你可以把它想象成一串用引号括起来的字符(字母、数字、符号等)。在 Python 中,可以使用单引号 ' ' 或双引号 " " 来创建字符串。
greeting = "Hello, World!" # 使用双引号
name = 'Alice' # 使用单引号
重要特性:字符串是不可变的。 这意味着一旦创建,字符串的内容无法被更改。任何看起来"修改"字符串的操作,实际上都会创建一个新的字符串。
s = "hello"
# s[0] = 'H' # 这会报错:TypeError,因为不能修改原字符串
s = "H" + s[1:] # 正确做法:创建了一个新字符串 "Hello"
2. 访问字符串:索引与切片
字符串中的每个字符都有一个从 0 开始的编号(索引)。我们可以用 [] 来访问。
text = "Python"
print(text[0]) # 输出:P (第一个字符)
print(text[-1]) # 输出:n (最后一个字符,负索引从末尾开始计数)
切片(Slicing)允许你提取子串。语法为 [start:stop:step],包含 start,不包含 stop。
lang = "Python Programming"
print(lang[0:6]) # 输出:Python (索引0到5)
print(lang[7:]) # 输出:Programming (从索引7到末尾)
print(lang[::2]) # 输出:Pto rgamn (每两个字符取一个,步长为2)
print(lang[::-1]) # 输出:gnimmargorP nohtyP (反转字符串,步长为-1)
3. 常用字符串方法
字符串有许多内置方法来处理文本。注意:这些方法都返回新字符串,而不改变原字符串。
sentence = " Hello, World! "
# 大小写转换
print(sentence.lower().strip()) # 输出:hello, world! (先转小写,再去首尾空格)
print(sentence.upper()) # 输出: HELLO, WORLD!
# 查找与替换
print(sentence.find("World")) # 输出:9 (返回子串首次出现的起始索引)
print(sentence.replace("World", "Python")) # 输出: Hello, Python!
# 分割与连接
words = sentence.strip().split(", ") # 以", "为分隔符分割,得到列表:['Hello', 'World!']
print(words) # 输出:['Hello', 'World!']
print(" & ".join(words)) # 用" & "连接列表元素:Hello & World!
4. 字符串格式化
当你需要将变量嵌入到字符串中时,格式化非常有用。
format()方法: 使用{}作为占位符。name = "Bob" age = 25 print("My name is {} and I am {} years old.".format(name, age))- f-string (推荐): 在字符串前加
f,直接在{}中写变量名或表达式,更直观。name = "Bob" age = 25 print(f"Next year, {name} will be {age + 1} years old.") print(f"{'Centered':^20}") # 输出: Centered (总宽20,居中) print(f"{3.14159:.2f}") # 输出:3.14 (保留两位小数)
代码示例
下面是一个综合示例,演示上述概念:
# 创建字符串
user_info = "Name: Alice, Age: 30, Country: Canada"
# 1. 使用索引和切片提取信息
colon_index = user_info.find(':') # 找到第一个冒号的位置
name_start = colon_index + 2 # 跳过冒号和空格
name_end = user_info.find(',', colon_index) # 从第一个冒号后开始找逗号
user_name = user_info[name_start:name_end]
print(f"提取的用户名是: {user_name}") # 输出:提取的用户名是: Alice
# 2. 使用字符串方法处理信息
info_parts = user_info.split(', ') # 分割字符串
print("分割后的列表:", info_parts) # 输出:分割后的列表: ['Name: Alice', 'Age: 30', 'Country: Canada']
# 3. 格式化输出
for part in info_parts:
key, value = part.split(': ') # 进一步分割键值对
# 使用f-string和格式规范
print(f"{key:<10} | {value:>10}") # 左对齐键,右对齐值
# 输出结果:
# Name | Alice
# Age | 30
# Country | Canada
实践练习
练习 1:字符串基础
给定字符串 s = "Learning Python is fun!"
- 提取子串
"Python"。 - 将字符串转换为全大写。
- 将字符串中的
"fun"替换为"exciting"。 - 统计字符串中
"i"出现的次数。
# 你的代码
s = "Learning Python is fun!"
# 期望输出:
# Python
# LEARNING PYTHON IS FUN!
# Learning Python is exciting!
# 2
练习 2:格式化输出
使用 f-string,根据变量 name="Charlie", score=95.7, 生成并打印以下格式的字符串:
"学生Charlie的成绩是95.70分。等级:A"
(提示:分数保留两位小数,并使用条件判断等级:>=90为A,>=80为B,否则为C)
# 你的代码
name = "Charlie"
score = 95.7
# 期望输出:学生Charlie的成绩是95.70分。等级:A
练习 3:综合处理
编写一个程序,输入一个包含多个单词的句子(例如 "the quick brown fox jumps over the lazy dog"),然后:
- 将句子按单词分割成列表。
- 将每个单词的首字母大写。
- 用空格重新连接成一个新句子并打印。
# 你的代码
# 期望输出(如果输入是上面的句子):The Quick Brown Fox Jumps Over The Lazy Dog
常见错误
-
索引越界(IndexError):
s = "abc" print(s[3]) # 错误!最大索引是2(长度-1)正确做法:访问前考虑字符串长度,或使用切片。
-
试图修改不可变的字符串:
s = "hello" s[0] = 'H' # TypeError: 'str' object does not support item assignment正确做法:使用切片和拼接创建新字符串。
-
忘记字符串方法返回新值:
s = " hello " s.strip() # 返回了新字符串 "hello",但没赋值给任何变量 print(s) # 原字符串 s 没变,仍然是 " hello "正确做法:将结果保存回变量,如
s = s.strip()。 -
混淆单引号和双引号内的特殊字符: 如果字符串本身包含引号,需要注意转义。
# 错误写法 quote = 'He said, "It's amazing!"' # 单引号提前结束了字符串 # 正确写法 quote = 'He said, "It\'s amazing!"' # 使用反斜杠转义内部单引号 quote = "He said, \"It's amazing!\"" # 或者使用双引号包裹,并转义内部双引号
小结
- 字符串是表示文本的不可变序列,可用单/双引号创建。
- 通过索引(
[])和切片([start:stop:step])访问字符或子串。 - 使用丰富内置方法(如
.lower(),.find(),.split(),.replace())处理文本,它们返回新字符串。 - 格式化输出是关键技能,推荐使用灵活直观的 f-string (
f"...")。 - 切记字符串的不可变性,任何"修改"操作都会生成新对象。
下一课预告
掌握了字符串后,我们将进入第 4 课:列表(List)与元组(Tuple)。你将学习如何存储和处理一组有序的数据,这是 Python 中另一种极其重要的数据结构!