Python 字符串
字符串用于表示文本,而处理文本的能力经常用于数据清洗、自然语言处理以及用户界面开发等任务。
本章将涵盖处理字符串的三大核心技术:拼接 (Concatenation)(将多个字符串组合)、切片 (Slicing)(提取字符串的特定部分)和格式化 (Formatting)(创建包含动态内容的字符串)。
1. 字符串拼接 (String Concatenation)
字符串拼接就是将两个或多个字符串合并成一个长字符串的过程。在 Python 中,这主要通过 + 运算符来实现。
1.1 使用 + 运算符
+ 运算符是拼接字符串最直观的方法。
# 示例 1:基础拼接
string1 = "Hello"
string2 = "World"
result = string1 + " " + string2 # 在中间加上一个空格
print(result) # 输出: Hello World
# 示例 2:拼接不同数据类型的变量(需要类型转换)
name = "Alice"
age = 30
# 如果直接运行下面这行会报错:TypeError: can only concatenate str (not "int") to str
# message = "My name is " + name + " and I am " + age
message = "My name is " + name + " and I am " + str(age) # 使用 str() 将整数转换为字符串
print(message) # 输出: My name is Alice and I am 30代码解析:
- 在示例 1 中,我们将两个字符串变量和一个空格字面量拼接在一起,组成了一个完整的句子。
- 在示例 2 中,展示了类型转换的重要性。Python 不会在拼接时自动将数字转换为字符串。我们必须使用
str()函数,显式地将整数age转换为字符串,然后再进行拼接。
1.2 使用 += 运算符
+= 运算符提供了一种简写方式,用于将新文本追加到现有字符串的末尾。
# 示例:向现有字符串追加内容
greeting = "Hello"
greeting += " " # 追加一个空格
greeting += "there!" # 追加 "there!"
print(greeting) # 输出: Hello there!代码解析:
+= 运算符直接修改了原有的字符串变量。这通常比使用 + 运算符再重新赋值(greeting = greeting + " ")要简洁得多。
1.3 使用 join() 方法进行高效拼接
当你需要拼接大量字符串时(尤其是当它们存储在列表等可迭代对象中时),使用 join() 方法不仅更优雅,而且执行效率更高。
# 示例:使用 join() 拼接字符串列表
words = ["This", "is", "a", "sentence."]
sentence = " ".join(words) # 使用空格作为分隔符连接列表中的单词
print(sentence) # 输出: This is a sentence.
# 示例:使用空字符串作为分隔符
characters = ['P', 'y', 't', 'h', 'o', 'n']
word = "".join(characters)
print(word) # 输出: Python代码解析:
join() 方法是由分隔符字符串调用的,并接收一个可迭代对象(如列表)作为参数。它会将可迭代对象中的元素拼接起来,并在每个元素之间插入调用它的分隔符。
- 第一个例子中,我们用
" "(空格) 把单词列表连成了一个句子。 - 第二个例子中,我们用
""(空字符串,即没有字符) 把字母列表无缝组合成了一个完整的单词。
2. 字符串切片 (String Slicing)
字符串切片允许你通过指定索引(位置)的范围,精准地提取出字符串的一部分。
2.1 基础切片语法
字符串切片的基础语法是 string[start:end:step]。
- start (起始位置):切片开始的索引(包含该位置的字符)。如果省略,默认从
0(字符串开头)开始。 - end (结束位置):切片结束的索引(不包含该位置的字符)。如果省略,默认为字符串的长度(一直提取到字符串末尾)。
- step (步长):提取字符时的间隔。如果省略,默认为
1(挨个提取)。
text = "Python is fun!"
# 示例 1:指定起始和结束索引
substring = text[0:6] # 提取从索引 0 开始,到索引 6 结束(不含 6)的字符
print(substring) # 输出: Python
# 示例 2:只指定起始索引
substring = text[7:] # 提取从索引 7 开始,直到字符串末尾的所有字符
print(substring) # 输出: is fun!
# 示例 3:只指定结束索引
substring = text[:6] # 提取从字符串开头,直到索引 6(不含 6)的所有字符
print(substring) # 输出: Python
# 示例 4:使用步长 (step)
substring = text[0:13:2] # 在索引 0 到 12 之间,每隔 2 个字符提取一个
print(substring) # 输出: Pto sfn
# 示例 5:使用负数步长(反转字符串的神技)
reversed_text = text[::-1] # 反转整个字符串
print(reversed_text) # 输出: !nuf si nohtyP2.2 负数索引 (Negative Indices)
Python 非常人性化地支持负数索引,允许你从字符串的末尾开始倒数。
-1代表最后一个字符。-2代表倒数第二个字符,依此类推。
text = "Python"
# 示例:使用负数索引访问单个字符
last_character = text[-1] # 访问最后一个字符
print(last_character) # 输出: n
second_last = text[-2] # 访问倒数第二个字符
print(second_last) # 输出: o
# 示例:结合切片和负数索引
substring = text[-3:] # 提取最后三个字符 (从倒数第三个一直到末尾)
print(substring) # 输出: hon
substring = text[:-3] # 提取除了最后三个字符之外的所有内容
print(substring) # 输出: Pyt3. 字符串格式化 (String Formatting)
字符串格式化是指将变量的值动态地插入到字符串占位符中的过程。Python 提供了多种格式化字符串的方法,其中 f-strings 是目前最现代、也是官方最推荐的写法。
3.1 F-strings (格式化字符串字面量)
F-strings 提供了一种极其简洁、易读的将表达式嵌入字符串的方法。你只需要在字符串开头的引号前加上字母 f 或 F。
# 示例 1:基础 f-string 格式化
name = "Bob"
age = 40
message = f"My name is {name} and I am {age} years old."
print(message) # 输出: My name is Bob and I am 40 years old.
# 示例 2:在 f-string 中直接运行数学表达式
x = 10
y = 5
result = f"The sum of {x} and {y} is {x + y}."
print(result) # 输出: The sum of 10 and 5 is 15.
# 示例 3:在 f-string 中限制小数位数
pi = 3.14159265359
formatted_pi = f"The value of pi is approximately {pi:.2f}" # 限制为保留 2 位小数
print(formatted_pi) # 输出: The value of pi is approximately 3.143.2 格式化规范 (Formatting Specifications)
通过在 {} 内添加格式化规范,你可以精准控制变量的显示外观。常见的规范包括:
.nf:将浮点数格式化为保留 n 位小数。d:将整数格式化为十进制数字(可配合补零使用)。%:将小数乘以 100 并以百分比形式显示。>,<,^:用于控制文本的右对齐、左对齐和居中对齐。
# 示例 1:格式化整数 (补零)
number = 42
formatted_number = f"The number is {number:04d}" # 补齐前导零,使其总宽度为 4 位
print(formatted_number) # 输出: The number is 0042
# 示例 2:格式化百分比
value = 0.75
formatted_percentage = f"The value is {value:.2%}" # 格式化为带有 2 位小数的百分比
print(formatted_percentage) # 输出: The value is 75.00%
# 示例 3:文本对齐
text = "Hello"
aligned_text = f"{text:>10}" # 将文本在一个宽度为 10 的字段中向右对齐
print(aligned_text) # 输出: Hello3.3 .format() 方法 (传统写法)
虽然 f-strings 是首选,但在较旧的代码库中你仍会频繁看到 .format() 方法。它的功能相似,只是语法略有不同。
# 示例 1:使用 .format() 进行基础格式化
name = "Charlie"
age = 35
message = "My name is {} and I am {} years old.".format(name, age)
print(message) # 输出: My name is Charlie and I am 35 years old.
# 示例 2:使用位置索引格式化
message = "My name is {1} and I am {0} years old.".format(age, name)
print(message) # 输出: My name is Charlie and I am 35 years old.
# 示例 3:使用关键字参数格式化
message = "My name is {name} and I am {age} years old.".format(name="David", age=28)
print(message) # 输出: My name is David and I am 28 years old.