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 条评论
登录 后参与评论

相关文章

来自专栏IT派

程序员们,再不升级 Java 10 就晚了!

正如我们大家都知道的,Java 的最新版本已经来到了10。本文将重点介绍当前正在开发的一些有趣的 Java 新功能。

572
来自专栏编程

Python萌新在九九乘法表中栽过的跟头

对于一个只听过一节python视频课的新手,写出九九乘法表毫无疑问是一件充满挑战的事情,所以写之前我在菜鸟教程中看了一些基础知识,看了点儿之后觉得不是特别难,于...

1788
来自专栏Nian糕的私人厨房

腾讯课堂 IMWeb 七天前端求职提升营 Day 4

本次的系列博文主要是针对 腾讯课堂七天前端求职提升营 课程中,所推送的面试题目及编程练习的一次汇总,期间还包括三次直播课的分享,均由腾讯导师给大家讲解,该系列博...

633
来自专栏LEo的网络日志

coding感想(一)

34711
来自专栏CRPER折腾记

一篇不大靠谱的常用正则表达式汇总(前端)

我没有那么多奇奇怪怪的正则,这些都是工作中很常见的, 所有正则都是经过真实环境下的考验,不是假想推断的正则....

673
来自专栏Java成神之路

计算字符串相似度算法——Levenshtein

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。

351
来自专栏web前端教室

今天-零基础课的教学事故及全过程

有什么说什么,有错了就要认。 “今天我有个地方讲错了”,“然后我还说提出问题的同学有点过于纠结”。出问题要说清楚,来,事情是这样的。。。 ? 截图一中,点击事件...

1606
来自专栏窗户

shell编程/字库裁剪(3)——验证

  程序写完了,必须要验证,这是重要的方法论。因为如果不验证,则不会知道程序写的对还是不对。学过人工智能或者控制论都知道,反馈非常重要,反馈形成闭环,可以用来指...

19210
来自专栏点滴积累

使用 Cesium 动态加载 GeoJSON 数据

前言 需求是这样的,我需要在地图中显示 08 年到现在的地震情况,地震都是发生在具体的时间点的,那么问题就来了,如何实现地震情况按照时间动态渲染而不是一次全部加...

3655
来自专栏aCloudDeveloper

python学习总结

最近经学长介绍学习python,为研究生做研究做准备,python对于科学计算有着很高的效率,对于科研人员当然是有着很强的诱惑,虽然我还没真正用它,但从整个学习...

1785

扫描关注云+社区