讲解
字符串(str)是文本数据,用单引号、双引号或三引号包起来:单双引号完全等价,选哪种看里面有没有撇号;三引号(''' 或 """)可以跨多行,常用来写多行文本和文档字符串。字符串里可以放任意 Unicode 字符——中文、emoji、日文假名一视同仁。需要特殊字符时用反斜杠转义:\n 换行、\t 制表符、\ 反斜杠本身;在引号前加 r 表示「原始字符串」,反斜杠不转义,写 Windows 路径和正则时很好用。
字符串是不可变的:创建之后不能改动其中的字符,所有「修改」字符串的操作都返回一个新字符串。字符串支持用下标取字符,从 0 开始;负数下标从尾部数,s[-1] 是最后一个字符。切片 s[start:end] 截取子串,含头不含尾,省略 start 从头开始、省略 end 到尾结束,s[::-1] 是经典的反转写法。len() 返回字符数——Python 3 按 Unicode 字符计数,len('中文') 是 2,emoji 也大多算 1 个,不像某些语言要数码元。
字符串拼接有三种方式:+ 直接拼、join 批量拼、f-string 内嵌表达式。f-string(格式化字符串字面量)是 Python 3.6+ 的现代写法,在字符串前加 f,花括号里写变量或任意表达式,还能带格式说明:f'{price:.2f}' 保留两位小数、f'{n:>10}' 右对齐占 10 格。日常写代码优先 f-string, readability 最好;join 则专用于把列表里的很多字符串用分隔符连起来,比循环 + 拼接快得多。
示例
# 三种引号与转义
single = '单引号'
double = "双引号里可以放 ' 撇号"
multi = '''这是
多行
字符串'''
print(single, double)
print(multi)
print('换行符:' + 'a\nb')
# 原始字符串:反斜杠不转义,正则和路径好用
path = r'C:\Users\name\file.txt'
print('原始字符串:', path)
# 下标与切片
s = 'Python'
print('第一个字符:', s[0], ',最后一个:', s[-1])
print('切片 s[1:4]:', s[1:4], ',s[:3]:', s[:3], ',s[3:]:', s[3:])
print('反转:', s[::-1])
# len 按字符计数
print("len('中文') =", len('中文'))
# 不可变:s[0] = 'J' 会报 TypeError,只能生成新串
new_s = 'J' + s[1:]
print('生成新串:', new_s)
# f-string:内嵌表达式与格式说明
name = '小明'
score = 87.456
print(f'{name} 的分数是 {score:.1f},明年 {18 + 1} 岁')
# join:批量拼接的首选
words = ['Python', '真', '好玩']
print('、'.join(words))
常见坑
- 试图修改字符串中的字符:s[0] = 'x' 抛 TypeError。字符串不可变,要「改」就拼一个新串。
- 忘记切片含头不含尾:s[0:2] 只取下标 0 和 1。想截前 n 个字符,记住 s[:n] 正好 n 个。
- 循环里用 + 拼大字符串:每次 + 都生成新串,万次循环会很慢。把片段放进列表,最后一次 ''.join(list)。
- f-string 里引号打架:Python 3.12 之前 f-string 的花括号里不能用和外层相同的引号,3.12 起已放开,但养成内外引号不同的习惯没坏处。
小结
字符串不可变,下标从 0 开始、支持负数,切片含头不含尾;拼接首选 f-string 和 join。下一节系统过一遍字符串的常用方法。