智能助教

字符串¶

目标:理解什么是字符串、会创建、索引与切片、常见方法(分割/替换/查找/大小写)、拼接与长度、格式化输出(占位符/format/f-string),并掌握若干“注意事项”。

提示:本笔记中的代码均附中文注释,你可以逐格运行,观察输出结果。

4.3.1 字符串的定义(Definition)¶

  • 字符串是用单引号' '或双引号" "包起来的字符序列。
  • 可包含汉字、字母、数字、标点等。
  • 两种引号等价;选择更方便阅读的那种即可。
In [ ]:
# 例:创建字符串(注意:不要用变量名 str 覆盖内置类型名 str)
s1 = 'Hello, World!'           # 单引号
s2 = "Python is great!"        # 双引号
s3 = s1 + " " + s2             # 字符串拼接
print(s3)                      # 预期:Hello, World! Python is great!

4.3.2 字符串的索引(Indexing)¶

  • 字符串是有序的,每个字符有索引:从 0 开始。
  • s[i] 访问第 i 个字符(越界会报错)。
In [ ]:
# 演示:索引(index)
text = "Python"
print(text[0])  # 第1个字符:P
print(text[5])  # 第6个字符:n

# 注意事项:索引超界会报错,下面这一行如果取消注释会报 IndexError
# print(text[6])

4.3.3 字符串的切片(Slicing)¶

  • 语法:s[start:end],包含 start,不包含 end。
  • 省略 start 表示从开头;省略 end 表示直到结尾。
  • 也可以使用步长:s[start:end:step]。
In [ ]:
# 演示:切片(slice)
text = "Python"
print(text[0:3])   # Pyt(含0,不含3)
print(text[:3])    # Pyt(从头到索引3之前)
print(text[3:])    # hon(从索引3直到末尾)
print(text[1:4])   # yth
print(text[2:6])   # thon(注意:不是'P',而是从索引2到5的"thon")

4.3.4 字符串的拼接(Concatenation)¶

  • 使用 + 连接多个字符串;或用 join() 更高效地连接列表。
In [ ]:
# 演示:拼接
first = 'Hello'
second = 'World'
print(first + ' ' + second)        # Hello World

words = ["人文社科", "Python", "字符串"]
print(" / ".join(words))            # 使用 join 连接列表中的字符串

4.3.5 字符串的长度(Length)¶

  • 使用 len(s) 获取字符个数(注意:是字符数,不是“字节数”)。
In [ ]:
s = 'Python'
print(len(s))        # 6

cn = "汉字ABC"
print(len(cn))       # 5('汉' '字' 'A' 'B' 'C')

4.3.6 字符串的分割(Split)¶

  • s.split(sep) 按分隔符切分为列表;不传 sep 时按任意空白切分。
  • 常用于把一行文本拆成“词语/字段”。
In [ ]:
s = 'Hello,World,Python'
print(s.split(','))    # ['Hello', 'World', 'Python']

line = "文学  社会学	历史"  # 中间有空格和制表符
print(line.split())     # 默认按空白分割 -> ['文学', '社会学', '历史']

4.3.7 字符串的替换(Replace)¶

  • s.replace(old, new, count=None):将 old 替换为 new;count 可限制次数。
  • 不会修改原字符串(字符串不可变),而是返回一个新字符串。
In [ ]:
s = 'Hello, Python'
print(s.replace('Python', 'World'))     # Hello, World
print(s)                                # 原 s 不变
print(s.replace('l', 'L', 2))           # 限制替换2次:HeLLo, Python

4.3.8 字符串的查找(Find)¶

  • s.find(sub):返回子串的起始索引;找不到返回 -1。
  • s.index(sub):找不到会抛出异常。根据需要二选一。
In [ ]:
s = 'Hello, Python'
print(s.find('Python'))   # 7
print(s.find('Go'))       # -1

# 使用 index,如果不存在会报错(请根据需要选择 find 或 index)
# print(s.index('Go'))    # ValueError: substring not found

4.3.9 字符串的大小写转换(Case Conversion)¶

  • s.lower()、s.upper()、s.title()(标题化)、s.capitalize()(句首大写)。
In [ ]:
s = 'Hello, Python'
print(s.lower())      # hello, python
print(s.upper())      # HELLO, PYTHON
print(s.title())      # Hello, Python
print(s.capitalize()) # Hello, python

4.3.10 字符串的格式化(str.format 概览)¶

  • 使用 format 将占位符 {} 替换为变量值。
  • 可用位置参数、关键字参数、格式说明(如小数位数、对齐等)。
In [ ]:
name = 'Chomsky'
title = 'Professor'
print('Name: {}, Title: {}'.format(name, title))

# 关键字参数 + 格式说明
score = 92.3456
print("姓名:{n}|头衔:{t}|成绩:{s:.1f}".format(n=name, t=title, s=score))  # 保留1位小数

4.3.11 字符串的若干高级用法¶

(1)反转:s[::-1]
(2)判断:isalnum()、isalpha()、isdigit() 等返回布尔值
(3)计数:count(sub) 统计子串出现次数
(4)对齐:ljust()、rjust()、center()

In [ ]:
# (1)反转
s = 'Python'
print(s[::-1])  # nohtyP

# (2)判断
s = 'Python123'
print(s.isalnum())   # True(字母或数字)
print(s.isalpha())   # False(因为含数字)
print("2025".isdigit())  # True

# (3)计数
s = 'Python, Python, Python'
print(s.count('Python'))  # 3

# (4)对齐
s = 'Python'
print(s.ljust(10, '-'))   # Python----
print(s.rjust(10, '-'))   # ----Python
print(s.center(11, '-'))  # ---Python--

4.3.12 字符串的格式化输出 1 —— 占位符 %¶

  • 早期常见方式:%s(字符串)、%d(整数)、%f(浮点)。
  • 现在更推荐 format 或 f-string,但阅读旧代码时仍会看到 %。
In [ ]:
name = 'Chomsky'
age = 96
print('Name: %s, Age: %d' % (name, age))
print('Pi ≈ %.2f' % 3.14159)  # 保留两位小数

4.3.13 字符串的格式化输出 2 —— .format()¶

  • str.format() 自 Python 2.6 起提供,更灵活,支持对齐、宽度、精度等。
In [ ]:
name = 'Chomsky'
print('Name: {}'.format(name))
print('编号:{:04d}'.format(7))         # 宽度4,不足补0 -> 0007
print('百分比:{:.1%}'.format(0.256))   # 25.6%

4.3.14 字符串的格式化输出 3 —— f-string(推荐)¶

  • Python 3.6+ 引入,最简洁、可读性好:f'Name: {name}'。
  • 可以在花括号里直接写表达式。
In [ ]:
name = 'Chomsky'
score = 92.3456
print(f'Name: {name}')
print(f'下学期预计成绩:{score:.1f}')
print(f'长度比较:{"人文"+"社科"} 的长度是 {len("人文社科")}')

注意事项与学习建议¶

  1. 不要用变量名 str 覆盖内置类型 str,避免后续无法调用 str() 转换。
  2. 索引从 0 开始;s[a:b] 取 [a, b) 左闭右开。
  3. 字符串是不可变的,像 replace() 不会修改原变量,而是返回新字符串。
  4. 中英文混排时,len() 计算的是字符数,不是“字节数”。
  5. 面对长文本(如访谈稿/田野笔记),常用工作流:清洗(替换/去空白)→ 分割(句子/词)→ 统计(计数/查找)。

练习:把你的一段课程简介或研究摘要粘贴为字符串,进行:
(1)去除多余空白;(2)统计某个关键词出现次数;(3)把年份统一替换为“[YEAR]”。