Python的字符串类型,看完你还不知道就真不知道怎么帮你了

Python的另外一个常用的内置类型是字符串类型-str。它常用于表示一个字符,一个单词,一句话或者一段话。如果你想在计算机里定义一个变量来表示人名,那么该变量的类型就应该是str

本文将从以下几个方面来介绍Python中的字符串类型

  • 定义str变量
  • 操作str变量
  • str的编码

定义str变量

以下例子定义了2个字符串变量,分别是str1str2

str1 = 'I love digwebs'
print(str1)
str2 = "我爱digwebs"
print(str2)

你也可以使用以下方式来定义多行字符串,示例如下所示:

>>> a = """
... I love digolds
... 我爱digolds
... """
>>> print(a)

I love digolds
我爱digolds

操作str变量

操作str变量的方法有很多,其中拼接字符串和替换子字符串操作会经常用到。接下来将通过几个例子来介绍这些字符串操作。

拼接字符串的示例如下所示:

>>> str1 = "I love"
>>> str2 = "China"
>>> ss = str1 + ' ' + str2
>>> print(ss)
I love China

你也可以通过数组的方式拼接字符串,示例如下所示:

>>> l = ['I', 'love', 'China']
>>> s = ' '.join(l)
>>> print(s)
I love China

替换字符串的操作经常会用到,比如,你想把一个人的完整信息打印出来,这些信息可能包含年龄,性别,名字等等。如果要把这些信息组合在一起,则需要用到字符串替换操作。下面将通过以下几个示例来说明该操作。

以下是通过转义字符%s来替换字符串:

>>> "My name is %s, and my age is %s year old" % ("Digolds", 1)
'My name is Digolds, and my age is 1 year old'

以下是通过f-strings来替换字符串:

>>> name = "Digolds"
>>> age = 1
>>> f"My name is {name}, and my age is {age} year old"
'My name is Digolds, and my age is 1 year old'

以下是通过replace函数来查找和替换匹配的子字符串:

>>> "I love China".replace("China", "USA")
'I love USA'

str的编码

要想正确使用str变量,则必须对其背后的编码有正确的认识,尤其是处理多语言的问题。为了理解字符串编码问题,你得先了解字符集编码,它对每一个字符指定了一个唯一的编码,不同编码一起构成了整个字符集编码。常见的字符集编码有:ASCIIUnicodeUTF-8

其中ASCII为a ~z,A~Z,0~9等字符进行了编码。也就是说每一个字符均有对应的数字(比如A字符对应的编码是65,如下图所示),所有字符的编码集合在一起就形成了ASCII

这个编码方案只支持英文,除此之外,这套编码方案一共对128个字符进行了编码,编码的范围是(0~127),这些字符包括了可见字符(a、>、9)和不可见字符(DEL、NULL)。我们可以根据上述表格显示对应字符的十进制和16进制编码,具体代码如下所示:

>>> ord('A')
65
>>> hex(65)
'0x41'

ASCII编码的字符可知,这套编码方案只支持英文,为了支持其它国家的语言,就需要另外一套编码方案,这个方案就是Unicode,你可以访问East Asian Scripts东亚板块来看看中文的编码方案。Unicode编码方案的特征是,对每一个字符至少会用2个字节来编码,比如字符对应的编码为353D,读者可以访问这里查找这个字符的编码。

>>> hex(ord('㔽'))
'0x353d'

虽然Unicode编码能够解决多语言的问题,但是由于占用了过多的字节,最终导致传输和存储这些编码会占用大量带宽和存储空间。为了解决这个问题,需要提出另外一套编码方案:UTF-8,这套编码方案包括了所有国家的语言,此外它解决了字符占用过多字节的问题。接下来让我们看看字符所对应的UnicodeUTF-8的编码。

>>> hex(ord('㔽'))
'0x353d'
>>> '㔽'.encode('utf-8')
b'\xe3\x94\xbd'
>>> '㔽'.encode('utf-8').decode('utf-8')
'㔽'

接下来让我们想想ASCIIUnicodeUTF-8是如何被应用的。ASCII经常出现在计算机程序中,比如Python中自带的函数ord就可以取得某个字符的编码,再比如计算机的键盘上的字符对应的是ASCII编码。计算机程序运行的时候需要依赖内存,而计算机程序处理的数据统一以Unicode编码的格式放置在内存里。这些数据一般都是以UTF-8的格式存储在程序外部,比如本地文件或者服务器。当程序运行时会读取本地文件或者服务器文件,紧接着将文件中的数据从UTF-8编码格式转化成Unicode编码格式,最终程序所依赖的内存存储了这些以Unicode为编码格式的数据,供给程序运行和处理。读者可以到这里去理解Unicode编码。读者也可以参考下图,以便更好的理解字符串编码问题。图片来源的文章也可以帮助你理解

接下来,我们用一个例子来说名str的编码问题。假设有一个文件data.src,和一个文件unicode_demo.py。它们的内容分别如下:

data.src

你好!Digwebs

unicode_demo.py

>>> f = open('data.src','rb')
>>> bytes_read = f.read()
>>> type(bytes_read)
<class 'bytes'>
>>> bytes_read
b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81Digwebs\n'
>>> bytes_read.decode('utf-8')
'你好!Digwebs\n'
>>> f.close()
>>> f = open('data.src','r')
>>> bytes_read = f.read()
>>> type(bytes_read)
<class 'str'>
>>> bytes_read
'你好!Digwebs\n'
>>> f.close()
>>> 

以上代码片段有以下几个关键点:

  1. f = open('data.src','rb')会导致直接从文件中读取二进制内容,内容的编码由文件本身来决定。
  2. f = open('data.src','r')会导致读取到程序中的数据的编码格式为Unicode
  3. data.src中的内容是以UTF-8格式进行编码的。
  4. str类型有2个方法,encode和decode。encode(utf-8)是将Unicode编码转化成UTF-8编码;decode(utf-8)是将UTF-8编码转化成Unicode编码。

总结

本文介绍了Python的内置类型-字符串,如何定义字符串变量,字符串的常用操作以及字符集编码。到目前为止,我们已经学习了一些基本类型,也可以使用这些类型来自定义更加复杂的类型,但是这些类型没法表示集合,现在,让我们把目光转向Python的集合类型-list。

举报
评论 0