字符串
文本几乎出现在你编写的每一个程序中。名称、消息、分数、标签。在 Python 中,任何一段文本都被称为字符串:任何用引号包裹的值。单引号或双引号都可以,效果完全相同。
greeting = "Hello, world"
username = 'alice'选择引号的唯一关键时刻是当你的文本中包含引号时。使用相反的引号风格,这样就不必转义它们:
note = "It's a great day" # 内部有撇号,使用双引号
message = 'She said "hello"' # 内部有双引号,使用单引号
escaped = "She said \"hello\"" # 或用反斜杠转义不可变性
字符串是不可变的:一旦创建,就无法修改。可以把字符串想象成创建那一刻就永久固定下来了。任何看起来在修改字符串的操作实际上都在产生一个全新的字符串。原始的那个保持原样不变。
name = "alice"
name = name.upper() # "ALICE" 是一个新字符串;"alice" 保持不变直接的后果:你无法修改特定位置的字符。如果你尝试,Python 会抛出错误。
name = "alice"
name[0] = "A" # TypeError: 'str' object does not support item assignment要获得修改后的字符串,需要使用切片或方法构建一个新字符串。两者下面都会介绍。
索引与切片
字符串中的每个字符都有一个编号位置,从零开始。你可以通过在方括号中放入该位置编号来读取单个字符。负数从末尾向前数。
word = "Python"
# 012345
print(word[0]) # "P"
print(word[2]) # "t"
print(word[5]) # "n"
print(word[-1]) # "n" (最后一个字符)
print(word[-2]) # "o" (倒数第二个)-1 始终是最后一个字符,-2 是倒数第二个,以此类推。当你想要获取字符串末尾而不知道其确切长度时,它们很有用。
切片提取一个片段。[start:stop] 包含 start,不包含 stop:
word = "Python"
print(word[0:2]) # "Py" (位置 0 和 1)
print(word[2:]) # "thon" (位置 2 到末尾)
print(word[:3]) # "Pyt" (开头到位置 2)
print(word[:]) # "Python" (整个字符串的副本)
print(word[::2]) # "Pto" (每隔一个字符)
print(word[::-1]) # "nohtyP" (反转)最常用的三种模式:word[:n] 获取前 n 个字符,word[n:] 获取从位置 n 开始的所有内容,word[-n:] 获取最后 n 个字符。word[::-1] 反转字符串。第一次看起来很奇怪,但它是 Python 的惯用法,你会经常见到。
基本字符串方法
字符串自带一套内置方法:你可以直接对任何字符串值调用的操作。先写字符串(或保存字符串的变量),然后是点,然后是方法名。每个方法都返回一个新字符串。原始字符串永远不会改变。
大小写
text = "Hello, World"
text.lower() # "hello, world"
text.upper() # "HELLO, WORLD"
text.title() # "Hello, World" (每个单词首字母大写)
text.capitalize() # "Hello, world" (仅首词)lower() 和 upper() 是你最常用的两个。lower() 在比较文本时特别有用:一旦你在两边都调用 .lower(),"Alice" 和 "alice" 就变成相同的东西了。
空白字符
text = " hello "
text.strip() # "hello" (两侧)
text.lstrip() # "hello " (仅左侧)
text.rstrip() # " hello" (仅右侧)strip() 移除字符串两端的空格。每当处理用户输入或来自文件的文本时,你几乎都会用到它,因为多余的空格会导致悄无声息的失败:"alice" != "alice "。
查找
text = "Hello, world"
text.find("world") # 7
text.find("Python") # -1 (未找到)
text.count("l") # 3
text.startswith("Hello") # True
text.endswith("world") # Truefind() 返回一段文本在你字符串中开始的位置。如果不存在,返回 -1。当你只关心字符串是否以特定内容开头或结尾时,使用 startswith() 和 endswith()。
替换
text = "Hello, world"
text.replace("world", "Python") # "Hello, Python"
text.replace("l", "L") # "HeLLo, worLd" (所有出现)
text.replace("l", "L", 1) # "HeLlo, world" (仅第一次)replace() 将一段文本的每次出现替换为另一段文本,并返回一个新字符串。原始字符串不会改变。如果只想替换第一次出现,传入第三个参数。
拆分与连接
split() 在分隔符处将字符串切分成多个片段,并以列表形式返回。你告诉它在什么位置切分:
csv_row = "小明,28,北京"
parts = csv_row.split(",") # ["小明", "28", "北京"]
" hello world ".split() # ["hello", "world"]列表是什么?
列表是一个有序的值集合。上面的 ["小明", "28", "北京"] 就是一个。列表有自己的一章;现在,把它们看作是 split() 产出、join() 消费的项的序列即可。
join() 则相反:它将字符串列表合并成一个。.join() 前的字符串放在每项之间:
words = ["Hello", "world"]
" ".join(words) # "Hello world"
", ".join(words) # "Hello, world"
"".join(words) # "Helloworld"要记住的模式:separator.join(list_of_strings)。分隔符在左,列表在右。" ".join(words) 在每个单词之间放一个空格。"".join(words) 用空字符串粘合它们。
f-字符串
f-字符串将值直接嵌入文本中。在开始引号前放置 f,然后将任何变量或表达式包裹在花括号中。Python 在代码运行时填入它。你还可以在值后面加一个冒号来控制它的显示方式。
name = "小明"
score = 94.5
print(f"Hello, {name}!") # "Hello, 小明!"
print(f"Score: {score:.1f}%") # "Score: 94.5%"
print(f"2 + 2 = {2 + 2}") # "2 + 2 = 4"
print(f"Name: {name.upper()}") # "Name: 小明": 之后的格式规范控制值的显示方式:
| 规范 | 含义 | 示例 |
|---|---|---|
.2f | 2 位小数 | f"{3.14159:.2f}" → "3.14" |
.0% | 百分比,无小数 | f"{0.94:.0%}" → "94%" |
, | 千位分隔符 | f"{1000000:,}" → "1,000,000" |
>10 | 在 10 个字符宽度内右对齐 | f"{'hi':>10}" → " hi" |
你最常用的是 .2f:每当显示小数并希望得到一个整洁的数字而不是一长串数字时使用。表中的其他内容在需要时再用。你可以在 {} 中放入任何变量、算术运算或方法调用。
多行字符串
要编写跨越多行的字符串,使用三引号:开头三个 ",结尾三个 "。Python 会完全按照你写的样子保留所有换行符和间距。
message = """
亲爱的小明,
感谢您的订单。
此致
团队
"""转义序列
有些字符在字符串内很难直接输入。Python 使用转义序列:一个反斜杠后跟一个表示某种含义的字母。你会经常用到的两个是 \n 表示换行和 \t 表示制表符。
| 序列 | 字符 |
|---|---|
\n | 换行符 |
\t | 制表符 |
\\ | 字面反斜杠 |
\" | 双引号 |
\' | 单引号 |
print("Line one\nLine two") # 两行输出
print("Name:\tAlice") # Name: Alice
path = r"C:\Users\Alice\Documents" # 原始字符串,无转义处理检查字符串内容
Python 有一些方法可以回答有关字符串内容的是/否问题。它们返回 True 或 False。早期最有用的:isdigit() 让你在转换之前检查字符串是否全是数字,这样可以避免在意外输入上崩溃。
"42".isdigit() # True
"hello".isalpha() # True
"hello42".isalnum() # True
" ".isspace() # True
"Hello".islower() # False
"HELLO".isupper() # True实践应用
剥离空白,规范化大小写,然后提取你需要的内容。这个序列几乎可以处理任何用户提供的文本:
raw_input = " [email protected] "
email = raw_input.strip().lower() # "[email protected]"
at_pos = email.find("@")
username = email[:at_pos]
domain = email[at_pos + 1:]
print(f"User: {username}") # "alice"
print(f"Domain: {domain}") # "example.com"方法参考
| 方法 | 作用 |
|---|---|
.lower() / .upper() | 转换为全小写 / 全大写 |
.title() / .capitalize() | 每个单词首字母大写 / 仅首词 |
.strip() / .lstrip() / .rstrip() | 移除周围空白 |
.find(sub) | 首次匹配的索引,或 -1 |
.count(sub) | sub 出现的次数 |
.startswith(s) / .endswith(s) | 前缀 / 后缀检查 |
.replace(old, new) | 替换出现 |
.split(sep) | 分割成列表 |
sep.join(iterable) | 将各项连接成字符串 |
.isdigit() / .isalpha() / .isalnum() | 字符类型检查 |

