Kodewick
第 4 课,共 31 课目录

字符串

第 4 课,共 31 课 · 第 1 部分 · 基础 · 约 15 分钟

字符串就是一段文字:一个名字、门牌上的字、一整封信。从第 1 课起你就在显示字符串了,这一课学怎么把它拆开、再拼起来。

拼接和重复

+ 把两个字符串首尾接起来;* 把一个字符串重复几次。

main.py
1first = "灯火"2second = "小镇"3print(first + second)4print(first + " " + second)5print("-" * 20)6print("哈" * 3)
输出
灯火小镇
灯火 小镇
--------------------
哈哈哈

+ 自己不会加空格,要空格就自己加,像第二行那样。+ 两边都得是字符串:"灯 " + 3 会报 TypeError,要写成 "灯 " + str(3),或者用 f-string。

有多长

len() 数字符串里有几个字符。空格和标点也算,一个汉字算一个。

main.py
1word = "点灯人"2print(len(word))3print(len("你好,世界!"))4print(len(""))
输出
3
6
0

"" 是空字符串:里面什么也没有,长度是 0。

一个一个字符地取

每个字符都有一个位置编号,叫下标。下标从 0 开始数。负数从后往前数:-1 是最后一个字符。

字符灯火小镇
下标0123
从后往前-4-3-2-1
main.py
1name = "灯火小镇"2print(name[0])3print(name[3])4print(name[-1])5print(name[4])
输出
灯
镇
镇
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    print(name[4])
IndexError: string index out of range

发生了什么: 下标超出范围了:这里面没有那么多个。别忘了下标从 0 开始数。

"灯火小镇" 有 4 个字符,最后一个的下标是 3。取 name[4] 就报 IndexError。想要任何字符串的最后一个字符,用 [-1] 比先算长度省事。

切片

text[开始:结束] 取出字符串的一段:从「开始」取到「结束」,不包括「结束」那一个。不写「开始」就从头取,不写「结束」就取到最后。

main.py
1text = "欢迎来到灯火小镇"2print(text[0:4])3print(text[4:6])4print(text[:4])5print(text[4:])6print(text[-2:])
输出
欢迎来到
灯火
欢迎来到
灯火小镇
小镇

可以这样想:数字指的是字符之间的缝。[0:4] 在第 0 条缝和第 4 条缝各切一刀,中间剩 4 个字符。而且 text[:4] + text[4:] 拼起来,永远是原来的整句。

先猜一猜

这段代码显示什么?

1word = "春夏秋冬"2print(word[1:3])

单个下标会越界报错,切片不会。超过结尾,只是取到的少一点,或者是个空字符串。

步长和反转

第三个数是步长:[::2] 每隔一个取一个。步长是 -1 就从后往前走,字符串就倒过来了。

main.py
1digits = "0123456789"2print(digits[::2])3print(digits[1::2])4print("我爱点灯"[::-1])
输出
02468
13579
灯点爱我

[::-1] 是 Python 里反转字符串的常用写法,读作「整个,倒着来」。

字符串不能改

字符串里的哪个字符都能读,但不能就地换掉一个:

main.py
1name = "灯火小镇"2name[0] = "烟"
输出
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    name[0] = "烟"
TypeError: 'str' object does not support item assignment

发生了什么: 类型不对:拿了一种东西去做另一种东西才能做的事。

字符串是不可变的:做出来以后就不会变。想「改」一个字符串,就用几段拼出一个新的,再存回同一个名字:

main.py
1name = "灯火小镇"2name = "烟" + name[1:]3print(name)
输出
烟火小镇

特殊字符和长文字

第 1 课的反斜杠写法在所有字符串里都能用:\n 换行,\t 制表符,\" 引号。一个 \n 算一个字符。要写好几行的文字,用三个引号更方便:一直到后面的三个引号为止,换行和空格都原样保留。

main.py
1print(len("a\nb"))2sign = """灯火街3  7 号"""4print(sign)
输出
3
灯火街
  7 号

小技巧: 三引号字符串也是 Python 程序员在程序开头写长说明的方式。讲函数的时候还会见到它。

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。

练习 1

姓和名

用下标和切片,把 full 分成姓和名,中间隔一个空格显示。

要显示
林 小雨
exercise1.py
1full = "林小雨"2print(full)
输出
点「运行」或按 Ctrl+Enter
练习 2

倒过来

把 word 倒过来显示。

要显示
水来自海上
exercise2.py
1word = "上海自来水"2print(word)
输出
点「运行」或按 Ctrl+Enter
练习 3

卡号尾号

只显示卡号的最后四位,放进下面这句话里。

要显示
尾号 3316 的卡
exercise3.py
1card = "4921 7734 0058 3316"2print("尾号", card, "的卡")
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • + 拼接字符串,* 重复;数字要先转换。
  • len() 数有几个字符;"" 是空字符串。
  • text[0] 是第一个字符,text[-1] 是最后一个;超出范围报 IndexError。
  • text[开始:结束] 切片,不包括「结束」那一个;两头都可以不写。
  • text[::-1] 把字符串倒过来。
  • 字符串不能改:要拼一个新的,而不是改其中一个字符。
  • 三引号能写跨好几行的字符串。