在Python开发中,字符串是最常用的数据类型之一。无论是处理用户输入、解析JSON、读写文件还是构建正则表达式,都离不开字符串。掌握其创建方式不仅能让代码更简洁,还能在循环拼接等场景下显著提升性能。本文将系统梳理Python字符串的六种创建方式、核心特性、编码解码及性能注意事项,并提供完整的代码示例。
一、六种创建字符串的方式
1.1 单引号与双引号
单引号和双引号在Python中完全等价,选择哪一种主要看字符串内部是否包含对应符号。例如,字符串中包含单引号时,使用双引号包裹可省去转义:- text = "I'm a developer" # 无需转义
- quote = '他说:"Python很有趣!"' # 双引号在字符串内部无需转义
复制代码 项目中建议保持一致风格,若字符串中同时出现单双引号,可用三引号或转义处理。
1.2 三引号(多行字符串)
三引号(''' 或 """)主要用于保留换行格式的多行文本,也常用于函数和类的文档字符串(docstring)。- poem = """静夜思
- 床前明月光,
- 疑是地上霜。"""
- print(poem) # 输出保留换行
复制代码 注意:三引号内的换行符会原样保留,若不需要换行可在一行内使用。
1.3 str() 构造函数
str() 可将数字、布尔值、列表、字典等任意对象转换为字符串。对于自定义类,可定义 __str__ 和 __repr__ 方法控制其字符串表示:- class Person:
- def __init__(self, name, age):
- self.name = name
- self.age = age
- def __str__(self):
- return f'{self.name}({self.age}岁)'
- def __repr__(self):
- return f"Person('{self.name}', {self.age})"
- p = Person('小明', 25)
- print(str(p)) # 小明(25岁)
- print(repr(p)) # Person('小明', 25)
复制代码
1.4 原始字符串(r-string)
在字符串前加 r 或 R 可关闭反斜杠转义,非常适合编写正则表达式和Windows路径:- path = r"C:\Users\小明\Documents" # 一个反斜杠即可
- import re
- pattern = r'\d{3}-\d{4}-\d{4}' # 匹配电话号码
复制代码 但注意:原始字符串末尾不能是单个反斜杠,否则会引发语法错误。
1.5 f-string(格式化字符串)
自Python 3.6起,f-string成为最推荐的格式化方式,支持内嵌表达式、方法调用、数字格式化及Python 3.8+的调试模式:- name = '小明'
- print(f'明年{age+1}岁') # 表达式求值
- print(f'π≈{3.14159:.2f}') # 保留两位小数
- print(f'{name=}') # Python 3.8+ 输出 name='小明'
复制代码
二、字符串的核心特性
2.1 不可变性
字符串一旦创建便无法修改,所有看似修改的操作(如索引赋值)都会返回新字符串。例如:- s = 'Pithon'
- # s[1] = 'y' # TypeError!
- s = s[:1] + 'y' + s[2:] # 正确做法,生成新字符串
复制代码
2.2 有序序列与Unicode支持
字符串按索引访问,支持切片和遍历。Python 3字符串原生使用Unicode,支持中文、日文、Emoji:- text = '你好'
- print(ord('中')) # 获取Unicode码点 20013
- print(chr(128013)) # 🐍
复制代码
三、转义字符与Unicode转义
常用转义包括 \n(换行)、\t(制表)、\\(反斜杠)、\'、\"。Unicode转义使用 \u(16位)和 \U(32位):- print('\u4e2d\u6587') # 中文(Unicode码点)
- print('\U0001f40d') # 🐍
复制代码
四、字符串拼接与性能优化
4.1 基本拼接
使用 + 拼接少量字符串方便快捷,但会因不可变性产生新对象。* 运算符可重复字符串:
4.2 隐式拼接
相邻的字符串字面量自动拼接,适用于拆解长字符串:- long_text = ('一行很长的字符串'
- '被分成多行书写')
复制代码
4.3 join() 方法:高性能拼接
当拼接大量字符串(如循环生成列表)时,join() 只需一次内存分配,速度远超 + 拼接。以下对比演示了性能差异:- import time
- words = ['hello'] * 10000
- # 低效的+拼接
- start = time.perf_counter()
- result = ''
- for w in words:
- result += w
- print('+拼接耗时:', time.perf_counter()-start)
- # 高效的join
- start = time.perf_counter()
- result = ''.join(words)
- print('join耗时:', time.perf_counter()-start)
复制代码 实际测试中,join 可能快上百倍。推荐做法:先用列表收集片段,最后用 join 一次合并。
五、编码与解码
5.1 str 与 bytes 的区别
str 是人类可读的Unicode文本;bytes 是原始字节序列。转换使用 encode / decode:- text = '你好,Python!'
- b = text.encode('utf-8') # str→bytes
- s = b.decode('utf-8') # bytes→str
复制代码
5.2 常见编码格式
UTF-8 是通用标准;GBK 在中文Windows环境常见但跨平台兼容性较差。文件操作时要显式指定编码:- with open('output.txt', 'w', encoding='utf-8') as f:
- f.write('中文内容')
复制代码
六、字符串类型判断
Python 提供了丰富的判断方法(isalpha、isdigit、isalnum、isupper 等),适用于输入校验:- def validate_password(pwd):
- if len(pwd) < 8:
- return False, '密码至少8位'
- if not any(c.isupper() for c in pwd):
- return False, '密码需包含大写字母'
- if not any(c.isdigit() for c in pwd):
- return False, '密码需包含数字'
- return True, '密码合格'
复制代码
七、总结
Python 字符串创建灵活多样:单/双引号适合短文本,三引号处理多行文档,str() 实现类型转换,r-string 简化正则与路径,f-string 让格式化更加直观。牢记字符串不可变性,大量拼接时使用 join() 避免性能陷阱。理解编码解码原理能有效预防乱码。掌握这些基础,将为文本处理和后续进阶打下坚实基础。 |