AI 学习之路——轻松初探 Python 篇(三)

这是「AI 学习之路」的第 3 篇,「Python 学习」的第 2 篇

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

如果你需要使用 % 这个字符显示在字符串中,那么就需要转义了,%% 表示一个 %

>>> '小之公众号的点赞率竟然超过了 %d%%' % 50
'小之公众号的点赞率竟然超过了 50%'

原文发布于微信公众号 - WeaponZhi(WeaponZhi)

原文发表时间:2017-11-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WeTest质量开放平台团队的专栏

深度了解Android即将支持的Java 8,你准备好了吗?

Java 9预计今年也会正式发布,Java 8这个最具变革性且变革性最适于GUI程序的版本,Android终于准备正式支持。从自己开发JavaFx的感受,说一说...

792
来自专栏java学习

Java每日一题_关于变量的使用

答:在【类里面】声明的变量叫全局变量,全局变量也叫成员变量,全局变量,在全局作用域下申明的变量没有被手动赋值的却在程序中被使用的情况下,将被赋予初值:

593
来自专栏iOS技术

何为代码质量?——用脑子写代码引言正文总结

为什么项目维护困难、BUG 反复?实际上很多时候就是代码质量的问题。代码架构就像是建筑的钢筋结构,代码细节就像是建筑的内部装修,建筑的抗震等级、简装或豪装完全取...

502
来自专栏IT派

10 个技巧,让你更专业地使用 console 进行 JS 调试

首先,我必须承认这一点,我将利用这个平台从我的开发环境中清理出骨架(轮廓)。有时候,我所做的“魔法”(有些人称之为“编码”),并不像我的同事在为他们展示这些宏伟...

830
来自专栏Albert陈凯

Hadoop离线数据分析平台实战——410事件分析Hadoop离线数据分析平台实战——410事件分析

Hadoop离线数据分析平台实战——410事件分析 项目进度 模块名称 完成情况 用户基本信息分析(MR)� 完成 浏览器信息分析(MR) 完...

3508
来自专栏Android知识点总结

06--图解数据结构之递归小例子

794
来自专栏魏琼东

DotNET企业架构应用实践-系统架构与性能-在业务中实例使用缓存与缓存查询-附上视频

回顾与说明      本文是DotNET企业架构应用实践系列中的一篇文章,同时也是一步一步教你使用AgileEAS.NET基础类库进行应用开发系统中的一篇文章,...

2349
来自专栏IMWeb前端团队

基于flux和observer相结合的思想的数据管理器

Redux和MobX是前端领域最前沿的两个状态管理library,前者遵循Flux思想,后者独树一帜,不过可以认为继承了observer思想。在具体本文的阐述前...

1846
来自专栏SeanCheney的专栏

Awesome Asyncio 《碉堡的Asyncio·中文版》Awesome-Asyncio-CN

Awesome-asyncio 是 Timo Furrer 发起并维护的 Python Asyncio 资源列表。本项目是其中文版,在这里,收集了大量的 Asy...

1273
来自专栏企鹅号快讯

Python数据类型之字符串第三季

Python字符串的格式化 大家可能也已经看到了 字符串在本系列课程中 常老师已经和大家一起探讨了好几节课了 何时为什么呢?? 大家别嫌磨叽(同音可能不同字)啊...

1779

扫码关注云+社区