习题 10: 那是什么?

在习题 9 中我你接触了一些新东西。我让你看到两种让字符串扩展到多行的方法。第一种方法是在月份之间用 \n (back-slash n )隔开。这两个字符的作用是在该位置上放入一个“新行(new line)”字符。

使用反斜杠 \ (back-slash) 可以将难打印出来的字符放到字符串。针对不同的符号有很多这样的所谓“转义序列(escape sequences)”,但有一个特殊的转义序列,就是 双反斜杠(double back-slash) \\ 。这两个字符组合会打印出一个反斜杠来。接下来我们做几个练习,然后你就知道这些转义序列的意义了。

另外一种重要的转义序列是用来将单引号 ' 和双引号 " 转义。想象你有一个用双引号引用起来的字符串,你想要在字符串的内容里再添加一组双引号进去,比如你想说"I "understand" joe.",Python 就会认为 "understand" 前后的两个引号是字符串的边界,从而把字符串弄错。你需要一种方法告诉 python 字符串里边的双引号不是真正的双引号。

要解决这个问题,你需要将双引号和单引号转义,让 Python 将引号也包含到字符串里边去。这里有一个例子:

"I am 6'2\" tall."  # 将字符串中的双引号转义
'I am 6\'2" tall.'  # 将字符串种的单引号转义

第二种方法是使用“三引号(triple-quotes)”,也就是 """,你可以在一组三引号之间放入任意多行的文字。接下来你将看到用法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
tabby_cat = "\tI'm tabbed in."
persian_cat = "I'm split\non a line."
backslash_cat = "I'm \\ a \\ cat."

fat_cat = """
I'll do a list:
\t* Cat food
\t* Fishies
\t* Catnip\n\t* Grass
"""

print tabby_cat
print persian_cat
print backslash_cat
print fat_cat

你应该看到的结果

注意你打印出来的制表符,这节练习中的文字间隔对于答案的正确性是很重要的。

$ python ex10.py
	I'm tabbed in.
I'm split
on a line.
I'm \ a \ cat.

I'll do a list:
	* Cat food
	* Fishies
	* Catnip
	* Grass

$

转义序列

下面列出了 Python 支持的所有转义序列。很多你也许不会用到,不过还是要记住它们的格式和功能。试着在字符串中应用它们,看看它们的功能。 +—————-+————————————————————-+ | 转义符 | 功能 | +================+=============================================================+ | \\ | Backslash () 反斜杠 | +—————-+————————————————————-+ | \' | Single quote (‘) 单引号 | +—————-+————————————————————-+ | \" | Double quote (”) 双引号 | +—————-+————————————————————-+ | \a | ASCII Bell (BEL) 响铃符 | +—————-+————————————————————-+ | \b | ASCII Backspace (BS) 退格符 | +—————-+————————————————————-+ | \f | ASCII Formfeed (FF) 进纸符 | +—————-+————————————————————-+ | \n | ASCII Linefeed (LF) 换行符 | +—————-+————————————————————-+ | \N{name} | Unicode 数据库中的字符名,其中 name 就是它的名字(Unicode only) | +—————-+————————————————————-+ | \r ASCII | Carriage Return (CR) 回车符 | +—————-+————————————————————-+ | \t ASCII | Horizontal Tab (TAB) 水平制表符 | +—————-+————————————————————-+ | \uxxxx | 值为 16 位十六进制值 xxxx 的字符(Unicode only) | +—————-+————————————————————-+ | \Uxxxxxxxx | 值为 32 位十六进制值 xxxx 的字符(Unicode only) | +—————-+————————————————————-+ | \v | ASCII Vertical Tab (VT) 垂直制表符 | +—————-+————————————————————-+ | \ooo | 值为八进制值 ooo 的字符 | +—————-+————————————————————-+ | \xhh | 值为十六进制数 hh 的字符 | +—————-+————————————————————-+

试着运行下面一段代码看看结果:

while True:
    for i in ["/","-","|","\\","|"]:
        print "%s\r" % i,

加分习题

  1. 把这些转义字符记录到卡片上,并记住它们的含义。
  2. 使用 ''' (三个单引号)取代三个双引号,看看效果是不是一样的?
  3. 将转义序列和格式化字符串组合到一起,创建一种更复杂的格式。
  4. 记得 %r 格式化字符串吗?使用 %r 搭配单引号和双引号转义字符打印一些字符串出来。 将 %r 和 %s 比较一下。 注意到了吗?%r 打印出来的是你作为程序员写在脚本里的东西,而 %s 打印的是你作为用户应该看到的东西。

常见问题回答

我还没完全搞明白上一习题,我可以继续吗?
可以,继续向下看,看完一部分后回头看自己以前在笔记本上记下来的不懂的知识点,看是不是已经明白了。有时你可能还需要回到前面的练习中重新复习一遍。
\\ 和别符号相比的有什么特别之处吗?
并无特别,这样只是为了输出一个反斜杠 (\),想想为什么要把它写成两杠。
///n 怎么不灵?
因为你用了斜杠 / 而不是反斜杠 \,它们是不一样的字符,功能也完全不同。
使用了 %r 后转义序列都不灵了。
因为 %r 打印出的是你写到代码里的原始字符串,其中会包含原始的转义字符。你应该使用 %s,记住这条:``%r`` 用作 debug,``%s`` 用作显示。
加分习题 #3 说是要组合什么的,是什么意思?
我想让你明白的一点是,所有这些习题中教你的东西都可以组合起来帮你解决问题。把你学过的格式化字符串的知识和你新学到的转义字符的只是组合起来,写一些代码。
'''""" 哪个好?
风格问题。现在你就用 ''' 吧,以后碰到再说。有时候用某一种可能会更美观,有时候你要遵循之前的写法从而让整个项目代码风格一致,看具体情况吧。

Project Versions

Table Of Contents

Previous topic

习题 9: 打印,打印,打印

Next topic

习题 11: 提问

This Page