0°

自学是门手艺—字符串(1)

字符串

在任何一本编程书籍之中,关于字符串的内容总是很长 —— 就好像每本英语语法书中,关于动词的内容总是占全部内容的至少三分之二。这也没什么办法,因为处理字符串是计算机程序中最普遍的需求 —— 因为程序的主要功能就是完成人机交互,人们所用的就是字符串而不是二进制数字。

在计算机里,所有的东西最终都要被转换成数值。又由于计算机靠的是电路,所以,最终只能处理 1 和 0,于是,最基本的数值是二进制;于是,连整数、浮点数字,都要最终转换成二进制数值。这就是为什么在所有编程语言中 1.1 + 2.2 并不是你所想象的 3.3 的原因。

因为最终所有的值都要转换成二进制 —— 这时候,小数的精度就有损耗,多次浮点数字转换成二进制相互运算之后再从二进制转换为十进制之后返回的结果,精度损耗就更大了。因此,在计算机上,浮点数字的精度总有极限。有兴趣进一步可以看看关于 decimal 模块的文档

字符串也一样。一个字符串由 0 个字符或者多个字符构成,它最终也要被转换成数值,再进一步被转换成二进制数值。空字符串的值是 None,即便是这个 None —— 也最终还是要被转换成二进制的 0。

字符码表的转换

很久以前,计算机的中央处理器最多只能够处理 8 位二进制数值,所以,那时候的计算机只能处理 256 个字符,即,28 个字符。那个时候计算机所使用的码表叫 ASCII。现在计算机的中央处理器,大多是 64 位的,所以可以使用 264 容量的码表,叫做 Unicode。随着多年的收集,2018 年 6 月 5 日公布的 11.0.0 版本已经包含了 13 万个字符 —— 突破 10 万字符是在 2005 年[1]

把单个字符转换成码值的函数是 ord(),它只接收单个字符,否则会报错;它返回该字符的 unicode 编码。与 ord() 相对的函数是 chr(),它接收且只接收一个整数作为参数,而后返回相应的字符。ord() 接收多个字符的话会报错。

字符串的标示

标示一个字符串,有 4 种方式,用单引号、用双引号,用三个单引号或者三个双引号:

‘Simple is better than complex.’#用单引号

‘Simple is better than complex.’

“Simple is better than complex.”#用双引号

‘Simple is better than complex.’

#用三个单引号。注意输出结果中的 \n

#这个字符串,看起来是两行,保存在内存或者变量之中的时候,

#是一整串,其中的换行是用 \n 表示的。

”’

Simple is better than complex.

Complex is better than complicated.

”’

‘\nSimple is better than complex.\nComplex is better than complicated.\n’

#用三个双引号。注意输出结果中的 \n

“””

Simple is better than complex.

Complex is better than complicated.

“””

‘\nSimple is better than complex.\nComplex is better than complicated.\n’

print(

“””

Simple is better than complex.

Complex is better than complicated.

“””

)#用 print() 输出的时候,\n 就是不可见字符,字符串本身如下:

#’\nSimple is better than complex.\nComplex is better than complicated.\n’

#其中的 \n 被打印出来的时候显示成换行

Simple is better than complex.

Complex is better than complicated.

字符串与数值之间的转换

由数字构成的字符串,可以被转换成数值,转换整数用 int(),转换浮点数字用 float()。

与之相对,用 str(),可以将数值转换成字符串类型。

注意,int() 在接收字符串为参数的时候,只能做整数转换。下面代码最后一行会报错:

input() 这个内建函数的功能是接收用户的键盘输入,而后将其作为字符串返回。它可以接收一个字符串作为参数,在接收用户键盘输入之前,会把这个参数输出到屏幕,作为给用户的提示语。这个参数是可选参数,直接写 input(),即,没有提供参数,那么它在要求用户输入的时候,就没有提示语。

以下代码会报错,因为 age < 18 不是合法的逻辑表达式,因为 age 是由 input() 传递过来的字符串;于是,它不是数字,那么它不可以与数字比较……

要改成这样才可能行: 为什么是可能行而不是一定行?如果用户 input 键盘输入的是 eighteen 或者 十八 等,依然会导致 int() 失败并得到 ValueError 的报错。用户输入的不可控,可能会导致千奇百怪的报错。但在这里,我们先简化处理,在引导语中加入一个正确的示例并默认用户会按引导语正确输入。

注意:如果你用来浏览当前 .ipynb 文件的是那个桌面 App Nteract,它目前不支持 input() 这个函数的调用……

转义符

有一个重要的字符,叫做 “转义符”,\,也有的地方把它称为 “脱字符”,因为它的英文原文是 Escaping Character。它本身不被当作字符,你要想在字符串里含有这个字符,得这样写 \\:

上面这一行报错信息是 SyntaxError: EOL while scanning string literal。这是因为 \’ 表示的是单引号字符 ‘(Literal)—— 是可被输出到屏幕的 ‘,而不是用来标示字符串的那个 ‘ —— 别急,无论哪个初学者第一次读到前面的句子都觉得有点莫名其妙…… —— 于是,Python 编译器扫描这个 “字符串” 的时候,还没找到标示字符串末尾的另外一个 ‘ 的时候就读到了 EOL(End Of Line)。

如果你想输出这么个字符串,He said, it’s fine.,如果用双引号扩起来 ” 倒没啥问题,但是如果用单引号扩起来就麻烦了,因为编译器会把 it 后面的那个单引号 ‘ 当作字符串结尾。

于是你就得用转义符 \:

转义符号 \ 的另外两个常用形式是和 t、n 连起来用,\t 代表制表符(就是用 TAB ⇥ 键敲出来的东西),\n 代表换行符(就是用 Enter ⏎ 敲出来的东西)。

由于历史原因,Linux/Mac/Windows 操作系统中,换行符号的使用各不相同。Unix 类操作系统(包括现在的 MacOS),用的是 \n;Windows 用的是 \r\n,早期苹果公司的 Macintosh 用的是 \r(参见 Wikipedia: Newline)。

所以,一个字符串,有两种形式,raw 和 presentation,在后者中,\t 被转换成制表符,\n 被转换成换行。

在写程序的过程中,我们在代码中写的是 raw,而例如当我们调用 print() 将字符串输出到屏幕上时,是 presentation

以后有时间去看看这两个内建函数,能了解更多细节:

ascii(objecthttps://docs.python.org/3/library/functions.html#ascii

repr(objecthttps://docs.python.org/3/library/functions.html#repr

字符串的操作符

字符串可以用空格 ‘ ‘ 或者 + 拼接:

‘Hey!’+”+’You!’#使用操作符 +

‘Hey! You!’

‘Hey!”You!’#空格与 + 的作用是相同的。

‘Hey!You!’

字符串还可以与整数倍操作符 * 操作,’Ha’ * 3 的意思是说,把字符串 ‘Ha’ 复制三遍:

‘Ha’*3

‘HaHaHa’

‘3.14’*3

‘3.143.143.14’

字符串还可以用 in 和 not in 操作符 —— 看看某个字符或者字符串是否被包含在某个字符串中,返回的是布尔值:

‘o’in’Hey, You!’

True

本文转载自笑来老师的GitHub:https://github.com/AliceGuoatGithub/the-craft-of-selfteaching/blob/master/markdown/Part.1.E.5.strings.md

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!