Python字符串是不可变Unicode序列,操作生成新对象;编码解码需区分str与bytes;高频方法应理解设计意图;正则仅在复杂模式时使用。

Python字符串的本质是不可变的Unicode字符序列,理解这一点是掌握所有字符串操作的基础。
字符串的不可变性:为什么修改会生成新对象
每次对字符串进行拼接、替换、切片等操作,Python都会创建一个全新的字符串对象,原字符串保持不变。这影响性能和内存使用,尤其在循环中频繁拼接时。
- 错误示范:s = "";for c in data: s += c(O(n²)时间复杂度)
- 正确做法:"".join(list_of_strings)(O(n)且内存友好)
- 验证方式:id(s) 查看对象内存地址,操作前后必然不同
编码与解码:中文乱码的根源与解决路径
字符串在内存中是Unicode,但存入文件或网络传输时需编码为字节(如UTF-8)。混淆str与bytes类型是乱码主因。
- "你好".encode("utf-8") → b'\xe4\xbd\xa0\xe5\xa5\xbd'(str → bytes)
- b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode("utf-8") → "你好"(bytes → str)
- 打开文件务必显式指定encoding,如open("f.txt", encoding="utf-8")
常用方法实战要点:不是背函数,而是懂意图
掌握strip()、split()、format()、f-string等高频方法的关键,在于明确它们的设计场景和边界行为。
立即学习“Python免费学习笔记(深入)”;
- strip()默认去除首尾空白,但会删掉所有匹配字符(如"xxabcxx".strip("x") → "abc")
- split()不带参数时按任意空白符分割并忽略空字段,"a b c".split() → ["a","b","c"]
- f-string支持表达式:f"{name.upper()} is {age + 1} next year"
正则进阶提示:用re模块前先问自己是否真需要
简单匹配优先用in、startswith()、endswith();固定分隔符用split();只有模式复杂、规则动态时才引入re。
- 提取邮箱:re.search(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", text)
- 注意贪婪匹配:".*" vs ".*?"(非贪婪)
- 预编译正则提升重复使用性能:pattern = re.compile(r"\d+")










