Python学习笔记(四)字符串型

时间:2020-12-07 14:37:42

字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。

在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言。

创建字符串很简单,只要为变量分配一个值即可


对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

如果知道字符的整数编码,还可以用十六进制这么写str

1 >>> '\u4e2d\u6587'
2 '中文'

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

Python对bytes类型的数据用带b前缀的单引号或双引号表示

1 >>> x = b'ABC'
2
3 >>> type(x)
4 <class 'bytes'>

注意区分'ABC'b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。

以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

 1 >>> 'ABC'.encode('ascii')
2 b'ABC'
3
4 >>> '中文'.encode('utf-8')
5 b'\xe4\xb8\xad\xe6\x96\x87'
6
7 >>> '中文'.encode('ascii')
8 Traceback (most recent call last):
9 File "<stdin>", line 1, in <module>
10 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

bytes中,无法显示为ASCII字符的字节,用\x##显示。

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

1 >>> b'ABC'.decode('ascii')
2 'ABC'
3
4 >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
5 '中文'

要计算str包含多少个字符,可以用len()函数:

1 >>> len('ABC')
2 3
3 >>> len('中文')
4 2

len()函数计算的是str的字符数,如果换成byteslen()函数就计算字节数:

1 >>> len(b'ABC')
2 3
3 >>> len(b'\xe4\xb8\xad\xe6\x96\x87')
4 6
5 >>> len('中文'.encode('utf-8'))
6 6

可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

在操作字符串时,我们经常遇到strbytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对strbytes进行转换。

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码

如果.py文件本身使用UTF-8编码,并且也申明了# -*- coding: utf-8 -*-,打开命令提示符测试就可以正常显示中文

访问字符串中的值

Python访问子字符串,可以使用方括号来截取字符串

1 >>> v1 = 'Hello World'
2 >>> v2 = "Hello Python"
3
4 >>> print("v1[0] is %s" % v1[0])
5 >>> print("v2[1:5] is %s" % v2[1:5])
6
7
8 v1[0] is H
9 v2[1:5] is ello

在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符

转义字符 描述
\(在行尾时) 续行符
\\ 反斜杠符号
\' 单引号
\" 双引号
\a 响铃
\b 退格(Backspace)
\e 转义
\000
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\oyy 八进制数,yy代表的字符,例如:\o12代表换行
\other 其它的字符以普通格式输出
\xyy 十六进制数,yy代表的字符,例如:\x0a代表换行

字符串运算符

变量a值为字符串"Hello",b变量值为"Python"为例:

操作符 描述 实例
+ 字符串连接 a + b 输出结果: HelloPython
* 重复输出字符串 a*2 输出结果:HelloHello
[] 通过索引获取字符串中字符 a[1] 输出结果 e
[ : ] 截取字符串中的一部分 a[1:4] 输出结果 ell
in 成员运算符 - 如果字符串中包含给定的字符返回 True H in a 输出结果 1
not in 成员运算符 - 如果字符串中不包含给定的字符返回 True M not in a 输出结果 1
r/R 原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母"r"(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 print r'\n' 输出 \n 和 print R'\n' 输出 \n
% 格式字符串  

实例:

执行结果为: