4.1 字符串介绍 —— Python 中最常用的数据类型
你写的每一个 print(),其实都在和字符串打交道。字符串是 Python 中最基础也最常用的数据类型,几乎所有编程场景都离不开它。
🎯 本节要点:掌握字符串的创建、转义字符、原始字符串和基本操作
🔗 关联小程序: ch04_s4_1
一、什么是字符串?
字符串就是一段文本。它可以是单个字符,也可以是一整篇文章。
# 这些都是字符串"你""Hello, World!""合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。"
在 Python 中,字符串用引号包裹起来。你可以用单引号、双引号或三引号:
# 三种表示方式print('千里之行,始于足下。')print("千里之行,始于足下。")print("""合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。""")
运行结果:
千里之行,始于足下。千里之行,始于足下。合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。
三种引号的区别
经验之谈:日常编码中,单引号和双引号没有本质区别,选一种作为习惯即可。我自己习惯用单引号,但当字符串里本身有单引号时,就会换双引号。
二、引号嵌套——谁在里面谁在外面
有时候字符串里面本身就含有引号,这时候就需要区分内外的关系。
场景 1:字符串里有单引号
# 错误示范print('let's learn Python') # 报错!
Python 看到 let 后面的单引号,会以为字符串结束了,结果后面的 s learn Python 就成了非法代码。
解决方法很简单:外层用双引号。
# 正确写法 1:外层用双引号print("let's learn Python")# 正确写法 2:外层用三引号print("""let's learn Python""")print('''let's learn Python''')
场景 2:字符串里有双引号
反过来,如果字符串里有双引号,外层就用单引号:
print('他说:"Python 真简单!"')
运行结果:
他说:"Python 真简单!"
一个快速记忆口诀
看引号:里面是什么,外面就换另一种。
简单吧?就是"我不能和你一样"的原则。
三、转义字符——让特殊字符"乖乖听话"
有时候你既要用单引号,又要用双引号——比如路径字符串:
E:\Python\new_features.txt
这里的反斜杠 \ 在 Python 中有特殊含义——它是转义字符的标志。
常见的转义字符
来看看实际效果:
print('转义字符中:\n表示换行;\r表示回车;\b表示退格')
运行结果:
转义字符中:表示换行;表示回车;表示退格
看到了吗?\n 变成了换行,\r 让光标回到行首(所以"转义字符中:"后面的内容被覆盖了),\b 退格了一个字符。
用转义来输出引号
有时候就是想让字符串里既有单引号又有双引号,这时候用转义字符 \:
# 字符串里同时含单引号和双引号print('let\'s learn Python')print("How do you spell the word \"Python\"?")print("E:\\Python\\new_features.txt")
运行结果:
let's learn PythonHow do you spell the word "Python"?E:\Python\new_features.txt
💡 小提示:转义字符就像告诉 Python"别把后面的字符当语法看待,把它当普通文本"。\' 就是"这里的单引号是文本,不是字符串边界"。
四、原始字符串——让反斜杠回归本真
如果字符串里有大量反斜杠,每个都要写成 \\ 很麻烦。这时候可以用原始字符串:
# 普通字符串print('E:\\Python\\new_features.txt')# 原始字符串——前面加 rprint(r'E:\Python\new_features.txt')
运行结果:
E:\Python\new_features.txtE:\Python\new_features.txt
原始字符串的写法是在引号前面加 r(raw 的缩写),告诉 Python"这个字符串里的反斜杠就是普通反斜杠,不要转义"。
何时使用原始字符串?
| |
|---|
| r'C:\Users\name\file.txt' |
| r'\d+\.\d+' |
| r'\n\t\r\b' |
# 对比:没有原始字符串的痛苦path = 'C:\\Users\\Administrator\\Documents\\file.txt'# 有了原始字符串path = r'C:\Users\Administrator\Documents\file.txt'
💡 小提示:写 Windows 路径时,推荐用原始字符串,可以省去很多双反斜杠的麻烦。
五、字符串的索引和切片——"拆"着用字符串
字符串本质上是字符的有序序列,所以你可以像排队一样给每个字符编号。
索引:拿到指定位置的字符
word = 'Python'print(word[0]) # P(正数索引从 0 开始)print(word[1]) # yprint(word[5]) # nprint(word[-1]) # n(负数索引从 -1 开始,从右往左数)print(word[-6]) # P
运行结果:
PynnP
索引规则:
P y t h o n 0 1 2 3 4 5 ← 正数索引 -6 -5 -4 -3 -2 -1 ← 负数索引
切片:拿到一段字符
切片就是"截取字符串的一部分",语法是 字符串[起始:结束:步长]:
word = 'Python'print(word[0:3]) # Pyt(从索引 0 到 3,不包含 3)print(word[:3]) # Pyt(省略起始,默认从 0 开始)print(word[3:]) # hon(省略结束,默认到结尾)print(word[:]) # Python(省略所有,就是完整字符串)print(word[0:5:2]) # Pto(步长为 2,隔一个取一个)print(word[::-1]) # nohtyP(反向取,常用技巧)
运行结果:
PytPythonPythonPtonohtyP
切片的核心口诀:
包头不包尾——起始包含,结束不包含。word[0:3] 取第 0、1、2 号字符,不取第 3 号。
常用切片技巧
text = 'Hello, Python!'# 取前 5 个字符print(text[:5]) # Hello# 取后 6 个字符print(text[-6:]) # ython!# 字符串反转(面试常考)print(text[::-1]) # !nohtyP ,olleH# 跳着取print(text[::2]) # Hlo yhn(每隔一个取一个)
六、字符串的常用操作
这部分先快速介绍几个基本操作,后面 4.3 会详细展开:
# len() —— 获取字符串长度text = 'Python'print(len(text)) # 6# in —— 判断子串是否存在print('Py'in text) # Trueprint('py'in text) # False(大小写敏感)# + —— 字符串拼接print('Hello' + ' ' + 'World') # Hello World# * —— 字符串重复print('Ha' * 3) # HaHaHa
运行结果:
6TrueFalseHello WorldHaHaHa
七、字符串的不可变性
这是新手容易踩的坑:字符串是不可变的。
text = 'Python'text[0] = 'J'# 报错!字符串不可修改
正确的做法是创建新字符串:
text = 'Python'new_text = 'J' + text[1:] # 'Jython'print(new_text)
运行结果:
Jython
⚠️ 重要:所有"修改"字符串的操作,实际上都是创建了一个新字符串,原字符串不变。这一点在性能敏感的场景下要注意。
小结
字符串是 Python 编程的基本功中的基本功,这一节主要讲了:
下一节,我们来看字符串的格式化——怎么把变量值插进字符串里,做出有动态内容的文本。