习题 10: 那是什么? *************************** 在习题 9 中我你接触了一些新东西。我让你看到两种让字符串扩展到多行的\ 方法。第一种方法是在月份之间用 ``\n`` (back-slash ``n`` )隔开。这两个字符的作用是\ 在该位置上放入一个“新行(new line)”字符。 使用反斜杠 ``\`` (back-slash) 可以将难打印出来的字符放到字符串。针对不同的符号\ 有很多这样的所谓“转义序列(escape sequences)”,但有一个特殊的转义序列,就是 ``双反斜杠(double back-slash)`` ``\\`` 。这两个字符组合会打印出一个反斜杠来。接下来我们做几个练习,然后你就知道这些转义序列的意义了。 另外一种重要的转义序列是用来将单引号 ``'`` 和双引号 ``"`` 转义。想象你有一个用\ 双引号引用起来的字符串,你想要在字符串的内容里再添加一组双引号进去,比如你想说\ ``"I "understand" joe."``\,Python 就会认为 ``"understand"`` 前后的两个引号是字符串\ 的边界,从而把字符串弄错。你需要一种方法告诉 python 字符串里边的双引号不是真正\ 的双引号。 要解决这个问题,你需要将双引号和单引号转义,让 Python 将引号也包含到字符串里边去。这里\ 有一个例子: .. code-block:: python "I am 6'2\" tall." # 将字符串中的双引号转义 'I am 6\'2" tall.' # 将字符串种的单引号转义 第二种方法是使用“三引号(triple-quotes)”,也就是 ``"""``\,你可以在一组三引号之间放入\ 任意多行的文字。接下来你将看到用法。 .. literalinclude:: ex/ex10.py :linenos: 你应该看到的结果 =================== 注意你打印出来的制表符,这节练习中的文字间隔对于答案的正确性是很重要的。 .. literalinclude:: ex/ex10.txt :language: console 转义序列 ================ 下面列出了 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 的字符 | +----------------+-------------------------------------------------------------+ 试着运行下面一段代码看看结果: .. code-block:: python 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 说是要组合什么的,是什么意思? 我想让你明白的一点是,所有这些习题中教你的东西都可以组合起来帮你解决问题。把你学过的格式化\ 字符串的知识和你新学到的转义字符的只是组合起来,写一些代码。 ``'''`` 和 ``"""`` 哪个好? 风格问题。现在你就用 ``'''`` 吧,以后碰到再说。有时候用某一种可能会更美观,有时候你要遵循\ 之前的写法从而让整个项目代码风格一致,看具体情况吧。