喜欢小之的文章的能够关注公众号「WeaponZhi」持续关注动态 python
这是「AI 学习之路」的第 3 篇,「Python 学习」的第 3 篇设计模式
Python 字符串使用和 C 语言比较相似,但还有一些咱们值得注意的地方须要关注,用这篇文章来帮助你们掌握 Python 的字符串吧!架构
不论什么语言,咱们都须要考虑一下这个语言的编码问题。「ASCII」编码是咱们最熟悉的编码,但它只有 127 个字符被编码到计算机里面了,显然,像中日韩这类国家,语言文字比较特殊,就须要本身来指定编码格式。学习
好比,中国本身就制定了「GB2312」编码,韩文则是「EUC_KR」,俄语是「KOI8-R」,显然,若是每个国家都须要制做一个适配的编码,那咱们的计算机世界就要乱套了,不一样国家之间信息的传输将变的步履维艰。若是电脑里没有某个语言的编码,那就会产生乱码冲突,这是至关麻烦的。字体
因此,你们商量了一下,就作出了「Unicode」这么个编码格式,它干脆把全部的编码都统一了,只要你用 Unicode 它就能保证没有乱码问题。编码
但 Unicode 也有缺点。好比若是一个文件是纯英文来写的,那全部的字符实际上均可以用过 ASCII 的 8 位二进制来表示。咱们知道 Unicode 是经过补 0 来表示一些低位数的字符的,这样,为了保持兼容性,你实际上白白浪费了两倍的空间。spa
UTF-8 就是为了解决这样一个问题而出现的。它是一个**「可变长编码」**,你不是嫌空间浪费吗,那么如今只要你用了 UTF-8,今后之后英文字母咱就能够用 1 个字节来存储了,若是遇到像中文这种「高大上」但又比较复杂的字体,咱们灵活对待,用三个字节来表示,实在有某些更加变态而复杂的字体,那最多能够拓展到用 6 个字节来存储。总之,这样下去,既解决了兼容性问题,又能够节约资源,资源问题迎刃而解了。设计
Python 中的字符串是用 Unicode 编码的,因此 Python 能够支持多语言,当咱们保存的时候,咱们须要把 Unicode 转换为 UTF-8,使用的时候,再从文件中转换 UTF-8 到 Unicode 到内存中。3d
经过编码的这种演进过程,咱们是否是会有所启发呢?code
**你会发现,一切技术的产生和发展,都是为了解决问题而出现的。**你们若是细细的思考一下,不管是语言、技术、设计模式、架构,实际上他们的发展过程并非一个凭空的技术升级行为,而是为了解决某种问题而诞生的。
「GB2312」是为了解决 ASCII 没有中文而才创造出来的,「Unicode」是由于各国语言不兼容而创造出来的。而 Unicode 对于资源的浪费又促成了 UTF-8 的产生。最典型的问题驱动技术,就是设计模式了,设计模式的产生实际上就是各类为解决某些特定问题而总结出来的方案。
因此在技术上,遇到问题并不可怕,问题偏偏是最能帮助本身提高的,问题是创造力的源头之一。咱们同时在平时看书的时候,也要抱着解决问题的角度来学习,若是你单纯的去读一本技术书,这本书又只有理论和代码,你会以为很枯燥。若是书里能够结合一些案例和问题,从这里展开讲解,而后再介绍一些解决方案和代码,这种教学方式效果就会特别好。好比我以前看过的一本书「Android 源码设计模式」,它就是用这种方式来进行展开的说明设计模式的场景,看完了这本书后,之后面对某种场景,我就特别容易回想起以前书中写过的一些场景,从而产生记忆联想。
不只如此,若是想的再深一点,你就会忽然醒悟,实际上人类社会好像也是以这种形式来发展的...
是否是有点扯远了?咱们仍是来看看字符串吧。
Python 的字符串和 C 语言有些相似。咱们简单的把经常使用的用法介绍一下便可,平时只要多写几回,就能比较熟练的掌握了(此节引用廖雪峰教程示例,做了简化)。
使用 ord() 获取字符的整数表示,chr() 则是把编码转化为字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
复制代码
用带「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 计算字符串的字符数或者 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%'
复制代码
欢迎关注个人公众号