这是「AI 学习之路」的第 3 篇,「Python 学习」的第 3 篇
Python 字符串使用和 C 语言比较类似,但还有一些我们值得注意的地方需要关注,用这篇文章来帮助大家掌握 Python 的字符串吧!
编码
不论什么语言,我们都需要考虑一下这个语言的编码问题。「ASCII」编码是我们最熟悉的编码,但它只有 127 个字符被编码到计算机里面了,显然,像中日韩这类国家,语言文字比较特殊,就需要自己来指定编码格式。
比如,中国自己就制定了「GB2312」编码,韩文则是「EUC_KR」,俄语是「KOI8-R」,显然,如果每一个国家都需要制作一个适配的编码,那我们的计算机世界就要乱套了,不同国家之间信息的传输将变的寸步难行。如果电脑里没有某个语言的编码,那就会产生乱码冲突,这是相当麻烦的。
所以,大家商量了一下,就做出了「Unicode」这么个编码格式,它干脆把所有的编码都统一了,只要你用 Unicode 它就能保证没有乱码问题。
但 Unicode 也有缺点。比如如果一个文件是纯英文来写的,那所有的字符实际上都可以用过 ASCII 的 8 位二进制来表示。我们知道 Unicode 是通过补 0 来表示一些低位数的字符的,这样,为了保持兼容性,你实际上白白浪费了两倍的空间。
UTF-8 就是为了解决这样一个问题而出现的。它是一个「可变长编码」,你不是嫌空间浪费吗,那么现在只要你用了 UTF-8,从此以后英文字母咱就可以用 1 个字节来存储了,如果遇到像中文这种「高大上」但又比较复杂的字体,我们灵活对待,用三个字节来表示,实在有某些更加变态而复杂的字体,那最多可以拓展到用 6 个字节来存储。总之,这样下去,既解决了兼容性问题,又可以节约资源,资源问题迎刃而解了。
Python 中的字符串是用 Unicode 编码的,所以 Python 可以支持多语言,当我们保存的时候,我们需要把 Unicode 转换为 UTF-8,使用的时候,再从文件中转换 UTF-8 到 Unicode 到内存中。
通过编码的这种演进过程,我们是不是会有所启发呢?
你会发现,一切技术的产生和发展,都是为了解决问题而出现的。大家如果细细的思考一下,不论是语言、技术、设计模式、架构,实际上他们的发展过程并不是一个凭空的技术升级行为,而是为了解决某种问题而诞生的。
「GB2312」是为了解决 ASCII 没有中文而才创造出来的,「Unicode」是因为各国语言不兼容而创造出来的。而 Unicode 对于资源的浪费又促成了 UTF-8 的产生。最典型的问题驱动技术,就是设计模式了,设计模式的产生实际上就是各种为解决某些特定问题而总结出来的方案。
所以在技术上,遇到问题并不可怕,问题恰恰是最能帮助自己提升的,问题是创造力的源头之一。我们同时在平时看书的时候,也要抱着解决问题的角度来学习,如果你单纯的去读一本技术书,这本书又只有理论和代码,你会觉得很枯燥。如果书里可以结合一些案例和问题,从这里展开讲解,然后再介绍一些解决方案和代码,这种教学方式效果就会特别好。比如我之前看过的一本书「Android 源码设计模式」,它就是用这种方式来进行展开的说明设计模式的场景,看完了这本书后,以后面对某种场景,我就特别容易回想起之前书中写过的一些场景,从而产生记忆联想。
不仅如此,如果想的再深一点,你就会突然醒悟,实际上人类社会好像也是以这种形式来发展的...
是不是有点扯远了?我们还是来看看字符串吧。
字符串
Python 的字符串和 C 语言有些类似。我们简单的把常用的用法介绍一下即可,平时只要多写几次,就能比较熟练的掌握了(此节引用廖雪峰教程示例,作了简化)。
ord() 和 chr()
使用 ord() 获取字符的整数表示,chr() 则是把编码转化为字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
bytes
用带「b」前缀的单引号或者双引号字符来表示「bytes」类型的数据,非常方便
x = b'ABC'
encode() 和 decode()
开发的时候,经常要把 str 和 bytes 进行相互转换, str 通过 encode() 转化为 bytes,bytes 通过 decode() 转化为 str
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Trace back (most recent call last):
File "<stdin>", line 1, in<module>
UnicodeEncodeError
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'
'中文'
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Tradeback(most recent call last):
...
UnicodeDecodeError
这里要注意容错,encode 不能转化超过参数编码范围的字符,而如果 bytes 中包含编码格式无法解析的字符,decode() 也会报错。
len()
通过 len 计算字符串的字符数或者 bytes 的字节数
>>> len('ABC')
3
>>> len('中文')
2
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x87')
6
>>> len('中文'.encode('utf-8'))
6
从输出结果发现,中文占 3 个字节,英文占 1 个字节
声明编码格式
如果希望 Python 解释器可以按 UTF-8 编码来读取 .py 文件,需要在文件中声明
#1 /usr/bin/env python3
# -*- coding: utf-8 -*-
第一行只对 Linux/OS X 有效,它告诉系统这是一个 Python 可执行程序。第二行则告诉 Python 解释器,这个文件要按照 UTF-8 编码。如果不这样写,中文输出会有乱码。
字符串格式化
格式化和 C 有点像,用「%」实现
>>> 'Hello,%s' % 'world'
'Hello , world'
>>> '你好%s,你有 ¥%d 吗' % ('小之',50)
'你好小之,你有 ¥50 吗'
占位符中,%d 代表整数,%f 代表浮点数,%s 代表字符串,%x 代表十六进制整数,占位符要和 % 号后面的变量或者值一一对应,如果只有一个占位符,% 号后不需要括号。
占位符还可以控制空格、小数点和补 0 的位数。比如:
>>> print('%2d-%02d' % (5,1))
5-01
>>> print('%.2f' % 3.1415)
3.14
注意,「5-01」中,5 的前面是有两个空格的。
如果你需要使用 % 这个字符显示在字符串中,那么就需要转义了,%% 表示一个 %
>>> '小之公众号的点赞率竟然超过了 %d%%' % 50
'小之公众号的点赞率竟然超过了 50%'
加入我们一起学习 AI,现在群的氛围很好,质量很高,上面是二维码,请备注「AI」