字符串的本质是:字符序列。Python 的字符串是不可变的,我们无法对原字符串做任何修改。但,可以将字符串的一部分复制到新创建的字符串,达到“看起来修改”的效果。
Python 不支持单字符类型,单字符也是作为一个字符串使用的。
第一部分
1、字符串编码
Python3 直接支持 Unicode,可以表示世界上任何书面语言的字符。Python3 的字符默认就是 16 位 Unicode 编码,ASCII 码是 Unicode 编码的子集。
使用内置函数 ord(String)可以把字符转换成对应的 Unicode 码;
使用内置函数 chr(unicode)可以把十进制数字转换成对应的字符。
例:1
2
3
4"蓝") # 将字符转换成对应的编码【注意,只能是字符,不能是字符串!】 ord(
34013
34013) # 将编码转换成字符 chr(
'蓝'
2、字符串创建
我们可以通过单引号或双引号创建字符串。例如:a=’abc’; b=”sxt”
使用两种引号的好处是可以创建本身就包含引号的字符串而不用使用转义字符。
使用函数 str() 函数可将其他类型转换为字符串类型,例如:str(3.14)
可以将数字3.14
转换成字符串'3.14'
例:1
2
3
4
5
6"I'm a student!" # 双引号之间的单引号不用转义直接可用 a =
print(a)
I'm a teacher!
>>> b = 'my_name is "蓝亭"' # 单引号之间的双引号不用转义直接可用
>>> print(b)
my_name is "蓝亭"
连续三个单引号‘‘‘
或三个双引号 ,可以帮助我们创建多行字符串,同时可以不用转义使用单/双引号。例:1
2
3
4
5
6
7''' name="蓝亭" resume =
company="sxt" age=18
lover="Lant"''' # 使用三个单引号或三个双引号可以让字符串跨行,同时可以不用转义使用单/双引号
print(resume)
name="蓝亭"
company="sxt" age=18
lover="Lant"
Python 允许空字符串的存在,不包含任何字符且长度为 0
例如:1
2
3'' c =
# len(String)函数用于获取指定字符串的长度 len(c)
0
3、转义字符
我们可以使用“+特殊字符”,实现某些难以用字符表示的效果。比如:换行等。
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\‘ | 单引号 |
\“ | 双引号 |
\b | 退格(Backspace) |
\n | 换行 |
\t | 横向制表符 |
\r | 回车 |
例如:1
2
3
4
5
6
7
8'I\nlove\nU' a =
print(a)
I
love
U
'aaabb\ # 行尾使用 \ 续行 print(
cccddd')
aaabbcccddd
4、字符串拼接
1. 可以使用+将多个字符串拼接起来。例如:’aa’+ ’bb’ 拼接成 ’aabb’。
(1) 如果+两边都是字符串,则拼接。
(2) 如果+两边都是数字,则加法运算。
(3) 如果+两边类型不同,则抛出异常
2. 可以将多个字面字符串直接放到一起实现拼接。例如:’aa’’bb’ 拼接成 ’aabb’
3.使用 * 可以实现字符串复制1
2
3
4
5
6
7
8'蓝亭'+'书序' a =
a
'蓝亭书序'
'蓝亭''书序' b =
b
'蓝亭书序'
"蓝亭书序" * 3 # 实现字符串的复制
'蓝亭书序蓝亭书序蓝亭书序'
5、从控制台获取输入
我们可以使用 input(String)`
从控制台读取键盘输入的内容,返回值即用户输入的内容。1
2
3
4"请输入名字:") # 获取用户输入,将值赋值到myname变量中 myname = input(
请输入名字:蓝亭
myname
'蓝亭'
6、使用[]提取字符
6.1、提取单个字符
字符串的本质就是字符序列,我们可以通过在字符串后面添加[],在[]里面指定偏移量,可以提取该位置的单个字符。
正向搜索:
最左侧第一个字符,偏移量是 0,第二个偏移量是 1,以此类推。直到 len(str)-1
为止。
反向搜索:
最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str)
为止。
【注意:字符串是“不可改变”的,我们通过[]可以获取字符串指定位置的字符,但是我们不能改变
字符串】1
2
3
4
5
6
7
8
9
10
11
12
13'abcdefghijklmnopqrstuvwxyz' a =
0] # 索引从0开始 a[
'a'
3] # 取索引为3,也就是第四个字符 a[
'd'
26-1] # 取最后一个字符 a[
'z'
-1] # 取最后一个字符 a[
'z'
-26] a[
'a'
3]='蓝' # 直接赋值将会报错 a[
TypeError: 'str' object does not support item assignment
字符串不可改变。但是,我们确实有时候需要替换某些字符。这时,只能通过创建新的字符串来实现。
整个过程中,实际上我们是创建了新的字符串对象,并指向了变量 a,而不是修改了以前的字符串。1
2
3'abcdefghijklmnopqrstuvwxyz' a =
'c','蓝') # 实际上是生成了一个新字符串,返回给a a = a.replace(
'ab蓝defghijklmnopqrstuvwxyz'
6.2、字符串切片 slice 操作
切片 slice 操作可以让我们快速的提取子字符串。标准格式为:[起始偏移量 start:终止偏移量 end:步长 step]
典型操作(三个量为正数的情况)如下:
操作和说明 | 示例 | 结果 |
---|---|---|
[:] 提取整个字符串 | “abcdef”[:] | “abcdef” |
[start:]从 start 索引开始到结尾 | “abcdef”[2:] | “cdef” |
[:end]从头开始知道 end-1 | “abcdef”[:2] | “ab” |
[start:end]从 start 到 end-1【包头不包尾】 | “abcdef”[2:4] | “cd” |
[start:end:step]从 start 提取到end-1,步长是 step | “abcdef”[1:5:2] | “bd” |
其他操作(三个量为负数)的情况:
示例 | 说 明 | 结果 |
---|---|---|
“abcdefghijklmnopqrstuvwxyz”[-3:] | 倒数三个 | “xyz” |
“abcdefghijklmnopqrstuvwxyz”[-8:-3] | 倒数第八个到倒数第三个(包头不包尾) | ‘stuvw’ |
“abcdefghijklmnopqrstuvwxyz”[::-1] | 步长为负,从右到左反向提取 | ‘zyxwvutsrqponmlkjihgfedcba |
切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始
偏移量小于 0 则会当做 0,终止偏移量大于“长度-1”会被当成-1。例如:1
2"abcdefg"[3:50] #50超过了字符串总长度,最终处理为字符串最大长度
'defg'
7、split()分割和 join()合并
7.1、split()分割
String.split("")
可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔
符,则默认使用空白字符(换行符/空格/制表符),例如:1
2
3
4
5"to be or not to be" a =
# 默认按照空白字符切割 a.split()
['to', 'be', 'or', 'not', 'to', 'be']
'be') # 按照be进行切割 a.split(
['to ', ' or not to ', '']
7.2、join()分割
String.join([])
的作用和 split()作用刚好相反,用于将一系列子字符串连接起来。例如:1
2
3'sxt','sxt100','sxt200'] a = [
'*'.join(a)
'sxt*sxt100*sxt200'
8、字符串格式化
8.1、format()基本用法
我们可以通过{索引} 或 {参数名},直接映射参数值,实现对字符串的格式化,非常方便。1
2
3
4
5
6
7
8
9
10
11"名字是:{0},年龄是:{1}" # 其中{0}、{1}是占位符 a =
"蓝亭",18) # 将 蓝亭 18分别赋值给两个占位符 a.format(
'名字是:蓝亭,年龄是:18'
"名字是:{0},年龄是{1}。{0}是个好小伙" # 同一个占位符可以多次引用 b =
"蓝亭",18) b.format(
'名字是:蓝亭,年龄是 18。蓝亭是个好小伙'
"名字是{name},年龄是{age}" # 使用名称占位符 c =
19,name='高淇') # 使用名称不用按照顺序填充占位符了 c.format(age=
'名字是高淇,年龄是 19'
填充常跟对齐一起使用^ < >
分别是居中、左对齐、右对齐,后面带宽度:
号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充1
2
3
4"{:*>8}".format("245") # *代表填充字符,> 表示向右靠齐,8表示字符长度为8
'*****245'
"我是{0},我喜欢数字{1:*^8}".format("蓝亭","666") # ^ 表示居中靠齐
'我是蓝亭,我喜欢数字**666***'
8.2、数字格式化
浮点数通过 f,整数通过 d 进行需要的格式化,例如:1
2
3"我是{0},我的存款有{1:.2f}" a =
"蓝亭",3888.234342) a.format(
'我是蓝亭,我的存款有 3888.23'
格式化总结如下:
数字 | 格式 | 输出 | 描述 |
---|---|---|---|
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | 3.14 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为 2) |
5 | {:x<4d} | 5xxx | 数字补 x (填充右边, 宽度为 4) |
10 | {:x<4d} | 10xx | 数字补 x (填充右边, 宽度为 4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00E+09 | 指数记法 |
13 | {:10d} | 13 | 右对齐 (默认, 宽度为 10) |
13 | {:<10d} | 13 | 左对齐 (宽度为 10) |
13 | {:^10d} | 13 | 中间对齐 (宽度为 10) |
9、其 他
9.1、字符串比较和同一性
1、我们可以直接使用==,!=对字符串进行比较,是否含有相同的字符。【比较的是内容】
2、我们使用 is / not is,判断两个对象是否同一个对象。比较的是对象的地址,即 id(obj1)是否和 id(obj2)相等。【比较的是是否是同一份内存空间】
9.2、成员操作符
in /not in 关键字,判断某个字符(子字符串)是否存在于字符串中,例如:1
2
3
4
5
6
7"abcdefghijklmnopq" a=
"abcd" in a
True
"蓝亭" not in a
True
"蓝亭" in a
False
9.3、可变字符串
在 Python 中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,智能创建新的字符串对象。但是,经常我们确实需要原地修改字符串,可以使用 io.StringIO对象或 array 模块。1
2
3
4
5
6
7
8
9
10
11
12import io # 导入模块
"hello,LANTING" s =
sio = io.StringIO(s)
sio.getvalue()
'hello, LANTING'
7) # 偏移指针到索引7(也就是指向A) sio.seek(
7
"g") sio.write(
1
sio.getvalue()
'hello,LgNTING'
第二部分
总结现有的一些内置函数
1、常见字符串函数
1 | len(String) # 获取字符串指定长度 |
2、格式相关函数
1 | String.ljust(width,补齐字符) # 获取固定长度,左对齐,右边不够用指定字符补齐(默认空格) |
3、字符串搜索相关函数
1 | String.find(待搜索字符串) # 搜索指定字符串,没有返回-1 |
4、字符串替换
1 | String.replace('old','new') # 替换old为new |
5、空格处理相关
1 | String.strip() # 去两边空格 |
6、字符串判断相关
1 | String.startswith('start') # 是否以start开头 |