0基础学Python之五:字符串(上)

Hi 大家好,我是王可乐。前面的课程里,可乐带领大家熟悉了 Python 中的数字、运算和变量,大家应该已经学会了使用 Python Shell 来和这些数学运算打交道。今天的课程里,我们暂时告别这些数学知识,来学习一下编程时另一个经常用到的概念——字符串。

在第二课的猜数字游戏里,我们已经用了几个中文字符串来提示用户输入、提醒用户猜的数字是大了还是小了或者是猜中了。简单地说,字符串就是一串字符,我们一起来打开 Python Shell 看一下:

输入 '(单引号)Hello, world!(叹号)'(后引号),回车。这里,引号里面的内容就是一个字符串。我们来看一下它的类型,输入 type('Hello, World!'),回车,可以看到 Python 中的字符串的类型叫做 str。在 Python 中,以及很多编程语言中,字符串都要用引号来包裹起来,引号里面的内容才是字符串的内容。

字符串中可以是任意的内容,如果需要在字符串中使用引号自己,那我们就应该让Python解释器明白,这个引号并不是字符串的结尾。具体做法是,用 \(反斜线) 符号把字符串内部的引号标记出来,这个过程叫做转义。例如我们看一下这个例子:

输入 'I\'m feeling very depressed.',回车。这个字符串中包含一个单引号,因此我们需要用反斜线把这个单引号转义。如果不对字符串内的引号转义,那 Python 就认为这个字符串到 I 就结束了,而后面出现的 m 等这些字符 Python 表示无法理解,会给我们汇报一个语法错误。

Python 允许使用单引号和双引号来包裹字符串,它们用起来几乎是一样的,只有一点:在单引号包裹的字符串中如果有双引号,那么双引号不用转义;反过来也一样,用双引号包裹的字符串里就可以自由地使用单引号了。例如上面的例子:"I'm feeling very depressed." 用双引号的话,写起来就方便多了。

使用单引号或双引号书写的字符串通常都不会太长,一般也不会跨多行。如果要在 Python 中直接输入较长并且跨多行的字符串,可以使用三个引号连用的办法,例如:

输入 '''README(回车,我们看到 Shell 的 >>> 变成了 ...,提示我们继续输入,我们输入)

Line 1(回车)

Line 2(回车)

Line 3(回车,最后我们用三引号结束这个字符串)

''',回车。

可以看到,使用三引号可以很方便的输入大段大段的字符串内容。不过为什么我们的字符串显示成了下面这个奇怪的样子呢?我们的换行去哪里了?

实际上,我们刚才一直在使用 Python Shell 来查看字符串的内容,而更标准的做法则是使用内置函数 print(),来将字符串打印在屏幕上。例如我们输入:print('Hello, world!') 回车,可以看到 print() 函数打印的字符串没有了引号,只有字符串本身的样子。

我们再试试输入 print('''README(回车,然后)

Line 1(回车)

Line 2(回车)

Line 3(回车,然后结束字符串,并且补上右括号)

'''),回车。

可以看到 Python 正确打印了我们输入的字符串。对比一下,我们发现 Shell 给我们展示的字符串里面虽然没能正确展示换行,但该换行的位置上都有一个\n。实际上,这里的 \n 就代表了换行符号,用 print() 函数来打印字符串才能直观地看到使用它们的效果。

在理解换行符号之前,可乐先带大家来理解一下字符。所谓的字符串,实际上就是字符连成的串而已。那么什么是字符呢?我们上面的例子里,H, e, l, l, o, 逗号, 空格, w, o, r, l, d, 叹号,这些都是字符;此外我们的猜数字游戏代码里,使用到的这些汉字、标点也都是字符。

概括的说,字符包括英文字母、数字、标点符号,以及其他语言字母、符号、汉字、假名等,甚至还有大名鼎鼎的 Emoji,它们也都是字符;除了这些看得见的字符,还有空白符、制表符、换行符、回车符等等看起来只是空白的字符;此外还有很多根本看不见的字符,它们被称作控制字符。

在计算机的世界里,字符实际上都是用数字表示的,字符和对应的数字之间的映射关系称作编码。世界上最著名的编码之一当然要数 ASCII 了。ASCII 编码经常以表格的形式展示,称作 ASCII 码表。ASCII 是美国信息交换标准代码的英文缩写,当前版本的 ASCII 编码中包含 128 个字符,而其中只有 95 个字符是可见字符,还有 33 个不可见的控制字符,它们多数都已经被废弃。

在 ASCII 编码中,每个字符对应一个 0 ~ 127 总共 128 个数字。例如大写字母 A 对应的 ASCII 编码是十进制数字 65,也就是十六进制 0x41,或者二进制数字 0b01000001。Python 提供了两个内置函数 ord() 和 chr() 来进行字符和编码之间的转换,我们在 Python Shell 里试一下:

输入 ord('A'),回车,结果是 65;

输入 chr(65),回车,Python 帮我们找到了大写字母 A;

输入 ord('0'),回车,结果是 48,也就是字符 0 在计算机中用数字 48 来表示;

我们再来看一下空白字符。输入空格 ord(' '),回车,结果是 32;输入反斜线字母n ord('\n'),回车,结果是 10。这里,\n 是一个单独的字符,代表换行,除了它还有 \t 表示横向制表符, \r 表示回车符等其他空白字符,和前面我们见到的 \' 类似,都是转义字符。由于 \ 用于标记转义,所以如果要在字符串中表示 \ 本身,就得输入 \\;如果要表示两个 \\,那就需要输入 \\\\。

如果字符串本身包含很多这样的 \,输入起来可能会很不方便。Python 提供了一种叫做 RAW 字符串的写法,在 RAW 字符串中出现的 \ 不会被认作是转义符,例如:我们输入:r'\\\n',前面多了一个 r,这就是一个 RAW 字符串,它表示三个 \ 和一个 n。回车,我们看到 Python 将它转换成了普通字符串的写法,里面的每一个 \ 都需要用两个 \ 来表示。

ASCII 的 95 个可见字符显然是个很小的集合,ASCII 编码里面塞进去英文大小写字母、数字以及一些标点符号之后,就已经满了。我们上面已经看到 Python 还能显示汉字和汉字标点,这世界上还有西欧字母、假名、阿拉伯字母等等许多符号,ASCII 编码对于表示这些字符就无能为力了。

早些时候存在很多其他的编码表来表示各种额外字符,多数都是对 ASCII 的扩充,但基本互相不兼容,于是就出现了一些混乱。例如用一种编码来编码一篇文章,也就是把这篇文章的字符对应的数字一一存储在电脑上;之后必须还用这个编码来解码,才能把数字翻译成正确的字符显示出来;如果用错了编码,同样的数字序列就可能被翻译成乱七八糟的样子了,这就叫做乱码。

经过了数年混乱,我们现在已经非常幸运地拥有了“全宇宙统一的编码”(哈哈,这当然是个开玩笑的说法),它就是 Unicode 编码。这个 Unicode 很厉害,它除了兼容了 ASCII 编码之外,还把世界上大部分的文字系统都扩充了进来,甚至还有可爱的 Emoji。更加幸运的是,Python 3 默认就使用 Unicode 编码来编码内部的字符串,因此在 Python 3 中可以直接输入和使用世界上绝大多数文字,甚至你都可以用汉字来命名变量,但是可乐强烈不建议你这么做。

和 ASCII 一样,Unicode 编码是从字符到数字的映射关系,并且 Unicode 还兼容 ASCII。也就是说在 ASCII 编码里面 65 代表大写字母 A,在 Unicode 里也是如此;而大于 127 的数字在 ASCII 编码里没有使用,Unicode 则用这些数字定义了更多的字符。前面我们讲到的 ord() 和 chr() 两个内置函数也可以用于 Unicode 字符和其编码数字的转换,例如:

输入 ord('王'),回车,我们看结果是 29579;而输入 chr(29579),回车,我们又能找到这个数字对应的 Unicode 字符是王可乐的王。

既然字符串在计算机内部是用数字表示的,那么比较字符串大小就很方便了。比较字符串的需求在生活中也很常见,我们需要对字典里的单词排序,需要对客户名单进行排序,对用户出生日期进行排序等。

字符串比较的基础是字符比较,而字符的比较就是比较代表字符的数字编码。例如大写 A 的编码是 65,而大写 B 的编码是 66,那么我们说 'A'

比较字符串的规则也很简单,就是从前往后逐一对比字符的大小,直到分出胜负,或者一方没有字符了为止。例如我们比较 'abcde' 和 'abdce' 两 个字符串,从前往后看,前两位 a, b 都是一样的,到了第三位 'c' 'abcd'。

因为 ASCII 表中西文字母都是按照顺序排列的,因此这种字符串比较得到的顺序也就是字典序。由于汉字这种字符没有字母这种天然的顺序,因此对汉字的这种排序并不常见。

好了,本节课的内容我们就先介绍到这里。通过这节课的内容,我们了解了字符串的概念,并且了解了字符和字符在计算机中的表示方法,知道了 ASCII 和 Unicode 这两个重要的字符编码。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G0TWKX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券