3·模块一:环境与基础入门

字符串操作与格式化

stringsformatting

Python 编程:从零基础到精通

第 3 课 - 字符串操作与格式化

学习目标

在本课结束时,你将能够:

  1. 理解字符串的基本概念、创建方式及其不可变性。
  2. 熟练使用索引和切片访问字符串中的特定字符或子串。
  3. 掌握常用的字符串内置方法(如大小写转换、查找、替换、分割)。
  4. 运用 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!"

  1. 提取子串 "Python"
  2. 将字符串转换为全大写。
  3. 将字符串中的 "fun" 替换为 "exciting"
  4. 统计字符串中 "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"),然后:

  1. 将句子按单词分割成列表。
  2. 将每个单词的首字母大写。
  3. 用空格重新连接成一个新句子并打印。
# 你的代码
# 期望输出(如果输入是上面的句子):The Quick Brown Fox Jumps Over The Lazy Dog

常见错误

  1. 索引越界(IndexError):

    s = "abc"
    print(s[3])  # 错误!最大索引是2(长度-1)
    

    正确做法:访问前考虑字符串长度,或使用切片。

  2. 试图修改不可变的字符串:

    s = "hello"
    s[0] = 'H'  # TypeError: 'str' object does not support item assignment
    

    正确做法:使用切片和拼接创建新字符串。

  3. 忘记字符串方法返回新值:

    s = "  hello  "
    s.strip()      # 返回了新字符串 "hello",但没赋值给任何变量
    print(s)       # 原字符串 s 没变,仍然是 "  hello  "
    

    正确做法:将结果保存回变量,如 s = s.strip()

  4. 混淆单引号和双引号内的特殊字符: 如果字符串本身包含引号,需要注意转义。

    # 错误写法
    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 中另一种极其重要的数据结构!

练习编辑器

python
Loading...

继续学习

完成本课后,建议继续学习下一课「列表(List)与元组(Tuple)」 以巩固所学知识。