2.4. 字符串¶
字符串(string)是写在引号之间的一串 Unicode 字符。单引号和双引号是等价的——选择能让你避免转义文本内部引号的那种风格:
name = "OpenMV Cam"
company = 'OpenMV, LLC'
message = "She said \"hi\"" # both styles can be used
same = 'She said "hi"'
三引号字符串("""...""" 或 '''...''')可以跨多行,并按字面保留其中的换行符:
banner = """boot ok
firmware v1.28
"""
print(banner)
输出:
boot ok
firmware v1.28
2.4.1. 转义序列¶
在普通字符串中,\ 用于引入一个特殊字符:
\n—— 换行符\t—— 制表符\\—— 一个字面的反斜杠\'/\"—— 一个字面的引号(在它本会结束字符串的情况下使用)\xHH—— 十六进制编码为HH的字符\uHHHH—— Unicode 码点HHHH对应的字符
当字符串包含许多反斜杠时,可在字面量前加上 r 前缀使其成为原始(raw)字符串。这样反斜杠就会按字面对待——\n 保持两个字符的长度,而不会被替换成换行符:
win_path = r"C:\Users\OpenMV\camera.py"
literal = r"\n is two characters, not a newline"
2.4.2. 拼接与重复¶
用 + 连接两个字符串;用 * 重复一个字符串:
greeting = "Hello, " + name + "!"
line = "-" * 40 # 40-character separator
在循环中反复使用 + 会在每次迭代时分配一个新字符串。要从许多片段构建较大的字符串,请使用 str.join()。
2.4.3. 长度、索引与切片¶
len() 返回字符串中的字符数。用 [] 索引可返回给定位置上的单字符字符串;负索引则从末尾开始计数:
>>> s = "OpenMV"
>>> len(s)
6
>>> s[0]
'O'
>>> s[-1]
'V'
切片 s[start:stop] 返回从位置 start 开始、直到但不包括 stop 的子串。两端中任意一端都可以省略,表示“开头”或“结尾”,可选的第三个值 s[start:stop:step] 则让你跳过部分字符。
切片位置位于字符之间。s[2:5] 选取位置 2、3 和 4 上的字符。¶
>>> s = "OpenMV"
>>> s[2:5]
'enM'
>>> s[:3]
'Ope'
>>> s[3:]
'nMV'
>>> s[::-1]
'VMnepO' # whole string, reversed
越界的切片会静默返回存在的那部分内容——s[100:200] 是空字符串 "",而不是报错。另一方面,越界索引则会引发 IndexError。
2.4.4. 不可变性¶
字符串无法就地修改。那些看起来像是在修改字符串的操作,实际上会返回一个新字符串,而原字符串保持不变:
>>> name = "OpenMV"
>>> name.upper()
'OPENMV'
>>> name
'OpenMV' # unchanged
要“改变”一个字符串,需将名称重新绑定到新值:name = name.upper()。