字符串
在你写的几乎每个程序中都会出现文本。名字、消息、分数、标签。在 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要得到一个修改过的字符串,要用切片或方法来构建一个新字符串。两者都会在下面介绍。
name[0] = "A" 不行,它会抛出 TypeError。 索引和切片
字符串中的每个字符都有一个编号的位置,从零开始。你可以通过把那个位置号放在方括号里来读取单个字符。负数从末尾向后计数。
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,你会经常看到它。
word[0] 是第一个字符,word[-1] 是最后一个。一个切片抓住一个范围:word[start:stop] 保持 start 并在 stop 前停止。word[::-1] 反转字符串,第一次看起来奇怪然后你就会一直用它。 必要的字符串方法
字符串附带一组内置方法:你可以直接在任何字符串值上调用的操作。你写字符串(或持有它的变量),然后一个点,然后方法名。每个方法返回一个新字符串。原始字符串从不改变。
大小写
text = "Hello, World"
text.lower() # "hello, world"
text.upper() # "HELLO, WORLD"
text.title() # "Hello, World" (每个单词首字母大写)
text.capitalize() # "Hello, world" (仅第一个单词)lower() 和 upper() 是你最常用的两个。lower() 特别有用于比较文本:"Alice" 和 "alice" 在双方都调用 .lower() 后变成一样。
空白
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 = "Alice,28,Beijing"
parts = csv_row.split(",") # ["Alice", "28", "Beijing"]
" hello world ".split() # ["hello", "world"]split() 返回一个列表,一个有序的值序列。它们有自己的列表章节;现在把它们当作 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) 用什么都不用粘合它们。
.lower() 和 .upper() 处理大小写,.strip() 削除多余空格,.find() 定位文本(不在那里时它返回 -1),.replace() 交换文本,.split() 配合 sep.join() 把一个字符串拆开和重新组合。 f 字符串
f 字符串把值直接嵌入到文本中。把 f 放在开放引号前,然后把任何变量或表达式包围在花括号中。Python 在代码运行时填充它。你也可以在值后加一个冒号来控制它是怎样显示的。
name = "alice"
score = 94.5
print(f"Hello, {name}!") # "Hello, alice!"
print(f"Score: {score:.1f}%") # "Score: 94.5%"
print(f"2 + 2 = {2 + 2}") # "2 + 2 = 4"
print(f"Name: {name.upper()}") # "Name: ALICE"冒号后的格式说明符控制值是如何显示的:
| 说明符 | 含义 | 例子 |
|---|---|---|
.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:任何时候你显示一个小数并想要一个整洁的数字而不是一长串数字。表中的其他都在你需要时才有。你可以把任何变量、算术或方法调用放在 {}。
f 放在开放引号前,然后把任何变量、和或方法调用包围在 {} 中,Python 在该行运行时就把结果放入。花括号内的冒号控制外观::.2f 表示两位小数是你会依赖的那个。比用 + 胶合文本整洁得多。 多行字符串
要写一个跨越多行的字符串,用三个引号标记:开始处三个 " 和结束处三个。Python 完全保留所有换行符和间距。
message = """
Dear alice,
Thank you for your order.
Best regards,
The Team
"""转义序列
一些字符很难直接在字符串内输入。Python 使用转义序列:一个反斜杠跟着一个代表某个东西的字母。你会不断用到的两个是 \n 表示新行和 \t 表示制表符。
| 序列 | 字符 |
|---|---|
\n | 新行 |
\t | 制表符 |
\\ | 字面反斜杠 |
\" | 双引号 |
\' | 单引号 |
print("Line one\nLine two") # 两行输出
print("Name:\tAlice") # Name: Alice
path = r"C:\Users\Alice\Documents" # raw 字符串,无转义处理\n 开始新行,\t 插入制表符,\\ 是一个真实反斜杠。那两个,\n 和 \t,是你实际会输入的。在引号前弹一个 r 反斜杠回到普通的,对 Windows 路径很便利。 检查字符串内容
Python 有方法回答是/否问题关于一个字符串包含什么。它们返回 True 或 False。最早有用的:isdigit() 让你在转换它之前检查一个字符串是否全是数字,所以你可以避免在非预期输入上崩溃。
"42".isdigit() # True
"hello".isalpha() # True
"hello42".isalnum() # True
" ".isspace() # True
"Hello".islower() # False
"HELLO".isupper() # Trueis* 方法回答是或否的问题,只在每个字符符合时返回 True。你会首先用到的:在 int() 前调用 isdigit() 来确保文本真的是一个数字,所以奇怪的输入不会崩溃你。 实践
削除空白、归一化大小写,然后拉出你需要的。这个序列处理几乎任何用户提供的文本:
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() | 字符类型检查 |

