Hi 大家好,我是王可乐。上一节课里,可乐和大家一起学习了字符串的概念,以及字符和它们在计算机中的数字表示,知道了什么是 ASCII 编码和 Unicode 编码。今天的课程里,可乐来带领大家看一下 Python 中是如何使用字符串的。
上一节课我们已经看到过,使用单引号或者双引号可以创建一个字符串,引号内书写合法的字符或者转义字符即可。字符串可以作为值被赋予给变量,例如我们定义变量 greeting,并赋值为字符串 Hello。
我们知道,字符串是前后相连的一串字符,那么自然地字符串有长度的概念。可以用内置函数 len() 来计算字符串的长度,例如:我们输入 len(greeting),回车。可以看到这个字符串的长度为 5 个字符,我们看到 Hello 确实由五个字符组成。
我们可以通过下标来引用字符串中的字符,下标也就是字符在字符串中的位置,在计算机的世界里,我们以 0 开头来计数。例如 'Hello'[0],就是字符 H;
代码中更常见的是使用变量名,我们来看一下:greeting[0],回车,是 H;greeting[1],回车,是 e;greeting[4],回车,是 o。这个字符串有五个字符,因此下标最多到 4,如果下标写太大了呢?我们来看一下,输入:greeting[5],回车。Python 告诉我们出现了一个 IndexError,下标超出了允许的范围。
在 Python 中还允许使用负数下标,作用是从后向前来访问字符。例如我们输入 greeting[-1],回车,结果是 o;greeting[-2] 是 l;greeting[-5] 是大写 H;而如果输入 greeting[-6],同样 Python 告诉我们出现了 IndexError,这里负数下标最多到 -5,而 -6 超出了允许的范围。
了解了下标的用法,我们来看一下字符串截取,也就是从字符串中截取出来一部分,得到一个新的字符串。实际上我们使用单独的下标来取出单个字符,就是一种特殊的字符串截取,截取出来的也是一个新字符串,只是长度为一。我们也可以来截取长一点的新字符串,例如:输入 greeting[1:4],回车,我们得到的新字符串为 'ell'。
字符串截取时,我们使用两个数字,第一个数字是开头,就是 Hello 的 1 号,也就是第二个字符 e;而第二个数字则是结尾加一,我们看到 Hello 的 4 号,也就是第五个字符是 o,新截取出来的字符不包含这个 o,而是只到前一位的 l。换句话说,字符串截取用的下标是个前闭后开的区间。
截取字符串也可以使用负数下标,例如我们输入 greeting[1:-1],回车,仍然得到了 'ell'。规则还是一样的,截取范围从前一个数字下标所在的字符开始,到后一个下标所在的字符之前。如果前后两个数字下标指向同一个字符,例如(输入) greeting[2:2],那么我们只能截取到一个空字符串;或者后一个下标指向的字符比前一个下标指向的字符还要靠前,例如(输入) greeting[2:1],也是只能得到一个空字符串。
截取字符串时,冒号前后的两个数字可以省略。例如我们输入 greeting[1:],省略后面的下标,那么 Python 会为我们一直截取到最后一个字符;如果省略前一个下标,例如 greeting[:4],意思是从字符串开头开始截取,于是我们得到了 Hell;按照这个规则,我们试一下 greeting[:],不使用下标,回车,最后得到的就是整个字符串了。
此外,截取字符串使用的下标还有可能超出字符串长度范围。例如冒号后面的下标大于字符串长度时,greeting[1:100],Python 就帮我们截取到字符串的最后一个字符为止,也就是 ello;再例如冒号前面的下标小于负数最小的下标时,greeting[-100:4],Python 只能从字符串开头来截取,我们还是得到 Hell 这个新字符串。
在 Python 语言中,也有一些操作字符串的操作符。例如 + 号,我们知道,对于 Python 中的数字,+ 号表示将前后两个数字相加,得到一个新的数字,例如 1 + 1 回车,得到数字 2;而对于字符串,我们也可以使用 + 号操作符,只是对于字符串来说,+ 号的功能是将前后两个字符串连接起来生成一个新的字符串。例如我们输入 'Hello' + 'Python',回车,就能得到一个新的字符串 'HelloPython'。
类似的,* 号操作符也可以用于字符串操作。和数字乘法不同,* 号操作符用于字符串时,前面是一个字符串,后面则必须是一个 int 类型的整数。例如我们输入 'Hello' * 3,就能得到一个新的字符串 'HelloHelloHello',也就是重复了 3 遍的 Hello。
另外还有一个我们还没有见过的操作符,叫做 in。in 是 Python 的关键字,在很多地方都有特殊的含义,因此不能使用 in 作为变量名字哦。用在字符串上,in 操作符用于判断前面的字符串是否是后面字符串的子串。例如我们输入 'H' in 'Hello',回车,得到 True;类似的输入 'a' in 'Hello',回车,得到的是 False;in 前面的字符串不一定必须是单个字符,例如输入 'll' in 'Hello',也是返回 True;而输入 'Ho' in 'Hello',尽管 'H' 和 'o' 都在字符串 'Hello' 里面,但是 'Ho' 却不是 'Hello' 的子串,因此返回 False。
类似的还可以使用操作符 not in,它和 in 的用法一样,只是返回结果相反。例如 'H' not in 'Hello',回车,返回 False,因为 'H' 是 'Hello' 的字串,因此 not in 不成立。
除了操作符,Python 还提供了丰富的标准函数来操作字符串。这些函数非常多,可乐建议大家在课后查阅一下 Python 的文档,了解一下都有哪些操作可以使用。下面可乐先给大家介绍几个常用的标准函数。
我们已经见过如何获得一个字符串的长度,它使用内置函数 len(),例如 len('Hello'),我们得到结果是 5。
另一组有用的函数是 startswith() 和 endswith(),它们和 len() 略有不同。实际上,len() 是 Python 的内置函数,而 startswith() 和 endswith() 则是方法。不过你现在不用担心什么是函数或者什么是方法,只需要知道存在这样的一些操作即可。在后面的课程中,可乐还会为你深入的讲解,让你能够更深刻地理解这些概念。
我们还是用实例演示一下,输入 'Hello'.startswith('He'),回车,返回 True;输入 'Hello'.startwith('H'),还是返回 True;输入 'Hello'.startwith('o'),这次返回 False。在这里,startswith() 用来判断括号里面的字符串是否是点号前面字符串的开头;endswith() 的用法也是类似的,只是它用来判断括号里的字符串是否是前面字符串的结尾。当然,这两个函数还有其他的用法,等你学习了可乐后面的课程,理解了函数的概念,就可以从 Python 的文档中解读出来这些函数的用法了。
我们再来看一个函数 count()。先演示一下,输入 'Hello'.count('l'),回车,得到 2。它的意思是在 Hello 这个字符串里,l 这个字符串出现了两次;再比如我们输入 'Hello'.count('He'),你应该可以猜到,结果是 1;而如果括号里的字符串并没有在前面的字符串里出现过,例如 'Hello'.count('a'),如你所见,结果就是 0 了。
我们再来看一个函数 join()。这个函数复杂一点,我们还是从例子入手:输入 ';'.join(['a', 'b', 'c']),回车,我们得到了一个新的字符串,就是以分号分隔的 a, b 和 c。在这个语句里,函数的圆括号里面是一个叫做列表的东西,我们会在后面的课程里为大家介绍它。现在你只需要知道列表里包含了三个字符串 'a', 'b' 和 'c',而 join() 函数则将它们连接起来,并且在中间插入点号前面指定的字符串作为分隔符。
最后,可乐再为大家介绍另一个函数 format()。还是先看一个例子:输入 '生命、宇宙以及一切的终极答案是 {}。'.format(42),回车。可以看到,Python 用 42 替换了前面字符串里的一对 {},得到了一个新的字符串。这种操作叫做格式化字符串,简单说就是将括号里的内容,也叫参数,替换到 {} 所在的位置。不过,format() 的功能远远不止这么简单,我们再看一个例子:
首先我们定义三个变量,输入 a = 2, b = 3, c = 7,然后输入 ', and '.format(a, b, c),回车,我们得到字符串 '2, 7 and 3'。可以看到,我们在 format() 的括号里使用了变量作为参数,而且可以使用任意多个参数;此外,在 format() 前面字符串的 {} 里,我们用编号来指定了这个位置应该放入第几个参数。
除了使用编号,还可以使用名字来指定要替换的参数,例如:输入 ', and '.format(first=a, second=c, third=b),回车。我们得到了和上面一样的结果。
除了指定替换的参数,花括号里还可以指定替换参数所使用的格式。例如,控制浮点数的小数点位数:输入 a = 74 / 13,回车,我们得到了一个很长的小数;然后,输入 '答案是 {:.2f}'.format(a),回车,可以看到,输出的结果中小数点后只保留了两位。在这里,{} 内的 :.2f 控制了变量 a 在最终字符串中的展示方式。
format() 函数支持非常丰富和精细的格式控制,大家在我们后面的课程中还会看到,要了解比较全面的格式控制方法,大家也可以自行查阅 Python 文档。
好了,本节课的内容我们就先介绍到这里。看完本节课的内容,可乐希望大家在 Python 的文档中查找一下字符串操作相关的标准函数。除了可乐提到过的之外,建议大家了解一下例如 find(), index(), isalnum(), isalpha(), isdigit(), isnumeric(), isdecimal(), strip(), replace(), translate() 等常用的函数。此外,大家还可以从文档中查找一下 format() 函数的其他用法,以及字符串格式化的另一种方法——使用 %,作为对本节课内容的补充。那么,这节课的内容就到这里,我们下期见咯。
往期课程:
《0基础学Python之三:数字运算(上)》
《0基础学Python之四:数字运算(下)》
《0基础学Python之五:字符串(上)》
领取专属 10元无门槛券
私享最新 技术干货