温故而求知新:浅谈Python的字符串

温故而求知新:浅谈Python的字符串,第1张

《详解Python拼接字符串的七种方式》这篇推文里,我提到过,字符串是程序员离不开的事情。后来,我看到了一个英文版本的说法:

There are few guarantees in life: death, taxes, and programmers needing to deal with strings.

它竟然把程序员处理字符串跟死亡大事并列了,可见这是多么命中注定……

回头看其它文章,我发现这种说法得到了佐证,因为我在无意中已零零碎碎地提及了字符串的很多方面,例如:字符串读写文件、字符串打印、字符串不可变性、字符串Intern机制、字符串拼接、是否会取消字符串,等等。而这些,还只能算字符串面目的冰山一角。

既然如此,那干脆再单独写写Python的字符串吧。这篇内容可能会很基(li)础(lun),并不是什么“骚 *** 作”或“冷知识”,权当是一份温故而求知新的笔记。

1 Python字符串是什么?

根据维基百科定义:字符串是由零个或多个字符组成的有限序列。而在Python 3中,它有着更明确的意思:字符串是由Unicode码点组成的不可变序列(Strings are immutable sequences of Unicode code points.)

字符串是一种序列,这意味着它具备序列类型都支持的 *** 作:

# 以下的s、t皆表示序列,x表示元素
x in s  # 若s包含x,返回True,否则返回False
x not in s  # 若s包含x,返回False,否则返回True
s + t  # 连接两个序列
s * n  # s复制n次
s[i]   # s的索引第i项
s[i:j] # s切片从第i项到第j-1项
s[i:j:k]  #  s切片从第i项到第j-1项,间隔为k
len(s)  # s的长度
min(s)  # s的最小元素
max(s)  # s的最大元素
s.index(x) # x的索引位置
s.count(x)  # s中出现x的总次数

字符串序列还具备一些特有的 *** 作,限于篇幅,按下不表。

字符串序列是一种不可变序列,这意味着它不能像可变序列一样,进行就地修改。例如,在字符串“Python”的基础上拼接“Cat”,得到字符串“PythonCat”,新的字符串是一个独立的存在,它与基础字符串“Python”并没有关联关系。

basename = "Python"
myname = basename + "Cat"
id(basename) == id(myname) >>> False

# 作为对比,列表能就地修改
baselist = ["Python"]
baselist.append("Cat")
print(baselist) >>> ['Python', 'Cat']

字符串这种序列与其它序列(如列表、元组)的不同之处在于,它的“元素”限定了只能是Unicode码点。Unicode码点是什么呢?简单理解,就是用Unicode编码的字符。那字符是什么呢?字符是人类书写系统的各类符号,例如阿拉伯数字、拉丁字母、中文、日文、藏文、标点符号、控制符号(换行符、制表符等)、其它特殊符号(@#¥%$*等等)。那Unicode编码又是什么呢?Unicode别名是万国码、国际码,它是一种适用性最广的、将书写字符编码为计算机数字的标准。

总所周知,在最底层的计算机硬件世界里,只有0和1。那么,怎么用这个二进制数字,来表示人类的文化性的字符呢?这些字符数量庞大,而且还在日益增长与变化,什么样的编码方案才是最靠谱的呢?

历史上,人类创造了多种多样的字符编码标准,例如ASCII(1963年)编码,以西欧语言的字符为主,它的缺点是只能编码128个字符;例如GB2312(1981年),这是中国推出的编码标准,在兼容ASCII标准的基础上,还加入了对日文、俄文等字符的编码,但缺点仍是编码范围有限,无法表示古汉语、繁体字及更多书写系统的字符。

Unicode编码标准于1991年推出,至今迭代到了第11版,已经能够编码146个书写系统的130000个字符,可谓是无所不包,真不愧是“国际码”。Unicode编码其实是一个二进制字符集,它建立了从书写字符映射成唯一的数字字符的关系,但是,由于各系统平台对字符的理解差异,以及出于节省空间的考虑,Unicode编码还需要再做一次转换,转换后的新的二进制数字才能作为实际存储及网络传输时的编码。

这种转换方式被称为Unicode转换格式(Unicode TransformaTIon Format,简称为UTF),它又细分为UTF-8、UTF-16、UTF-32等等方式。我们最常用的是UTF-8。为什么UTF-8最常用呢?因为它是可变长度的编码方案,针对不同的字符使用不同的字节数来编码,例如编码英文字母时,只需要一个字节(8个比特),而编码较复杂的汉字时,就会用到三个字节(24个比特)。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/dianzi/2474651.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-08-04
下一篇2022-08-04

发表评论

登录后才能评论

评论列表(0条)

    保存