字符串(str)在 Python 中用于表示文本:字符按顺序排列,可通过下标与切片访问其中一段。本节说明字面量写法、正负下标与切片规则、不可变性的含义,以及拼接、重复、f-string 格式化与常见成员判断,为下一篇字符串方法打基础。

与列表不同,字符串创建后不能对单个字符原地赋值。若需修改内容,应通过拼接或切片生成新的 str 对象。

定义字符串

单引号、双引号与三引号均可界定字符串,语义等价,三引号适合书写跨行文本:

s1 = 'hello'
s2 = "hello"
s3 = """跨行的
字符串"""
print(s1, s2)
print(s3)

下标访问

正下标从 0 起算,负下标从右端计数,-1 表示最后一个字符:

P 0 / -6 y 1 / -5 t 2 / -4 h 3 / -3 o 4 / -2 n 5 / -1 name = "Python":正下标从 0 数,负下标从 -1 往左数
name[0] 取到 P,name[-1] 取到 n。负下标即从右端计数,-1 为最后一个字符。
name = "Python"
print(name[0])    # P
print(name[1])    # y
print(name[-1])   # n,负下标从右往左数
print(name[-2])   # o

切片 [start:stop:step]

切片取出子串,区间为含起始、不含结束。省略 start 表示从开头起,省略 表示至末尾,step 为负时可得到逆序子串:

s = "Hello World"
print(s[0:5])     # Hello(0 到 4)
print(s[:5])      # Hello(start 省略从 0 开始)
print(s[6:])      # World(stop 省略到末尾)
print(s[::2])     # HloWrd(隔一个取一个)
print(s[::-1])    # dlroW olleH(反转)

字符串是不可变的

对某下标直接赋值将触发 TypeError。常见做法是通过切片重组,或把新串赋回变量名:

s = "Hello"
# s[0] = "J"    # TypeError,不能这样改

s = "J" + s[1:]  # 重新拼一个
print(s)         # Jello

常用操作

text = "  hello world  "

print(len(text))          # 16,含两头的空格
print(text.strip())       # "hello world",去掉首尾空白
print(text.upper())       # "  HELLO WORLD  "
print(text.lower())       # "  hello world  "
print("hello" in text)    # True,成员判断
print(text.replace("world", "python"))  # "  hello python  "

拼接与重复

a = "Py"
b = "thon"
print(a + b)        # Python
print(a * 3)        # PyPyPy
print(", ".join(["a", "b", "c"]))  # a, b, c

格式化:f-string

自 Python 3.6 起,推荐在字符串字面量前加 f,在大括号内写变量或表达式:

Python f-string 格式化输出示例运行
name = "小明"
age = 20
print(f"你好,{name},明年{age + 1}岁")

score = 88.5
print(f"成绩:{score:.1f}")   # 成绩:88.5

检查与判断

s = "abc123"
print(s.isalnum())    # True,全字母数字
print("123".isdigit())  # True,全数字
print("abc".isalpha())  # True,全字母
print("Abc".isupper())  # False

试着练切片

读入一个字符串,用切片输出其逆序,并统计长度与元音字母个数。

本节说明了 Python 中字符串的定义、下标与切片、不可变性及基本格式化。下一篇介绍字符串方法:查找、替换、拆分与字符类别判断等接口。